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

Dependencies:   SDFileSystem mbed

Revision:
24:7232abdf7884
Parent:
23:6fb1181345a7
Child:
25:8b1da0f21d32
--- a/main.cpp	Thu Dec 04 12:28:33 2014 +0000
+++ b/main.cpp	Sun Jan 04 16:01:31 2015 +0000
@@ -50,6 +50,9 @@
 
 #define DisplayWait 15
 
+//最大停車駅数
+#define MaxStopStation 100
+
 SDFileSystem sd(D11, D12, D13, D10, "sd");
 Serial pc(USBTX,USBRX );
 BusOut ABC(D8,D9,PB_13,PC_5); // Row address.
@@ -112,13 +115,13 @@
 int DisplayMode = 1;
 
 //スクロール有効/無効(テスト用)
-bool Scroll = 1;
+bool Scroll = 0;
 
 
 int ChangeCount = 0;
-int LineNumber = 37;
-int KindNumber = 1;
-int ForNumber = 1;
+int LineNumber = 12;
+int KindNumber = 22;
+int ForNumber = 114;
 int NextStaNumber = 1;
 char SerialBuffer[30];
 int count = 0;
@@ -135,7 +138,10 @@
 unsigned char gm[32][6]; // Buffer with 32x6 bytes. Graphics memory if you like.
 unsigned long CT; //        Counter for demo code
 
-int StopStationCode[100] = {2,3,7,11,14,20,24,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,0};
+//int StopStationCode[MaxStopStation] = {2,3,7,11,14,20,24,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,0};
+//Keihin-Tohoku Rapid Ofuna
+//int StopStationCode[MaxStopStation] = {202,203,204,205,206,207,208,209,210,211,212,213,214,218,220,222,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,0};
+int StopStationCode[MaxStopStation] = {320,319,318,317,316,315,314,313,312,311,310,309,308,307,306,305,304,303,302,301,351,352,353,354,355,356,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,0};
 int StationNameLength[100] = {0,2,2,4,3,3,3,3,3,4,3,2,3,3,2,3,4,2,3,3,2,3,4,5,3,4,2,2,2,2,3,4,2,3,2,3,3,2,2,2,2,3,3,2,2,3,3,7,4,2,3,1,5,3,3,3,8,3}; 
 
 
@@ -306,20 +312,21 @@
 
 //16 Green(Utsunomiya Line)
 //17 Green(Joban Local Local)
-bool R1Data1[32]={0,1,0,0,1,0,1,1,0,1,1,1,1,0,1,1,0,0};
-bool R1Data2[32]={0,1,0,0,1,0,1,1,0,1,1,0,1,0,0,0,0,0};
-bool R1Data3[32]={0,1,0,0,1,0,1,1,0,1,1,0,1,0,0,0,0,0};
-bool R1Data4[32]={0,1,0,0,1,0,1,1,0,1,0,0,1,0,0,0,0,0};
+//18 Keikyu Logo(Gray
+bool R1Data1[32]={0,1,0,0,1,0,1,1,0,1,1,1,1,0,1,1,0,0,1};
+bool R1Data2[32]={0,1,0,0,1,0,1,1,0,1,1,0,1,0,0,0,0,0,1};
+bool R1Data3[32]={0,1,0,0,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0};
+bool R1Data4[32]={0,1,0,0,1,0,1,1,0,1,0,0,1,0,0,0,0,0,0};
 
-bool G1Data1[32]={0,0,1,0,1,1,0,1,1,0,1,1,1,1,0,1,1,1};
-bool G1Data2[32]={0,0,1,0,1,1,0,1,1,0,1,1,0,0,0,0,1,1};
-bool G1Data3[32]={0,0,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,1};
-bool G1Data4[32]={0,0,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,1};
+bool G1Data1[32]={0,0,1,0,1,1,0,1,1,0,1,1,1,1,0,1,1,1,1};
+bool G1Data2[32]={0,0,1,0,1,1,0,1,1,0,1,1,0,0,0,0,1,1,1};
+bool G1Data3[32]={0,0,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,1,0};
+bool G1Data4[32]={0,0,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,1,0};
 
-bool B1Data1[32]={0,0,0,1,0,1,1,1,1,1,0,0,0,0,0,1,0,1};
-bool B1Data2[32]={0,0,0,1,0,1,1,1,1,0,0,0,0,0,0,0,0,1};
-bool B1Data3[32]={0,0,0,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0};
-bool B1Data4[32]={0,0,0,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0};
+bool B1Data1[32]={0,0,0,1,0,1,1,1,1,1,0,0,0,0,0,1,0,1,1};
+bool B1Data2[32]={0,0,0,1,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1};
+bool B1Data3[32]={0,0,0,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0};
+bool B1Data4[32]={0,0,0,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0};
 
   
 
@@ -613,6 +620,7 @@
 
 
 void TimerTick(){
+    //OE = HIGH;
     
     //DisplayMode = 1 3段階表示ならば
     if(DisplayMode == 1){
@@ -632,7 +640,8 @@
     }
     //DisplayMode = 2 2段階表示ならば
     //次駅表示なし2段階表示に使用
-    else if (DisplayMode == 2){
+    
+    if (DisplayMode == 2){
         
         if(ChangeCount == 0 ){
             CopyBuffer(LEDBuffer,LEDMainBuffer);
@@ -646,13 +655,13 @@
         }    
     }
     //DisplayMode = 3 ならば LEDBuffer2を固定表示
-    else if (DisplayMode == 3){
+    if (DisplayMode == 3){
         CopyBuffer(LEDBuffer2,LEDMainBuffer);
         ChangeCount = 1;
     }
     
     //2段階表示 次駅表示あり、路線名なしパターンに使用
-    else if(DisplayMode == 4){    
+    if(DisplayMode == 4){    
         if(ChangeCount == 1 ){
             CopyBuffer(LEDBuffer2,LEDMainBuffer);
             ChangeCount = ChangeCount + 1;
@@ -661,6 +670,8 @@
             ChangeCount = 1;
         }  
     }
+    
+    //OE = LOW;
 }
 
 void ScrollTimerTick(){
@@ -699,14 +710,13 @@
 //スクロールバッファへの書込み用 読み出し高さは16固定
 //書込み対象バッファ,書込み開始位置x,書込み開始位置y,読み出し幅x,読み出し高さy
 void SDScrollBufferWrite(int8_t TargetBuffer[16][2048], int Startx, int Starty, int Readx, int Ready){
-    pc.printf("SDScrollBufferWrite\r\n");
+    //pc.printf("SDScrollBufferWrite\r\n");
     FILE *fp = fopen(SDFilePath, "r");
         if(fp == NULL) {
             pc.printf("SDFileOpen Error %s\r\n",SDFilePath);
             //error("Could not open file for write\r\n");
         }else{
-            //fprintf(fp, "Hello fun SD Card World!");
-            pc.printf("SDFileOpen Success %s\r\n",SDFilePath);
+            //pc.printf("SDFileOpen Success %s\r\n",SDFilePath);
         
             //SDDataReadtest
             int8_t Data;
@@ -804,7 +814,8 @@
     }else{
         DisplayMode = 1;
     }
-        
+    
+    //2段階(次駅なし)
     //次駅コードが0なら次駅なしの2段階表示に変更
     // 2段階表示 LEDBuffer  [種別]路線名
     //                       LEDBuffer2 [種別]行先(次駅表示なし) 
@@ -832,6 +843,23 @@
         }    
     }
     
+    
+    //全面種別固定表示
+    //路線名、行先、次駅がすべて0なら種別を全面に固定表示
+    if(LineNumber == 0 && ForNumber == 0 && NextStaNumber == 0){
+        
+        //種別
+        sprintf(SDFilePath,"/sd/E233/Kind/%d.bin",KindNumber);
+        SDBufferWrite(LEDBuffer2,0,0,48,32);
+        sprintf(SDFilePath,"/sd/E233/Kind2/%d.bin",KindNumber);
+        SDBufferWrite(LEDBuffer2,0,0,128,32);        
+  
+        //固定表示に変更       
+        DisplayMode = 3;
+    }
+    
+    
+    
     //WriteMode = 3 固定表示 LEDBuffer2 行先(次駅表示なし 32x128)
     //else if(WriteMode == 3){
     if(WriteMode == 3){
@@ -875,7 +903,8 @@
         if (count > 30 || SerialBuffer[count] == '$') { // 文字数が既定の個数を超えた場合、又は終了文字を受信した場合
             SerialBuffer[count] = '\0';                    // 末尾に終端文字を入れる
             count = 0; 
-    
+            
+            //路線名 L
             if(SerialBuffer[0] == 'L'){
                 unsigned char Sertemp1 = SerialBuffer[1];
                 unsigned char Sertemp2 = SerialBuffer[2];
@@ -909,6 +938,7 @@
                 pc.printf("Line:%d\r\n",n);     
             }
             
+            //種別 K
             if(SerialBuffer[0] == 'K'){
                 unsigned char Sertemp1 = SerialBuffer[1];
                 unsigned char Sertemp2 = SerialBuffer[2];
@@ -942,6 +972,7 @@
                 pc.printf("Kind:%d\r\n",n);     
             }
             
+            //行先 F
             if(SerialBuffer[0] == 'F'){
                 unsigned char Sertemp1 = SerialBuffer[1];
                 unsigned char Sertemp2 = SerialBuffer[2];
@@ -975,6 +1006,7 @@
                 pc.printf("For:%d\r\n",n);     
             }
             
+            //次停車駅 K
             if(SerialBuffer[0] == 'N'){
                 unsigned char Sertemp1 = SerialBuffer[1];
                 unsigned char Sertemp2 = SerialBuffer[2];
@@ -1008,6 +1040,25 @@
                 pc.printf("NextStation:%d\r\n",n);     
             }
             
+            //スクロール有効/無効 S
+            if(SerialBuffer[0] == 'S'){
+                unsigned char Sertemp1 = SerialBuffer[1];
+                int n1 = 0 ;
+                int n = 0;
+                
+                if ( Sertemp1 < '0' || Sertemp1 > '9' ) {
+                    // error
+                } else {
+                    n1 = (int)(Sertemp1 - '0') ;
+                    //pc.printf("%d,",n1); 
+                } 
+                     
+                n = n1;
+                Scroll = n;
+                pc.printf("Scroll:%d\r\n",n);     
+            }
+            
+            //起動 Set
             if(SerialBuffer[0] == 'S' && SerialBuffer[1] == 'e' && SerialBuffer[2] == 't'){
                 pc.printf("Set\r\n"); 
                 SDFileRead();
@@ -1077,16 +1128,31 @@
     sprintf(SDFilePath,"/sd/E233/StopStation/StopStation%d.bin",2);
     SDScrollBufferWrite(ScrollBuffer,ScrollWriteCount,0,80,16);       
     ScrollWriteCount = ScrollWriteCount + 80;  
-    for(int i = 0; i < 100; i++){
-        
+
+    for(int i = 0; i < MaxStopStation; i++){        
         if(StopStationCode[i] == 0){
             break;
         }
         
         //駅名
         sprintf(SDFilePath,"/sd/E233/StationName/%d.bin",StopStationCode[i]);
-        SDScrollBufferWrite(ScrollBuffer,ScrollWriteCount,0,128,16);       
-        ScrollWriteCount = ScrollWriteCount + (StationNameLength[StopStationCode[i]] * 16);  
+        SDScrollBufferWrite(ScrollBuffer,ScrollWriteCount,0,128,16);
+        
+        //駅名文字数取得
+        int test = 0;
+        sprintf(SDFilePath,"/sd/E233/StationNameLength.bin");
+        FILE *fp = fopen(SDFilePath, "r");
+        if(fp == NULL) {
+            pc.printf("SDFileOpen Error %s\r\n",SDFilePath);
+        }else{
+            //pc.printf("SDFileOpen Success %s\r\n",SDFilePath);
+            fseek(fp, StopStationCode[i], SEEK_SET);
+            test = getc(fp);
+            //pc.printf("StationNameLength:%d\r\n",test);
+            fclose(fp); 
+        }
+               
+        ScrollWriteCount = ScrollWriteCount + (test * 16);  
         sprintf(SDFilePath,"/sd/E233/StopStation/0x8132.bin");
         SDScrollBufferWrite(ScrollBuffer,ScrollWriteCount,0,16,16);       
         ScrollWriteCount = ScrollWriteCount + 16;      
@@ -1122,8 +1188,8 @@
     }
     
     //test
-//    sprintf(SDFilePath,"/sd/E233/test.bin");
-//    SDBufferWrite(LEDBuffer,0,0,128,32);   
+    //sprintf(SDFilePath,"/sd/E233/test2.bin");
+    //SDBufferWrite(LEDBuffer,0,0,128,32);   
     
     
     //Serial