#author("2021-12-07T08:56:19+09:00","default:Real2Virtual202111","Real2Virtual202111")
#author("2021-12-07T14:36:19+09:00","default:Real2Virtual202111","Real2Virtual202111")
[[Real2Virtual202111]]

#code(c){{
#include "common.h"
#include "mbed.h"
#include "CommandBuffer.h"
//#include "InBuffer.h"
//#include "OutBuffer.h"
#include "StringQueue.h"
//#include "Initialize.h"

/*
===============================================================================
 Name        : main.c
 Author      : 
 Version     :
 Copyright   : Copyright (C) 
 Description : main definition
===============================================================================
*/

// Variable to store CRP value in. Will be placed automatically
// by the linker when "Enable Code Read Protect" selected.
// See crp.h header for more information

/*

timer interrupt
   |
  (set current output face... the face connect with the up side node in the parse tree )
   |
   v
  face 0 input (photo transister 0) routine
  face 1 input (photo transister 1) routine
  face 2 input (photo transister 2) routine
  face 3 input (photo transister 3) routine
  face 4 input (photo transister 4) routine
  face 5 input (photo transister 5) routine
   |
   v
  current output face routine
   |
   V
  end

 
Main routine
   |
   v
initialize
   |
   v
start loop
   |
   v
next door command routine
if there is a  command input from USB Serial (for debug) or M5Stamp/Atom Serial
then exec the command
   |
   v
face 0 command routine
face 1 command routine
face 2 command routine
if there is a command input from faces
then exec the command
   |
   v
usb command routine
   |
   v
repeat the loop


 
 
input routine


 
 
+---------------------------+
| inter face command buffer +---> message interpreter -->
+---------------------------+

 
+---------------------------+
| command buffer for face 0 +---> message interpreter -->
+---------------------------+

 
+---------------------------+
| command buffer for face 1 +---> message interpreter -->
+---------------------------+

 
+---------------------------+
| command buffer for face 2 +---> message interpreter -->
+---------------------------+

 
+---------------------------+
| command buffer for face 3 +---> message interpreter -->
+---------------------------+

 
+---------------------------+
| command buffer for face 4 +---> message interpreter -->
+---------------------------+

 
+---------------------------+
| command buffer for face 5 +---> message interpreter -->
+---------------------------+
*/
*/ 
/*


 
 
                  USB TERMINAL

 
                      mbed NXP LPC1768
                      
                1 GND                        3.3 Vout 40
                2 VIN                   5.0v USV vout 39
                3 VB                             IF-  38
                4 nR                             IF+  37
                5 p5 mosi(spi)           Ethernet RD- 36
                6 p6 miso(spi)           Ethernet RD+ 35
                7 p7 sck                 Ethernet TD- 34 
                8 p8                     Ethernet TD+ 33 
                9 p9  tx(serial)               USB D- 32 
               10 p10 rx(serial)               USB D+ 31 
               11 p11 mosi(spi)                   p30 30
               12 p12 miso(spi)                   p29 29
               13 p13 tx/sck             I2C SDA  p28 28
               14 p14 rx                 I2C SCL  p27 27
               15 p15 analog                      p26 26
               16 p16 analog                      p25 25
               17 p17 analog                      p24 24
               18 p18 analog  /out                p23 23
               19 p19 analog                      p22 22
               20 p20 analog                      p21 21
*/



*/ 
 
 
 
/*
tesla dice configuration of the LPC1768

 
PIN REG 
30  PE0 p30   direction 0   ---------------  LED00 LED01 LED02 LED03 LED04 LED05
29  PE1 p29   direction 1   ---------------  LED10 LED11 LED12 LED13 LED14 LED15
28  PE2 p28   direction 2   ---------------  LED20 LED21 LED22 LED23 LED24 LED25
27  PE3 p27   direction 3   ---------------  LED30 LED31 LED32 LED33 LED34 LED35
            ----                               |      |    |     |     |     |
                                               |      |    |     |     |     |
26  PE4 p26  face 0-----R150ohm----------------+      |    |     |     |     |
25  PE5 p25  face 1-----R150ohm-----------------------+    |     |     |     |
24  PE6 p24  face 2-----R150ohm----------------------------+     |     |     |
23  PE7 p23  face 3-----R150ohm----------------------------------+     |     |
22  PE8 p22  face 4-----R150ohm----------------------------------------+     |
21  PE9 p21  face 5-----R150ohm----------------------------------------------+

 
    REG     ... photo tr receive
15  PEA  p15  face 0  ------<<<-----
16  PEB  p16  face 1  ------<<<-----
17  PEC  p17  face 2  ------<<<-----
18  PED  p18  face 3  ------<<<-----
19  PEE  p19  face 4  ------<<<-----
20  PEF  p20  face 5  ------<<<-----

 
    USB Serial
        --rx---<<<--serial ---- USB
        --tx--->>>--serial ---- USB

 
    M5Stamp/M5Atom Serial
10      --rx---<<<--serial ---- M5Stamp/Atom
 9      --tx--->>>--serial ---- M5Stamp/Atom

 
○LPC1768<->LPC1768 (inter-dice )command
LPC1768->LPC1768            "srs."           start the recursive search
LPC1768<-LPC1768            "(this <dice_name_0> f<x0>d<y0>  next  <dice_name_1> f<x1>d<y1> )"
                                              return the tesla dices structure
                                                <dice_name_0>... this dice name, <dice_name_1>... next dice's name
                                               <x0> ... this face number   <x1> ... connected dice's (next dice's)  face number)
                                               <y0> ... direction between this face and next dice's face   <y1> must be <y0>

 
LPC1768->LPC1768            "ask <x0><x1>...<xn>." ask the tesla dices status
LPC1768->LPC1768            "set (<val>) <x0><x1>...<xn>." set the tesla dices status


 
 
○PC <->LPC1768 command ... プローブは PC<->LPC1768 で接続。各テスラダイスのデバッグでも使用。

 
  pc->LPC1768            "srs."           start the recursive search... プローブは 面0と仮定。
  pc<-LPC1768            "(this <dice_name_0> f<x0>d<y0>  next  <dice_name_1> f<x1>d<y1> ). ...."
                                   return the tesla dices structur

 
  pc->LPC1768            "con<x0>."       面<x0> の接続を確認
  pc<-LPC1768            "cf<x1><y1>"     ... <x0> は相手側の<x1>面の<y1>の向きで接続
         または   "n"              ... 接続なし。
  pc->LPC1768           "prb."           この r8 をプローブに設定
pc->LPC1768            "dce."           この r8 をテスラダイスに設定
pc->LPC1768            "mon<level>."    r8<->cpld 間の通信をモニター。(pc へ情報を送る)
                                  <level>= 0 ... モニターなし。
                                  <level>= 1 ... r8<-r8 をモニター。
                                  <level>= 2 ... r8<->cpld をモニター。
pc->LPC1768            "?."            r8 の状態を問い合わせ
pc<-LPC1768            ...

 
OutBuffer.status
0 ... no data
1 ... outputting
2 ... output is done
3 ... buffering
4 ... ready for output
5 ... waiting ack

 
InBuffer.status
0 ... waiting
1 ... reading bits sequence
2 ... ready for input

 
inter-face commands
  sx ----->
     <---- ak
*/
*/ 

/* */


// TODO: insert other include files here
Serial pc(USBTX,USBRX); //9600bps
Serial atom(p9,p10); //tx,rx

volatile int led_timer;
CommandBuffer *commandInterpreter;
void tir() {
    (*commandInterpreter).interruptProcess();   
}
Ticker t;
int main(void) {
    
    int rd,rx;
    int fid;
    char command[128],received[128];
    char *cp;
    int isInQuote;

    // TODO: insert code here
    //---------------------------
    // Initialize System Hardware
    //---------------------------
 
    commandInterpreter=new CommandBuffer((unsigned char)0);
//    initForComBuffer(&commandInterpreter,(unsigned char)0);
    (*commandInterpreter).initBuffer();
//    commandInterpreter.setBuffers(&commandInterpreter);
    (*commandInterpreter).setBuffers();

    led_timer=1000;
    //----------------
    // Test Output
    //----------------
    {
        //
//        UART_getc(); // wait for any input
        char *sm1="\r\nTESLA DICE for LPC1768\r\n";
        char *sm2="tesla20210520\r\n";
//        pc.printf(sm1);
//        pc.printf(sm2);
//        atom.printf(sm1);
//        atom.printf(sm2);
        xputs(sm1);
        xputs(sm2);
    }

    isInQuote=0;
    cp=command;
    rd=0;
    xputs("\n\rOK.\n\r");
    t.attach_us(&tir, 200); // the address of the object, member function, and interval
    while(1)
    {

        /* comment out when using api.h*/
//          rd=COM_getchar();
//          rd=UART_getc_nw();
          if(pc.readable()){rd=pc.getc();}
          if(atom.readable()){rd=atom.getc();}
          if(rd!=0){
//              UART_putc((char)rd);
               pc.putc((char)rd);
               atom.putc((char)rd);
        /* */
                        rx=rd;
            *cp=rd;
            cp++;
            rd=0;
            if(cp-command>CMax){
//                UART_puts("\n\rtoo long command.\n\r");
//                pc.printf("\n\rtoo long command.\n\r");
                xputs("\r\ntoo long command.\r\n");
                cp=command;
            }
            if(rx=='\b'){
                cp--;
                if(cp-command>0){
                    cp--;
                }
            }
            if(rx=='\"'){  
                if(isInQuote==0){
                    isInQuote=1;
                }
                else{
                    isInQuote=0;
                }
            }
            if(rx=='\\'){    //\\'
//                rd=UART_getc();
                if(pc.readable()) {
                    rd=pc.getc();
//                  UART_putc(rd);
                    pc.putc(rd);
                }
                if(atom.readable()){
                    rd=atom.getc();
                    atom.putc(rd);
                }
                *cp=rd;
                cp++;
                if(rd=='\b'){
                    cp--;
                    if(cp-command>0){
                        cp--;
                    }
                }
                rd=0;
            }
            if(rx=='.'){
                if(isInQuote==0){
                    *cp=0;
                    (*commandInterpreter).putCommand( -1, command);
                    (*commandInterpreter).interpretCommand(-1);
                    (*commandInterpreter).initBuffer();
//                    UART_puts("\n\rok.\n\r");
//                    pc.printf("\n\rok.\n\r");
                    xputs("\r\nok.\r\n");
                    cp=command;
                }
            }
            else
            if(rx=='\n'){
                *cp=0;
                (*commandInterpreter).putCommand( -1, command);
                (*commandInterpreter).interpretCommand((unsigned char)(-1));
                (*commandInterpreter).initBuffer();
//                UART_puts("\n\rok.\n\r");
//                pc.printf("\n\rok.\n\r");
                xputs("\r\nok.\r\n");
                cp=command;
            }
        } // end of if(rd!=0)

        fid=(*((*commandInterpreter).getStringQueue())).getSQueue( received);
        if(fid>=0){
//          char w[50];
//            sprintf(w,"fid=%d, received=",(int)fid);
//            UART_puts(w);
            xputs("fid=");xputd(fid);xputs(", received=");xputs(received);
//            UART_puts("\n\r");
            xputs("\n\r");
            (*commandInterpreter).putCommand( fid, received);
            (*commandInterpreter).interpretCommand(fid);
            (*commandInterpreter).initBuffer();
                      xputs("ok\n\r");
        }

    }
//    return 0 ;
}
/*
// SysTickハンドラ
void SysTick_Handler(void) {
    static uint16_t count = 0;          // (1) カウンタ変数の定義
    if (++count >= led_timer) {         // (2) 指定時間毎に分岐
 //       LPC_GPIO0->DATA ^= (1 << 7);  // (3) PIO0_7 をトグル出力
 //       LPC_GPIO1->DATA ^= (1 << 5);  //     PIO1_5 をトグル出力
        (*commandInterpreter).interruptProcess();
        count = 0;                      // (4) カウンタを0に戻す
    }
}

void TMR32_Configuration(void) {                        // 32ビット・タイマの初期化関数
    LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 9);              // (1) 32ビットカウンタ/タイマ0にクロックを供給(CT32B0='1')
    LPC_TMR32B0->MCR |=  (1 << 10);                     // (2) MR3 によるリセット(MR3R='1')
    LPC_TMR32B0->EMR  |=  (3 << 10);                    // (3) トグル出力を選択(EMC0="11")
    LPC_IOCON->R_PIO0_11 |=  3;                         // (4) CT32B0_MAT3 機能を選択
}

void UART_Configuration(uint32_t baudrate) {            // UART初期化関数
    uint32_t DL;                                        // (1) ボーレート分周比の変数定義
    LPC_IOCON->PIO1_6 |= 0x01;                          // (2) RXD機能に設定(FUNC=001)
    LPC_IOCON->PIO1_7 |= 0x01;                          // (3) TXD機能に設定(FUNC=001)
    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<12);               // (4) UARTへクロック供給
    LPC_SYSCON->UARTCLKDIV = 0x01;                      // (5) ボーレート・ジェネレータへクロック供給
//    DL = (SystemCoreClock * LPC_SYSCON->SYSAHBCLKDIV)     // (6) ボーレート分周比の算出
//       / (16 * baudrate * LPC_SYSCON->UARTCLKDIV);
    uint32_t DLA= (SystemCoreClock * LPC_SYSCON->SYSAHBCLKDIV);
    uint32_t DLB= (16 * baudrate * LPC_SYSCON->UARTCLKDIV);
    DL=xdiv(DLA,DLB);
    LPC_UART->LCR |= (1<<7);                            // (7) ディバイザ・ラッチ・アクセス有効(DLAB=1)
//    LPC_UART->DLM = DL / 256;                             // (8) ボーレートの設定(U0DLM)
//    LPC_UART->DLL = DL % 256;                             // (9) ボーレートの設定(U0DLL)
    uint32_t dlm=DL>>8;
    uint32_t dlx=DL-dlm*256;
    LPC_UART->DLM=dlm;
    LPC_UART->DLL=dlx;
    LPC_UART->LCR &= ~(1<<7);                           //(10) ディバイザ・ラッチ・アクセス無効(DLAB=0)
    LPC_UART->LCR = 0x03;                               //(11) データのフォーマット設定
    LPC_UART->FCR = 0x07;                               //(12) 入出力バッファの初期化
}

void UART_putc(char data) {                             // UARTバイト・データ送信関数
    while (!(LPC_UART->LSR & (1<<5)));                  // (1) データ転送待ち
    LPC_UART->THR = data;                               // (2) データ送信
}

void UART_puts(char *str) {                             // UART文字列データ送信関数
    while (*str != '\0') {                              // (1) 文字列が終わるまで繰り返す
        UART_putc(*str);                                // (2) 文字データの送信
        str++;                                          // (3) 次の文字に移る
    }
}

int UART_getc(void) {                                   // バイト・データ受信関数
    while (!(LPC_UART->LSR & 0x01));                    // (1) 受信待ち
    return LPC_UART->RBR;                               // (2) 受信データの引き渡し
}

int UART_getc_nw(void) {                                // バイト・データ受信関数
    int rtn=0;
    if(LPC_UART->LSR & 0x01){                       // (1) 受信待ち
       return LPC_UART->RBR;                                // (2) 受信データの引き渡し
    }
    return rtn;
}
*/

void xputs(char *c){
    pc.printf("%s",c);
    atom.printf("%s",c);
}
void xputc(char c){
    pc.putc(c);
    atom.putc(c);
}
void xputd(int d){
    char w[20];
    int pw;
    char rw[20];
    int prw;
    int s=1;
    if(d<0) {
        s=-1;
        d=-d;
    }
    pw=0;
    w[pw]='0';
    while(d>0){
//    w[pw]='0'+(d%10);
//    d=d/10;
        w[pw]='0'+xmod(d,10);
        d=xdiv(d,10);
      pw++;
    }
    prw=0;
    if(s<0){
      rw[prw]='-';
      prw++;
      rw[prw]=0;
    }
    else{
      rw[prw]='0';
    }
    rw[prw+1]=0;
    while(pw>0){
        pw--;
        rw[prw]=w[pw];
        prw++;
        rw[prw]=0;
    }
    xputs(rw);
}

int xdiv(int x, int y){
    int s;
    s=1;
    if(x<0 && y<0){
        s=1;
        x=-x;
        y=-x;
    }
    else
    if(x>=0 && y>=0 ){
        s=1;
    }
    else{
        s=-1;
        if(x<0){
            x=-x;
        }
        if(y<0){
            y=-y;
        }
    }
    if(y==0){
        return s*99999999;
    }
    if(y>x){
        return 0;
    }
    if(x==y){
        return s;
    }
    if(y==1){
        return s*x;
    }
    if(y==2){
        return s*(x>>1);
    }
    if(y==4){
        return s*(x>>2);
    }
    if(y==8){
        return s*(x>>3);
    }
    if(y==16){
        return s*(x>>4);
    }
    int rtn=0;
    int scale=1;
    while(x>y){
        y=y<<1;
        scale=scale<<1;
    }
    y=y>>1;
    scale=scale >> 1;
    while(scale>0){
        if(x>y){
            x=x-y;
            rtn=rtn+scale;
        }
        y=y>>1;
        scale=scale>>1;
    }
    return s*rtn;
}

int xmod(int x, int y){
    int d=xdiv(x,y);
    return x-d*y;
}
/* */
int xstrlen(char *a){
    int rtn=0;
    while((*a)!=0){
        rtn++;
        a++;
    }
    return rtn;
}

void xstrcpy(char *x, char *y){
    int l=0;
  while((*y)!=0){
      if(l>256) break;
      *x=*y;
      x++;
      y++;
      l++;
  }
  *x=0;
}

void xstrcat(char *x, char *y){
    char *px;
    int maxlen=128;
    px=x;
    while(*px!=0){
        px++;
    }
    while(*y!=0){
        *px=*y;
        px++;
        y++;
        if(px-x>maxlen){
            *px=0;
            return;
        }
    }
    return;
}

/* */

}}
----
#counter



トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS