Aliexpressなどで販売されている64x32のフルカラードットマトリクスLED2枚とNucleo F401REを利用して、 E233系の駅停車時、路線名表示ありのLED側面行先表示を再現するプログラムです。 3秒間隔、3段階切替で、路線名、種別、行先、次停車駅を個別に指定することが可能です。

Dependencies:   SDFileSystem mbed

Revision:
30:3ac9aa4faa34
Parent:
29:bc82c25b6b94
Child:
31:d186b04b983e
--- a/main.cpp	Tue Feb 03 10:36:24 2015 +0000
+++ b/main.cpp	Sun Feb 15 02:18:58 2015 +0000
@@ -54,6 +54,11 @@
 //最大停車駅数
 #define MaxStopStation 100
 
+//将来的な複数機器連動用の機器ID
+//0:全機器一斉送信用 1:前面LED 2:側面LED(暫定)
+#define DeviceID 2 
+
+
 //SDCard
 //MOSI - D11(PA7)
 //MISO - D12(PA6)
@@ -62,9 +67,13 @@
 
 SDFileSystem sd(D11, D12, D13, D10, "sd");
 
-//Serial
+//Serial USB
 Serial pc(USBTX,USBRX );
 
+//Bluetooth Serial6
+//Serial pc(PA_11,PA_12 );
+
+
 //LEDModule
 //R1,R2,G1,G2,B1,B2はモジュールによりコネクタのピンアサインが異なります。
 //色が違う場合DigitalOutのピンアサインを変更してください。
@@ -75,6 +84,13 @@
 //G2  - D7(PA8)
 //B1  - D2(PA10)
 //B2  - D3(PB3)
+//or
+//R1  - D6(PB5)
+//R2  - D7(PB4)
+//G1  - D2(PB10)
+//G2  - D3(PA8)
+//B1  - D4(PA10)
+//B2  - D5(PB3)
 
 //A   - D8(PA9)
 //B   - D9(PC7)
@@ -90,12 +106,12 @@
 DigitalOut LAT(PB_15);    //  Data latch    - active low (pulse up after data load)
 DigitalOut OE(PB_1);     //  Output enable - active low (hold high during data load, bring low after LAT pulse)
 
-DigitalOut R1(D6);     //  RED   Serial in for upper half
-DigitalOut R2(D7);     //  RED   Serial in for lower half
-DigitalOut G1(D2);      //  GREEN Serial in for upper half
-DigitalOut G2(D3);      //  GREEN Serial in for lower half
-DigitalOut B1(D4);      //  BLUE  Serial in for upper half
-DigitalOut B2(D5);      //  BLUE  Serial in for lower half
+DigitalOut R1(D4);     //  RED   Serial in for upper half
+DigitalOut R2(D5);     //  RED   Serial in for lower half
+DigitalOut G1(D6);      //  GREEN Serial in for upper half
+DigitalOut G2(D7);      //  GREEN Serial in for lower half
+DigitalOut B1(D2);      //  BLUE  Serial in for upper half
+DigitalOut B2(D3);      //  BLUE  Serial in for lower half
 
 
 
@@ -150,6 +166,9 @@
 int ForNumber = 114;
 int NextStaNumber = 1;
 char SerialBuffer[30];
+//シリアル処理用バッファ
+char ABuffer[30];
+bool busyflag = false;
 int count = 0;
 
 
@@ -387,6 +406,7 @@
 
 void Init()
 {
+    //pc.baud(9600);
     // Set up things to a known state
     CLK = LOW;
     LAT = LOW;
@@ -564,6 +584,8 @@
     }
     
     //OE = LOW;
+    //クロック確認
+    //pc.printf("CPU SystemCoreClock is %.2f MHz\r\n", (float)SystemCoreClock/1000/1000); 
 }
 
 void ScrollTimerTick(){
@@ -589,6 +611,9 @@
         
             //SDDataReadtest
             int8_t Data;
+            //先頭2バイトはヘッダ
+            fseek(fp, 2, SEEK_SET);
+            
             for(int y = Starty; y < Starty + Ready; y++){  
                 for(int x = Startx; x < Startx + Readx; x++){
                     Data = getc(fp);
@@ -612,6 +637,8 @@
         
             //SDDataReadtest
             int8_t Data;
+            //先頭2バイトはヘッダ
+            fseek(fp, 2, SEEK_SET);
             for(int y = Starty; y < Starty + Ready; y++){  
                 for(int x = Startx; x < Startx + Readx; x++){
                     Data = getc(fp);
@@ -791,16 +818,31 @@
     OE = HIGH;
     
     if (pc.readable() == 1) { // 受信したデータが存在する
-        SerialBuffer[count] = pc.getc(); // 受信データを読み込む
-        if (count > 30 || SerialBuffer[count] == '$') { // 文字数が既定の個数を超えた場合、又は終了文字を受信した場合
-            SerialBuffer[count] = '\0';                    // 末尾に終端文字を入れる
+        if (busyflag == false){
+            SerialBuffer[count] = pc.getc(); // 受信データを読み込む
+            
+        }else{
+            pc.printf("busy\r\n");
+        }
+        
+        if (count > 29 || SerialBuffer[count] == '$') { // 文字数が既定の個数を超えた場合、又は終了文字を受信した場合
+            busyflag = true;
+            
+            //SerialBuffer[count] = '\0';                    // 末尾に終端文字を入れる
+            
+            for(int a = 0; a < count; a++){
+            
+                ABuffer[a] = SerialBuffer[a];
+            }
+            
+            
             count = 0; 
             
             //路線名 L
-            if(SerialBuffer[0] == 'L'){
-                unsigned char Sertemp1 = SerialBuffer[1];
-                unsigned char Sertemp2 = SerialBuffer[2];
-                unsigned char Sertemp3 = SerialBuffer[3];
+            if(ABuffer[0] == 'L'){
+                unsigned char Sertemp1 = ABuffer[1];
+                unsigned char Sertemp2 = ABuffer[2];
+                unsigned char Sertemp3 = ABuffer[3];
                 int n1 = 0 ;
                 int n2 = 0 ;
                 int n3 = 0 ;
@@ -831,10 +873,10 @@
             }
             
             //種別 K
-            if(SerialBuffer[0] == 'K'){
-                unsigned char Sertemp1 = SerialBuffer[1];
-                unsigned char Sertemp2 = SerialBuffer[2];
-                unsigned char Sertemp3 = SerialBuffer[3];
+            if(ABuffer[0] == 'K'){
+                unsigned char Sertemp1 = ABuffer[1];
+                unsigned char Sertemp2 = ABuffer[2];
+                unsigned char Sertemp3 = ABuffer[3];
                 int n1 = 0 ;
                 int n2 = 0 ;
                 int n3 = 0 ;
@@ -865,10 +907,10 @@
             }
             
             //行先 F
-            if(SerialBuffer[0] == 'F'){
-                unsigned char Sertemp1 = SerialBuffer[1];
-                unsigned char Sertemp2 = SerialBuffer[2];
-                unsigned char Sertemp3 = SerialBuffer[3];
+            if(ABuffer[0] == 'F'){
+                unsigned char Sertemp1 = ABuffer[1];
+                unsigned char Sertemp2 = ABuffer[2];
+                unsigned char Sertemp3 = ABuffer[3];
                 int n1 = 0 ;
                 int n2 = 0 ;
                 int n3 = 0 ;
@@ -899,10 +941,10 @@
             }
             
             //次停車駅 K
-            if(SerialBuffer[0] == 'N'){
-                unsigned char Sertemp1 = SerialBuffer[1];
-                unsigned char Sertemp2 = SerialBuffer[2];
-                unsigned char Sertemp3 = SerialBuffer[3];
+            if(ABuffer[0] == 'N'){
+                unsigned char Sertemp1 = ABuffer[1];
+                unsigned char Sertemp2 = ABuffer[2];
+                unsigned char Sertemp3 = ABuffer[3];
                 int n1 = 0 ;
                 int n2 = 0 ;
                 int n3 = 0 ;
@@ -933,8 +975,8 @@
             }
             
             //スクロール有効/無効 S
-            if(SerialBuffer[0] == 'S'){
-                unsigned char Sertemp1 = SerialBuffer[1];
+            if(ABuffer[0] == 'S'){
+                unsigned char Sertemp1 = ABuffer[1];
                 int n1 = 0 ;
                 int n = 0;
                 
@@ -951,11 +993,11 @@
             }
             
             //起動 Set
-            if(SerialBuffer[0] == 'S' && SerialBuffer[1] == 'e' && SerialBuffer[2] == 't'){
+            if(ABuffer[0] == 'S' && ABuffer[1] == 'e' && ABuffer[2] == 't'){
                 pc.printf("Set\r\n"); 
                 SDFileRead();
             }
-        
+        busyflag = false;
     }else{
       count++;
     }
@@ -967,6 +1009,7 @@
 int main(){
     Init(); // Set things up
     //Serial
+    
     pc.printf("Power ON\r\n");
     
     
@@ -1013,6 +1056,59 @@
     
     //起動時にスクロールデータを読み込み
     if(ScrollEnable == 1){
+
+    //test
+    //Initialize StopStationCode
+    for (int x = 0; x < MaxStopStation; x++){
+        StopStationCode[x]= 0;
+    }
+    
+    //SDRead StopStationCode
+    for(int i = 0; i < MaxStopStation; i++){
+
+        //停車駅コード取得
+        int test = 0;
+        int test2 = 0;
+        sprintf(SDFilePath,"/sd/E233/StopStationList/%d.bin",1);
+        FILE *fp = fopen(SDFilePath, "r");
+        if(fp == NULL) {
+            pc.printf("SDFileOpen Error %s\r\n",SDFilePath);
+            break;
+            
+        }else{
+            //pc.printf("SDFileOpen Success %s\r\n",SDFilePath);
+            fseek(fp, i*2, SEEK_SET);
+            test = getc(fp);
+            test = test << 8;
+
+            fseek(fp, i*2 + 1, SEEK_SET);
+            test2 = getc(fp); 
+            test = test ^ test2;
+            
+            StopStationCode[i] = test;
+            pc.printf("StopStationCode[%d]:%d\r\n",i,StopStationCode[i]);
+              
+        if(StopStationCode[i] == 0){
+            break;
+        }           
+            fclose(fp); 
+        }
+    }        
+        
+    //test end    
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
     //ScrollDebug
      ScrollWriteCount = 80;