#author("2021-12-05T13:57:56+09:00","default:Real2Virtual202111","Real2Virtual202111")
#author("2021-12-05T16:40:45+09:00","default:Real2Virtual202111","Real2Virtual202111")
[[Real2Virtual202111]]

* CommandBuffer.cpp [#f82114a2]

#code(c){{

//#include "common.h"
#include "CommandBuffer.h"
#include "OutBuffer.h"
#include "InBuffer.h"
#include "StringQueue.h"
#include "mbed.h"
#include "Initialize.h" 


void setPortFunctions();
unsigned char getRegisterValue( int fid);
//CommandBuffer *commandBuffer;


void CommandBuffer::shift( int i){
    int j;
    if(i>p) return;
    for(j=0; j<p-i; j++){
        commandFaceID[j]=commandFaceID[j+i];
        buff[j]=buff[j+i];
    }
    p=p-i;
}

void CommandBuffer::putCommand( int fid, char *s){
   unsigned char i;
   /*
   char a[20];
   sprintf(a,"%d",fid);
   sputs("fid=");
   sputs(a);
   sputs("\n\r");
   */
   initBuffer();
   i=0;
   while(s[i]!=0){
      buff[p]=s[i];
      commandFaceID[p]=fid;
      p++;
      i++;
   }
   buff[p]=0;
}
void CommandBuffer::appendString( int fid, char *s){
   unsigned char i;
   /*
   char a[20];
   sprintf(a,"%d",fid);
   sputs("fid=");
   sputs(a);
   sputs("\n\r");
   */

   i=0;
   while(s[i]!=0){
      buff[(*this).p]=s[i];
      commandFaceID[(*this).p]=fid;
      p++;
      i++;
   }
   buff[p]=0;
//   sendCommand(fid,buff);
}

void CommandBuffer::putChar( int fid, unsigned char c){
     p=0;
   buff[p]=c;
   commandFaceID[p]=fid;
   p++;
   buff[p]=0;
    sendCommand(fid,buff);
}

void CommandBuffer::putInt(int fid, unsigned char i){
    char s[6];
    unsigned char p;
    p=5;
    s[p]=0;
    p--;
    s[p]='0';
    while(i!=0){
//        s[p]='0'+(i%10);
//        i=i/10;
        s[p]='0'+xmod(i,10);
        i=xdiv(i,10);
        if(p==0) break;
        p--;
    }
//    (*this).putCommand(this,fid, &(s[p]));
//    appendString(fid,s);
        sendCommand(fid,s);
}
/*
void strcpy(char *x, char *y){
    int i;
    for(i=0;i<CMax-1;i++){
        x[i]=y[i];
        if(y[i]==0) return;
    }
    x[CMax-1]=0;
}
*/
void CommandBuffer::setName( char *n){
    char *x, *y;
    x=myname;
    y=n;
    xstrcpy(x,y);
//  strcpy(x,y);
}

void CommandBuffer::initBuffer(void){
    p=0;
    buff[p]=0;
}

void CommandBuffer::setLock( unsigned char trueOrFalse){
    lock=trueOrFalse;
}
unsigned char CommandBuffer::isLocked(void){
    return lock;
}

void CommandBuffer::setUpFaceID( int i){
    UpFaceID=i;
}

int CommandBuffer::isBufferNull(void){
    return (p)<=0;
}

int CommandBuffer::startsWith( char *s){
    int p;
    p=0;
    while(s[p]!=0){
       if(s[p]!=buff[p]) return 0;
       p++;
    }
    return 1;
}

void CommandBuffer::startRecursiveReset(int UpFaceID){ // srr
        char rbuffer[32];
        unsigned char i;
        if(!resetFlag) return;
        resetFlag=0;
        for(i=0;i<FaceMax;i++){   // 各面について解析
            if(i!=UpFaceID){      // この面が上位ノードでなければ以下を実行
                if( (((char)0x80) &  faceID[i] ) == 0x00 ){ // 面 i が接続している場合
                    rbuffer[0]='r';
                    rbuffer[1]='e';
                    rbuffer[2]='s';
                    rbuffer[3]='e';
                    rbuffer[4]='t';
                    rbuffer[5]='0'+i;
                    rbuffer[6]=0;
//                  (*this).sendCommand(UpFaceID,rbuffer);
//                  (*this).sendCommand(i,"srr."); // 面 i に接続した dice で再び リセット。
                    sendCommand(UpFaceID,rbuffer);
                    sendCommand((int)i,"srr.");
                }
            }
        }
        resetBuffer(); // このdice を reset.
}


/*
parseUSB

*/


void CommandBuffer::put_error(int fid){
    sendCommand(fid,"error.\n\r");
}
/*
int strlen(char *x){
    int i;
    for(i=0;i<CMax;i++){
        if(x[i]==0) return i;
    }
    return 0;
}
*/
int isNumberLetter(unsigned char c){
    if(c<'0') return 0;
    if('9'<c) return 0;
    return 1;
}

int isA2FLetter(unsigned char c){
    if('A'<=c && c<='F') return 1;
    return 0;
}

int isa2fLetter(unsigned char c){
    if('a'<=c && c<='f')
        return 1;
    return 0;
}
int CommandBuffer::startsWithPInt( int *x){
    unsigned char c;
    int i,n;
    skipSpace();
    c=buff[0];
    if(!isNumberLetter(c)) return 0;
    n=0;
    for(i=0;i<CMax;i++){
        c=buff[i];
        if(isNumberLetter(c)){
            n=n*10+c-'0';
        }
        else
            break;
    }
    *x=n;
    return i;
}

int isHexLetter(unsigned char c){
    if(isA2FLetter(c)) return 1;
    if(isa2fLetter(c)) return 1;
    if(isNumberLetter(c)) return 1;
    return 0;
}

int CommandBuffer::startsWithHexDec( int *x){
    unsigned char c;
    int i,n;
    skipSpace();
    c=buff[0];
    if(!isHexLetter(c)) return 0;
    n=0;
    for(i=0;i<CMax;i++){
        c=buff[i];
        if(isNumberLetter(c)){
            n=n*16+c-'0';
        }
        else
        if(isa2fLetter(c)){
            n=n*16+c-'a'+10;
        }
        else
        if(isA2FLetter(c)){
            n=n*16+c-'A'+10;
        }
        else{
            break;
        }
    }
    *x=n;
    return i;
}

int CommandBuffer::startsWithStringConst( char *x){
    unsigned char c;
    int i,j,k;
    skipSpace();
    c=buff[0];
    if(!(c=='"')) return 0;
    j=0;
    k=1;
    for(i=0;i<CMax;i++){
        c=buff[k];
        if(c==0){
            return 0;
        }
        if(c=='"'){
            x[j]=0;
            return k+1;
        }
        if(c=='\\'){
            k++;
            c=buff[k];
            x[j]=c;
            j++;
        }
        else {
            x[j]=c;
            j++;
        }
        k++;

    }
    return k;
}


void CommandBuffer::skipSpace(void){
    while(startsWith(" ")){
        shift(1);
    }
}

void CommandBuffer::sendHelpMessage( int fid){
//  help message for sh7125
        sendCommand(fid,"\n\r");
        sendCommand(fid,"set port <p> <n> <value>.\n\r");
        sendCommand(fid,"...<p>=PE|PME|PB|PMB <n>=0|1|...|F.\n\r");
        sendCommand(fid,"...<value> is 0 or 1.\n\r");
        sendCommand(fid,".... if <p>=PME|PMB, 0 means output, \n\r");
        sendCommand(fid,"....                 1 means input.\n\r");
        sendCommand(fid,"set mem <n> 1  or set mem <n> 0.\n\r");
        sendCommand(fid,"  ...          <n>=(0|1|...|F)+.\n\r");
        sendCommand(fid,"ask port <p> <n>.\n\r");
        sendCommand(fid,"...<p>=PE|PME|PB|PMB <n>. <n>=0|1|...|F.\n\r");
        sendCommand(fid,"get port <p> <n>.\n\r");
        sendCommand(fid,"...<p>=PE|PME|PB|PMB <n>. <n>=0|1|...|F.\n\r");
        sendCommand(fid,"ask mem <n>.\n\r");
        sendCommand(fid,"  ...          <n>=(0|1|...|F)+.\n\r");
        sendCommand(fid,"get mem <n>.\n\r");
        sendCommand(fid,"  ...          <n>=(0|1|...|F)+.\n\r");
        sendCommand(fid,"set outface <n>.\n\r");
        sendCommand(fid,"set face <n> allLED <value>.\n\r");
        sendCommand(fid,"set face <n> led|dir <value>.\n\r");
        sendCommand(fid,"send face current <strconst>.\n\r");
        sendCommand(fid,"send face <n> <strconst>.\n\r");
        sendCommand(fid,"send root <n> <strconst>.\n\r");
        sendCommand(fid,"bcast face <n> <strconst>.\n\r");
        sendCommand(fid,"cq face <n> dir <value>.\n\r");
        sendCommand(fid,"ack1 face <n> dir <value> uDir <value>.\n\r");
        sendCommand(fid,"ack2 face <n> dir <value> uDir <value>.\n\r");
        sendCommand(fid,"h. or help. or ?\n\r");
        sendCommand(fid,"srs.  ... start recursive search.\n\r");
        sendCommand(fid,"srr.  ... start recursive reset.\n\r");
}

// int CommandBuffer::response2cq( int fid, char *n, int nextDoor, int nextDir){
 int CommandBuffer::response2cq( int fid, int nextDoor, int nextDir){
    int i;
    OutBuffer *ob;
    InBuffer *ib;
//  xstrcpy(myname,n);
    char s[CMax];
    char sn[10];
//  char w[100];
//  sprintf(w,"response2cq,fid=%d, nextDoor=%d nextDir=%d\n",fid,nextDoor,nextDir);
//  UART_puts(w);
    xputs("response2cq,fid=");xputd(fid);
//  xputs(",upName=");xputs(myname);
    xputs(", nextDoor=");xputd(nextDoor);
    xputs(" nextDir=");xputd(nextDir);xputs(".\n\r");
    if(fid<0) return 0;
    if(fid>=FaceMax) return 0;
    if(nextDoor<0) return 0;
    if(nextDoor>=FaceMax) return 0;
    if(nextDir<0) return 0;
    if(nextDir>=DirMax) return 0;
    faceID[fid]=nextDoor;
    dirID[fid]=nextDir;
  ib=faceIn[fid];
    (*ib).setConnected((unsigned char)1);
    
//  sprintf(w,"parameter check passed.\n");
//  UART_puts(w);
    xputs("parameter check passed.\n\r");
    ob=faceOut[fid];
//  (*ob).clear();
//    currentOutFace= ob;
//  for(i=0;i<DirMax;i++){
  i=nextDir;
        (*ob).waitUntilOutputDone();
        s[0]=0;
//      printf("dir=%d ",i);
        (*ob).setLedNumber((unsigned char)i);
        (*ob).setAllOrOne((unsigned char)0);
        strcat(s,"ack1 face ");
        sn[0]='0'+fid; sn[1]=0;
        strcat(s,sn);
        strcat(s," dir ");
        sn[0]='0'+(unsigned char)i; sn[1]=0;
        strcat(s,sn);
        strcat(s," uDir ");
        sn[0]='0'+nextDir; sn[1]=0;
        strcat(s,sn);
        strcat(s,".");
//      printf(" ..s=%s\n",s);
//      xputs(" ..s=");xputs(s);xputs("\n\r");
//      (*ob).putString(ob,s);
//      (*ob).putStringX(s);
    sendCommand(fid,s);
//  (*ob).waitUntilOutputDone();
//  }
    return 1;
}

int CommandBuffer::response2ack1( int fid, int nextDoor, int dir, int uDir){
//  int i;
  char rbuffer[MaxInterFaceStrLen];
    char rbuffer2[5];
    char cmd2next[60];  
    OutBuffer *ob;
    InBuffer *ib;

    xputs("this face(");xputd(fid);xputs("):dir(");xputd(uDir);
    xputs(")<-> next face(");xputd(nextDoor);xputs("):dir(");xputd(dir);xputs(")\n\r");
    if(fid<0) return 0;
    if(fid>=FaceMax) return 0;
    if(nextDoor<0) return 0;
    if(nextDoor>=FaceMax) return 0;
    if(dir<0) return 0;
    if(dir>=DirMax) return 0;
    if(uDir<0) return 0;
    if(uDir>=DirMax) return 0;
//  s[0]=0;
    faceID[fid]=nextDoor;
    dirID[fid]=dir;
    myDirID[fid]=uDir;
    ob=faceOut[fid];
    (*ob).clear();
//    currentOutFace= ob;
//    (*ob).waitUntilOutputDone();
    (*ob).setLedNumber((unsigned char)uDir);
    (*ob).setAllOrOne((unsigned char)0);
    ib=faceIn[fid];
    (*ib).setConnected((unsigned char)1);

    rbuffer[0]='\0';     // send up (this "<myame>" f<k>d<l> next "<downname>" f<k>d<l>)  を上位diceに伝える
    strcpy(rbuffer,"send up \"str (this ");
    strcat(rbuffer,myname);
    strcat(rbuffer," f");
    rbuffer2[0]=fid+'0';
    rbuffer2[1]='d';
    rbuffer2[2]=dirID[fid]+'0';
    rbuffer2[3]=' ';
    rbuffer2[4]=0;
    strcat(rbuffer,rbuffer2);
    strcat(rbuffer," next ");
    strcat(rbuffer,myname);
    rbuffer2[0]=faceID[fid]+'0';
    rbuffer2[1]=0;  
    strcat(rbuffer, rbuffer2);
    strcat(rbuffer," f");   
    strcat(rbuffer,rbuffer2);
    strcat(rbuffer,"d");
    rbuffer2[0]=dirID[fid]+'0';
    rbuffer2[1]=0;
    strcat(rbuffer,rbuffer2);
    strcat(rbuffer,")\".");
    printf("...%s\n\r",rbuffer);
    strcpy(cmd2next,"srs \"");
    strcat(cmd2next,myname);
    strcat(cmd2next,"\".");
     printf("...%s\n\r",cmd2next);
     (*ob).setPortXOff();
     sendCommand(UpFaceID,rbuffer);  
     (*ob).setAllOrOne((unsigned char)0);
     (*ob).setPortXOn();
     sendCommand(fid,cmd2next); // 面 i に接続した dice で再び 構造解析を開始する。     
     return 1;
}

int CommandBuffer::response2ack2( int fid, int nextDoor, int dir, int uDir){
//  int i;
//  struct outBuffer *ob;
//  char s[CMax];
//  char sn[10];
//  char w[100];
//    sprintf(w,"this face(%d):dir(%d)<-> next face(%d):dir(%d)\n",
//            fid,uDir, nextDoor,dir);
//    UART_puts(w);
    xputs("this face(");xputd(fid);xputs("):dir(");xputd(uDir);
    xputs(")<-> next face(");xputd(nextDoor);xputs("):dir(");xputd(dir);xputs(")\n");
    if(fid<0) return 0;
    if(fid>=FaceMax) return 0;
    if(nextDoor<0) return 0;
    if(nextDoor>=FaceMax) return 0;
    if(dir<0) return 0;
    if(dir>=DirMax) return 0;
    if(uDir<0) return 0;
    if(uDir>=DirMax) return 0;
//  s[0]=0;
//  (*this).faceID[fid]=nextDoor;
    dirID[fid]=dir;
    myDirID[fid]=uDir;
    return 1;
}

void CommandBuffer::interpretCommand( int fid){
    char s[CMax];
    int n,l,x;
    OutBuffer *cout;
    //asm("FSET I");                                        //【2】割り込み許可
    //if(cpld()<0) return;                                   // poling... cpld との情報交換処理。
//  sputs((*this).buff);
    if(isBufferNull()) return;
//  fid=(*this).commandFaceID[0];
    if(startsWith( "?")){
        sendHelpMessage(fid);
        return;
    }
    if(startsWith( "h.")){
        sendHelpMessage(fid);
        return;
    }
    if(startsWith( "help.")){
//      sputs("1.");
//      sputs("2.");
        sendHelpMessage(fid);
//      sputs("3.");
        return;
    }
    if(startsWith( "error.")){
//      sputs("1.");
//      sputs("2.");
//        printf("error.\n");
        xputs("error.\n");
//      sputs("3.");
        return;
    }
    if(startsWith( "srs.")){ //再帰的構造解析開始 (start recursive search)
        startRecursiveStructureSearch( fid,"s");
        return;
    }
    if(startsWith( "srs ")){ //再帰的構造解析開始 (start recursive search)
            shift(strlen("srs "));
            skipSpace();
            l=startsWithStringConst(s);
            if(l>0){
            startRecursiveStructureSearch( fid,s);
                }
                else{
                     put_error(fid);
                }
            return;
    }
    
    if(startsWith("srr.")){ //再帰的リセット (start recursive reset)
//      if(!FirstTime) return;
        UpFaceID=fid;
//      FirstTime=0;
        startRecursiveReset( fid);
        return;
    }
    if(startsWith("ask ")){
        shift(strlen("ask "));
        skipSpace();
        if(!getRegisterValue(fid)){
            put_error(fid);
        }
        return;
    }
    if(startsWith("get ")){
        shift(strlen("get "));
        skipSpace();
        if(!getRegisterValue(fid)){
            put_error(fid);
        }
        return;
    }
    if(startsWith("set ")){
        shift(strlen("set "));
        if(startsWith("mem ")){
                l=startsWithHexDec(&n);
                shift(l);
                if(!(startsWith(" "))){
                    put_error(fid);
                    return;
                }
                l=startsWithHexDec(&x);
                shift(l);
                if(0<=n && n<16){
//                  (*x)=n;
                    sendCommand(fid,"\n\r");
                }
                else{
                    put_error(fid);
                    return;
                }

        }
        if(startsWith("port ")){
            shift(strlen("port "));
            skipSpace();
            if(startsWith("PE ")){
                shift(strlen("PE "));
                l=startsWithHexDec(&n);
                shift(l);
                if(!(startsWith(" "))){
                    put_error(fid);
                    return;
                }
                l=startsWithHexDec(&x);
                shift(l);
                if(0<=n && n<16){
//                  printf("set port PE %d %d.\n\r",n,x);
                    xputs("set port PE ");xputd(n);xputs(" ");xputd(x);xputs(".\n\r");
//                  (*setPEX[n])((unsigned char)x);
                    setPEX_i(n,(unsigned char)x);
                    return;
                }
                else{
                    sendCommand(fid,"range error\n\r");
                    return;
                }
            }
            else
            if(startsWith("PB ")){
                shift(strlen("PB "));
                l=startsWithHexDec(&n);
                shift(l);
                if(!(startsWith(" "))){
                    put_error(fid);
                    return;
                }
                l=startsWithHexDec(&x);
                shift(l);
                if(0<=n && n<6){
//                  char w[50];
//                  sprintf(w,"set port PB %d %d.\n\r",n,x);
//                    UART_puts(w);
                    xputs("set port PB ");xputd(n);xputs(" ");xputd(x);xputs(".\n\r");
//                  (*setPBX[n])((unsigned char)x);
                    setPBX_i(n,(unsigned char)x);
                    return;
                }
                else{
                    sendCommand(fid,"range error\n\r");
                    return;
                }
            }
            else
            if(startsWith("PME ")){
                shift(strlen("PME "));
                l=startsWithHexDec(&n);
                shift(l);
                if(!(startsWith(" "))){
                    put_error(fid);
                    return;
                }
                l=startsWithHexDec(&x);
                shift(l);
                if(0<=n && n<16){
//                  char w[50];
//                    sprintf(w,"set port PME %d %d.\n\r",n,x);
//                   UART_puts(w);
                    xputs("set port PME ");xputd(n);xputs(" ");xputd(x);xputs(".\n\r");
//                  (*setPMEX[n])((unsigned char)x);
                      setPMEX_i(n,(unsigned char)x);
                    sendCommand(fid,"\n\r");
                    return;
                }
                else{
                    sendCommand(fid,"range error\n\r");
                    return;
                }
            }
            else
            if(startsWith("PMB ")){
                shift(strlen("PMB "));
                l=startsWithHexDec(&n);
                shift(l);
                if(!(startsWith(" "))){
                    put_error(fid);
                    return;
                }
                l=startsWithHexDec(&x);
                shift(l);
                if(0<=n && n<6){
//                  char w[50];
//                    sprintf(w,"set port PMB %d %d.\n\r",n,x);
//                    UART_puts(w);
                    xputs("set port PMB ");xputd(n);xputs(" ");xputd(x);xputs(".\n\r");
//                  (*setPMBX[n])((unsigned char)x);
                      setPMBX_i(n,(unsigned char)x);
                    sendCommand(fid,"\n\r");
                    return;
                }
                else{
                    sendCommand(fid,"range error\n\r");
                    return;
                }
            }
            else{
                put_error(fid);
                return;
            }
        }
        if(startsWith("outface ")){
                shift(strlen("outface "));
                l=startsWithHexDec(&n);
                shift(l);
                if(0<=n && n<6){
                    currentOutFace= faceOut[n];
                    sendCommand(fid,"\n\r");
                    return;
                }
                else{
                    sendCommand(fid,"range error\n\r");
                    return;
                }
        }
        if(startsWith("face ")){
            shift(strlen("face "));
            l=startsWithHexDec(&n);
            shift(l);
            skipSpace();
            if(startsWith("allLED ")||startsWith("allled ")){
                    shift(strlen("allLED "));
                    l=startsWithHexDec(&x);
                    shift(l);
                    skipSpace();
                    cout=faceOut[n];
                    (*cout).setAllOrOne((unsigned char )x);
                    sendCommand(fid,"\n\r");
                    return;
            }
            if(startsWith("led ")||startsWith("dir ")){
                    shift(strlen("led "));
                    l=startsWithHexDec(&x);
                    shift(l);
                    skipSpace();
                    cout=faceOut[n];
                    (*cout).setLedNumber((unsigned char )x);
                    sendCommand(fid,"\n\r");
                    return;
            }
        }
    }
    if( parseSend(fid)){
        return;
    }
    if( parseCq(fid)){ // cq face <f> dir <d>
        return;
    }
    if(parseAck1(fid)){ // ack1 face <n> dir <d> uDir <d>
        return;
    }
    if(parseAck2(fid)){
         return;
    }
  put_error(fid);
}
int CommandBuffer::parseSend(int fid){
    char s[CMax];
    int n,l;
//  OutBuffer *cout;
    if(startsWith("send ")){
        shift(strlen("send "));
        if(startsWith("face ")){
                shift(strlen("face "));
                if(startsWith("current ")){
                    shift(strlen("current "));
                    l=startsWithStringConst(s);
//                  (*((*this).currentOutFace)).putString((*this).currentOutFace,s);
//                  putStringX(currentOutFace,s);
                    (*currentOutFace).putStringX(s);
//                  sendCommand(fid,"\n\r");
                    return 1;
                }
                l=startsWithHexDec(&n);
                if(l>0){
                    shift(l);
                    if(0<=n && n<6){
                        currentOutFace= faceOut[n];
                        l=startsWithStringConst(s);
//                      (*((*this).currentOutFace)).putString((*this).currentOutFace,s);
                        (*currentOutFace).putStringX(s);
//                      sendCommand(fid,"\n\r");
                        return 1;
                    }
                    else{
                        put_error(fid);
                        return 0;
                    }
                }
        }
        if(startsWith("up ")){
                shift(strlen("up "));
                l=startsWithStringConst(s);
              if(l>0){
                      if(UpFaceID<0){
                              xputs(s); xputs("\n\r");
                        }
                        else{
                            char cmd[MaxInterFaceStrLen];
                            cmd[0]='\0';
                            strcpy(cmd,"send up \"");
                            strcat(cmd,s);
                            strcat(cmd,"\".");
//                          OutBuffer *obuf=faceOut[UpFaceID];
//                          setCurrentOutFace(obuf);
//                  (*((*this).currentOutFace)).putString((*this).currentOutFace,s);
//                  putStringX(currentOutFace,s);
//                    (*currentOutFace).putStringX(s);
//                  sendCommand(fid,"\n\r");
                            sendCommand(UpFaceID,cmd);
                        }
                      return 1;
                }
        }       
        /*
        if(startsWith("bcast ")){
                shift(strlen("bcast "));
              if(startsWith("from ")){
                      shift(strlen("from "));
                      l=startsWithStringConst(s);
                      if(l>0){
                              if(
                        }
                        
                }
              if(l>0){
                      if(UpFaceID<0){
                              xputs(s); xputs("\n\r");
                        }
                        else{
                            char cmd[80];
                            strcpy(cmd,"send up \"");
                            strcat(cmd,s);
                            strcat(cmd,"\".");
//                  (*((*this).currentOutFace)).putString((*this).currentOutFace,s);
//                  putStringX(currentOutFace,s);
                    (*currentOutFace).putStringX(s);
//                  sendCommand(fid,"\n\r");
                        }
                      return 1;
                }
        }   
*/      
        return 0;
    }   
    return 0;
}
int CommandBuffer::parseCq(int fid){
    int n,d,l;  
    if(startsWith("cq ")){ // cq face <f> dir <d>
        shift(strlen("cq "));
//      if(!startsWith("name ")){
//          put_error(fid);
//          return;         
//      }
//      shift(strlen("name "));
//      l=startsWithStringConst(s);
//    if(l<0){
//          put_error(fid);
//          return;
//      }
//      shift(l);
        if(!startsWith("face ")){
            put_error(fid);
            return 0;
        }
        shift(strlen("face "));
        l=startsWithHexDec(&n);
        if(l<=0){
            put_error(fid);
            return 0;
        }
        shift(l);
        if(!startsWith(" dir ")){
            put_error(fid);
            return 0;
        }
        shift(strlen(" dir "));
        l=startsWithHexDec(&d);
        if(l<=0){
            put_error(fid);
            return 0;
        }
        shift(l);
//      if(!response2cq(fid,s,n,d)){
        if(!response2cq(fid,n,d)){
            put_error(fid);
              return 0;
        }
        return 1;
    }   
    return 0;
}
int CommandBuffer::parseAck1(int fid){
    int n,d,e,l;    
    if(startsWith("ack1 ")){ // ack1 face <n> dir <d> uDir <d>
        shift(strlen("ack1 "));
        if(!startsWith("face ")){
            put_error(fid);
            return 0;
        }
        shift(strlen("face "));
        l=startsWithHexDec(&n);
        if(l<=0){
            put_error(fid);
            return 0;
        }
        shift(l);
        if(!startsWith(" dir ")){
            put_error(fid);
            return 0;
        }
        shift(strlen(" dir "));
        l=startsWithHexDec(&d);
        if(l<=0){
            put_error(fid);
            return 0;
        }
        shift(l);
        if(!startsWith(" uDir ")){
            put_error(fid);
            return 0;
        }
        shift(strlen(" uDir "));
        l=startsWithHexDec(&e);
        if(l<=0){
            put_error(fid);
            return 0;
        }
        shift(l);
        if(!response2ack1(fid,n,d,e)){
            put_error(fid);
                      return 0;
        }
        return 1;
    }   
    return 0;
}
int CommandBuffer::parseAck2(int fid){
    int n,d,e,l;    
    if(startsWith("ack2 ")){
        shift(strlen("ack2 "));
        if(!startsWith("face ")){
            put_error(fid);
            return 0;
        }
        shift(strlen("face "));
        l=startsWithHexDec(&n);
        if(l<=0){
            put_error(fid);
            return 0;
        }
        shift(l);
        if(!startsWith(" dir ")){
            put_error(fid);
            return 0;
        }
        shift(strlen(" dir "));
        l=startsWithHexDec(&d);
        if(l<=0){
             put_error(fid);
             return 0;
        }
        shift(l);
        if(!startsWith(" uDir ")){
            put_error(fid);
            return 0 ;
        }
        shift(strlen(" udir "));
        l=startsWithHexDec(&e);
        if(l<=0){
             put_error(fid);
             return 0;
        }
        shift(l);
        if(!response2ack2(fid,n,d,e)){
            put_error(fid);
                      return 0;
        }
        return 1;
    }
    return 0;   
}

unsigned char CommandBuffer::getRegisterValue( int fid){
    char s[50];
    int n,l;
    char cx;

        if(startsWith("mem ")){
            shift(strlen("mem "));
            l=startsWithHexDec(&n);
            if(l>0){
                shift(l);
//              x=(unsigned int)(*n);
                initBuffer();
                return 1;
            }
            else{
                put_error(fid);
                initBuffer();
                return 0;
            }
        }
        if(startsWith("port ")){
            shift(strlen("port "));
            skipSpace();
            if(startsWith("PE ")){
                shift(strlen("PE "));
                l=startsWithHexDec(&n);
                shift(l);
//              cx=(*getPEX[n])();
                cx=getPEX_i(n);
                hex2str((unsigned char )cx,(unsigned char *)s);
                sendCommand(fid,"\n\r");
                sendCommand(fid,s);
                sendCommand(fid,"\n\r");
                initBuffer();
                return 1;
            }
            if(startsWith("PB ")){
                shift(strlen("PB "));
                l=startsWithHexDec(&n);
                shift(l);
                if(n<0||5<n){
                    put_error(fid);
                    initBuffer();
                    return 0;
                }
                shift(l);
//              if(getPBX[n]==0){
                  if(getPBX_i(n)==0){
                    put_error(fid);
                    initBuffer();
                    return 0;
                }
//              cx=(*getPBX[n])();
                cx=getPBX_i(n);
                hex2str((unsigned char)cx,(unsigned char *)s);
                sendCommand(fid,"\n\r");
                sendCommand(fid,s);
                sendCommand(fid,"\n\r");
                initBuffer();
                return 1;
            }
            else
            if(startsWith("PME ")){
                shift(strlen("PME "));
                l=startsWithHexDec(&n);
                shift(l);
//              cx=(*getPMEX[n])();
                cx=getPMEX_i(n);
                hex2str((unsigned char )cx,(unsigned char *)s);
                sendCommand(fid,"\n\r");
                sendCommand(fid,s);
                sendCommand(fid,"\n\r");
                initBuffer();
                return 1;
            }
            else
            if(startsWith("PMB ")){
                shift(strlen("PMB "));
                l=startsWithHexDec(&n);
                shift(l);
                if(n<0||5<n){
                    put_error(fid);
                    initBuffer();
                    return 0;
                }
                shift(l);
//              if(getPBX[n]==0){
                if(getPBX_i(n)==0){
                    put_error(fid);
                    initBuffer();
                    return 0;
                }
//              cx=(*getPMBX[n])();
                cx=getPMBX_i(n);
                hex2str((unsigned char)cx,(unsigned char *)s);
                sendCommand(fid,"\n\r");
                sendCommand(fid,s);
                sendCommand(fid,"\n\r");
                initBuffer();
                return 1;
            }
            else{
                put_error(fid);
                initBuffer();
                return 0;
            }
        }
        return 0;
}

void CommandBuffer::sendCommandToConnectedFace( int faceID, char *s){
    OutBuffer *x;
    InBuffer *y;
    int dir;
    if((0x80&faceID)!=0x00){
        xputs(s);
        return;
    }
    x=faceOut[faceID];
    y=faceIn[faceID];
    if(!(*y).getConnected()){
        printf(" ..send .. face %d is not connected.\n\r",faceID);
        return;
    }
    dir=dirID[faceID];  
    printf("..send..f%d d%d... %s\n\r",faceID,dir,s);   
    (*x).setAllOrOne((unsigned char)0);
  (*x).setLedNumber((unsigned char )dir);
  sendCommand(faceID,s);
}

void CommandBuffer::sendCommand( int faceID, char *s){
    OutBuffer *x;
//  InBuffer *y;
//  int dir;
    if((0x80&faceID)!=0x00){
        xputs(s);
        return;
    }
    x=faceOut[faceID];
    setCurrentOutFace(x);
//  y=faceIn[faceID];
//  printf("..send..%d ... %s\n\r",faceID,s);    // for debug
    (*x).setPortXOff();     
    (*x).putStringX(s);
     (*x).waitUntilOutputDone();    
    (*x).setPortXOn();
}

void CommandBuffer::startRecursiveStructureSearch( int ufid, char *uName){ // srs
    char rbuffer2[5];
//    char cmd2next[50];
        char i;
        char ufc='0';
//      char udc='0';
      UpFaceID=ufid;
      printf("srs ...uf=%d, uname=%s\n\r",UpFaceID,uName);
        if((0x80&UpFaceID)!=0x00){
           ufc='*';
//         udc='*';
        }
        else
        {
           ufc=UpFaceID+'0';
//         udc=myDirID[UpFaceID]+'0';
        }
        if(!FirstTime) return;
        myname[0]=0;
        strcpy(myname,uName);
        upname[0]=0;
        strcpy(upname,uName);
        rbuffer2[0]=ufc;
        rbuffer2[1]=0;
        strcat(myname,rbuffer2);
        FirstTime=0;
        resetFlag=1;
        for(i=0;i<FaceMax;i++){   // 各面について解析
            if(i!=UpFaceID){      // この面が上位ノードでなければ以下を実行
                sendCq(i);
            }
        }
}
/*
void wait(int i){
    int j,k;
    for(j=0;j<i;j++){
        for(k=0;k<10000;k++){}
    }
}
*/
void CommandBuffer::resetBuffer(void){ // reset
    int i;
    FirstTime=1;
    for(i=0;i<FaceMax;i++){
        faceID[i]=(char)(-1);   
        (*(faceIn[i])).setConnected((unsigned char)0);
    }
    initBuffer();
    thisIsMonitoring=0;
    thisIsProbe=0;
    resetFlag=1;
    echoBackUART=1;
}

void CommandBuffer::sendCq( char fID){
    OutBuffer *x;
    InBuffer *y;
    int i;
    char str[20];
    char buf[20];
    char cmd[40];
//  int f;
    str[0]=0;
    // faceID<0
    if( (((char)0x80) & fID)!=0x00  ) return ;
  x=faceOut[fID];
    y=faceIn[fID];
    if((*y).getConnected()) return;
    setCurrentOutFace(x);   
    strcpy(str,"cq face ");
    buf[0]='0'+fID;
    buf[1]=' ';
    buf[2]='d'; buf[3]='i'; buf[4]='r'; buf[5]=' ';buf[6]='x'; buf[7]='.';buf[8]=0;
//  (*x).putString(x,str);
    (*x).setAllOrOne((unsigned char)0);
    for(i=0;i<DirMax;i++){
        strcpy(cmd,str);
        buf[6]='0'+i;
        strcat(cmd,buf);
        (*x).setLedNo((unsigned char)i);
        sendCommand(fID,cmd);
 //   wait(0.1f);       
//   (*x).waitUntilOutputDone();
//   if((*y).getConnected()) return 1;
    }
    (*x).setPortXOn();
}


unsigned char CommandBuffer::faceIsConnected( char fID){
    InBuffer *y;
    // faceID<0
    if( (((char)0x80) & fID)!=0x00  ) return 1;
    y=faceIn[fID];
    return (*y).getConnected();
}

int CommandBuffer::putQueue( int fid, char *x, int l){
//    printf(" putQueueForComBuffer-%s received.\n",x);
    StringQueue *q;
    q=squeue;
    return (*q).putSQueue(fid,x, l);
}


//InBuffer nextDoorIn[1], faceIn[6];
//OutBuffer nextDoorOut[1], faceOut[6];
StringQueue squeuex;

void CommandBuffer::setCurrentOutFace( OutBuffer *x){

   (*(faceOut[0])).clear();
   (*(faceOut[1])).clear();
   (*(faceOut[2])).clear();
   (*(faceOut[3])).clear();
   (*(faceOut[4])).clear();
   (*(faceOut[5])).clear();

   currentOutFace=x;
}


//void intsrv_tim(void)
//#pragma interrupt ISRProcess
void CommandBuffer::interruptProcess(void)
{

    OutBuffer *outFace;
    outFace=currentOutFace;

//  sputs(".");
//  printf(".");

//    ((nextDoorIn[0]).intrProcess)(&nextDoorIn[0]);
    (*faceIn[0]).intrProcess();
    (*faceIn[1]).intrProcess();
    (*faceIn[2]).intrProcess();
    (*faceIn[3]).intrProcess();
    (*faceIn[4]).intrProcess();
    (*faceIn[5]).intrProcess();

 //   if(command.currentOutFace!=NULL){
     if(outFace!=NULL){
       (*outFace).intrProcess();
    }

    // debug
//  a=getPBX[1]();
//  setPBX[1](!a);

    // タイマー割り込みフラグをクリア
//  MK0H.6 = 0;     // TM000割り込み許可
//  IF0H.6 = 0;     // タイマー割り込みフラグをクリア

}
/*
void CommandBuffer::setFaceIn( unsigned char i, InBuffer *fin){
    faceIn[i]=fin;
}
*/


void CommandBuffer::ackReturned( int faceID){
    OutBuffer *out=faceOut[faceID];
        (*out).setStringOutputStatus(2);
}

char i2h1(int x){
    if(x>16) return (char)(-1);
    if(x<10) return '0'+x;
    else return 'a'+x-10;
}
int h2i1(char x){
    int rtn=(int)x-(int)'0';
    if(x>=(int)'a'){
        rtn=(int)x-(int)'a'+10;
    }
    return rtn;
}
CommandBuffer::CommandBuffer( unsigned char idx){
    char i;
    p=0;
    cqp1=0;
    id=idx;
    setPortFunctions();
    FirstTime=1;

    for(i=0;i<FaceMax;i++){
        faceID[i]=(char)(-1);
    }
    // H8SX specific initialization
//    PH.ICR.BIT.B0=1; PH.ICR.B1=1; PH.ICR.B2=1; PH.ICR.B3=1; //H->B
//    PH.ICR.BIT.B4=1; PH.ICR.B5=1; PH.ICR.B6=1; PH.ICR.B7=1;
    setPMEF((unsigned char)0); setPMEE((unsigned char)0);
    setPMED((unsigned char)0); setPMEC((unsigned char)0);
    setPMEB((unsigned char)0); setPMEA((unsigned char)0);
}

void CommandBuffer::setBuffers(void){
    squeue=new StringQueue();
//  (*squeue).initSQueue();

    /* */
    faceIn[0]=new InBuffer(0,this);
       (*(faceIn[0])).setPortConf(getPEF,setPMEF);
//     (*this).setFaceIn( 0, faceIn[0]);
    faceIn[1]=new InBuffer(1,this);
       (*(faceIn[1])).setPortConf(getPEE,setPMEE);
//     (*this).setFaceIn( 1, (faceIn[1]));
    faceIn[2]=new InBuffer(2,this);
       (*(faceIn[2])).setPortConf(getPED,setPMED);
//     (*this).setFaceIn(2, (faceIn[2]));
    faceIn[3]=new InBuffer(3,this);
       (*(faceIn[3])).setPortConf(getPEC,setPMEC);
//     (*this).setFaceIn(3, (faceIn[3]));
    faceIn[4]=new InBuffer(4,this);
       (*(faceIn[4])).setPortConf(getPEB,setPMEB);
//     (*this).setFaceIn(4, (faceIn[4]));
    faceIn[5]=new InBuffer(5,this);
       (*(faceIn[5])).setPortConf(getPEA,setPMEA);
//     (*this).setFaceIn(5, (faceIn[5]));

    faceOut[0]=new OutBuffer((unsigned char)0);
       (*(faceOut[0])).setPortConf( (unsigned char)0, setPE0, getPE0, setPME0);
       (*(faceOut[0])).setPortConf( (unsigned char)1, setPE1, getPE1, setPME1);
       (*(faceOut[0])).setPortConf( (unsigned char)2, setPE2, getPE2, setPME2);
       (*(faceOut[0])).setPortConf( (unsigned char)3, setPE3, getPE3, setPME3);
       (*(faceOut[0])).setPortXConf(   setPE4, setPME4);
    faceOut[1]=new OutBuffer((unsigned char)1);
       (*(faceOut[1])).setPortConf( (unsigned char)0, setPE0, getPE0, setPME0);
       (*(faceOut[1])).setPortConf( (unsigned char)1, setPE1, getPE1, setPME1);
       (*(faceOut[1])).setPortConf( (unsigned char)2, setPE2, getPE2, setPME2);
       (*(faceOut[1])).setPortConf( (unsigned char)3, setPE3, getPE3, setPME3);
       (*(faceOut[1])).setPortXConf(   setPE5, setPME5);
    faceOut[2]=new OutBuffer((unsigned char)2);
       (*(faceOut[2])).setPortConf( (unsigned char)0, setPE0, getPE0, setPME0);
       (*(faceOut[2])).setPortConf( (unsigned char)1, setPE1, getPE1, setPME1);
       (*(faceOut[2])).setPortConf( (unsigned char)2, setPE2, getPE2, setPME2);
       (*(faceOut[2])).setPortConf( (unsigned char)3, setPE3, getPE3, setPME3);
       (*(faceOut[2])).setPortXConf(   setPE6, setPME6);
    faceOut[3]=new OutBuffer((unsigned char)3);
       (*(faceOut[3])).setPortConf( (unsigned char)0, setPE0, getPE0, setPME0);
       (*(faceOut[3])).setPortConf( (unsigned char)1, setPE1, getPE1, setPME1);
       (*(faceOut[3])).setPortConf( (unsigned char)2, setPE2, getPE2, setPME2);
       (*(faceOut[3])).setPortConf( (unsigned char)3, setPE3, getPE3, setPME3);
       (*(faceOut[3])).setPortXConf(   setPE7, setPME7);
    faceOut[4]=new OutBuffer((unsigned char)4);
       (*(faceOut[4])).setPortConf( (unsigned char)0, setPE0, getPE0, setPME0);
       (*(faceOut[4])).setPortConf( (unsigned char)1, setPE1, getPE1, setPME1);
       (*(faceOut[4])).setPortConf( (unsigned char)2, setPE2, getPE2, setPME2);
       (*(faceOut[4])).setPortConf( (unsigned char)3, setPE3, getPE3, setPME3);
       (*(faceOut[4])).setPortXConf(   setPE8, setPME8);
    faceOut[5]=new OutBuffer((unsigned char)5);
       (*(faceOut[5])).setPortConf( (unsigned char)0, setPE0, getPE0, setPME0);
       (*(faceOut[5])).setPortConf( (unsigned char)1, setPE1, getPE1, setPME1);
       (*(faceOut[5])).setPortConf( (unsigned char)2, setPE2, getPE2, setPME2);
       (*(faceOut[5])).setPortConf( (unsigned char)3, setPE3, getPE3, setPME3);
       (*(faceOut[5])).setPortXConf(   setPE9, setPME9);

    currentOutFace= (faceOut[0]);

//    (*setPMBX[1])((unsigned char)1);
}

StringQueue* CommandBuffer::getStringQueue(){
    return squeue;
}

}}
----
#counter



トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS