超乗合馬車電光掲示板用制御ソフトです。

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #pragma import __use_all_ctype
00002 
00003 #include "mbed.h"
00004 #include <string.h>
00005 #include "displayCom.h"
00006 #include "15x16fontsLib.h"
00007 
00008 #define StrsBufSize (1024)
00009 
00010 DigitalOut PowerLED(LED1);
00011 DigitalOut RunLED(LED2);
00012 
00013 SPI spi(p5, NC, p7);        //mosi, miso, sclk
00014 BusOut buffer_CS(p23,p22,p21);
00015 
00016 Serial pc(USBTX, USBRX);    // tx, rx
00017 
00018 //#define _USE_LocalFileRead
00019 #ifdef _USE_LocalFileRead
00020 LocalFileSystem local("local");
00021 #endif
00022 
00023 unsigned int ImageBuf[DISPLAY_XSIZE];//16*6
00024 unsigned int ColerMap[DISPLAY_XSIZE];
00025 
00026 unsigned int CountChar(char *str)
00027 {
00028     unsigned char   f_SJISChar = 0;
00029     unsigned char   c = 0;
00030     unsigned int    CountChar = 0;
00031 
00032     c = *str;
00033     while(c != '\0')
00034     {
00035         //2バイト文字の判定
00036         if( ((0x81 <= c && c <= 0x9f) || (0xe0 <= c && c <= 0xfc)) && f_SJISChar != 1 )
00037         {
00038             f_SJISChar = 1;
00039         }
00040         else
00041         {
00042             f_SJISChar = 0;
00043             CountChar++;
00044         }
00045         str++;
00046         c = *str;
00047     }
00048     return CountChar;
00049 }
00050 
00051 void SPILineOut(unsigned char setLine)
00052 {
00053     unsigned int data = 0;
00054     data|= ImageBuf[setLine];
00055     spi.write(data);
00056 }
00057 
00058 void outBordData()
00059 {
00060     unsigned char ch = 0,Max_ch=0;
00061     unsigned int i = 0;
00062     Max_ch = (DISPLAY_XSIZE-16)/16;
00063     for(ch=0;ch<=Max_ch;ch++)
00064     {
00065         buffer_CS = ch;
00066         wait_us(10);
00067         for(i=(ch*16);i<(ch*16+16);i++)
00068         {
00069             SPILineOut(i);
00070         }
00071         wait_us(10);
00072     }
00073 }
00074 
00075 void bufLeftShift_Loop(void)
00076 {
00077     signed int i = 0;
00078    
00079     for(i=(DISPLAY_XSIZE-1);i>=1;i--)
00080     {
00081         ImageBuf[i] = ImageBuf[i-1];
00082     }
00083     ImageBuf[0] = ImageBuf[(DISPLAY_XSIZE-1)];
00084 
00085 }
00086 
00087 void bufLeftShift(void)
00088 {
00089     signed int i = 0;
00090 
00091     for(i=(DISPLAY_XSIZE-1);i>=1;i--)
00092     {
00093         ImageBuf[i] = ImageBuf[i-1];
00094     }
00095     ImageBuf[0] = 0;
00096 }
00097 
00098 void TestMode(void)
00099 {
00100     unsigned char i = 0;
00101     
00102     for(i=0;i<16;i++)
00103     {
00104         ImageBuf[i] = 0xffff;
00105     }
00106 
00107     outBordData();
00108     
00109     while(1)
00110     {
00111         wait(0.1);
00112         bufLeftShift_Loop();
00113         outBordData();
00114     }
00115 }
00116 /********************************************************/
00117 //Special Function
00118 /********************************************************/
00119 char PC_RcevStrs[StrsBufSize];
00120 char f_PCInput = 0;
00121 unsigned int c_PC_RcevStrs = 0;
00122 unsigned char func_mode = 0;
00123 
00124 void callback() {
00125     PC_RcevStrs[c_PC_RcevStrs] = pc.getc();
00126 
00127     func_mode = 0;
00128 
00129     if(PC_RcevStrs[c_PC_RcevStrs] == 0x1b)  //Esc key
00130     {
00131         memset(PC_RcevStrs,0,sizeof(PC_RcevStrs));
00132         c_PC_RcevStrs = 0;
00133         pc.printf("All Strs Clear!\r\n");
00134     }
00135     else if(PC_RcevStrs[c_PC_RcevStrs] == '\r')
00136     {
00137         pc.printf("RecvStrsEnd\r\n");
00138         PC_RcevStrs[c_PC_RcevStrs] = '\0';
00139         f_PCInput = 1;
00140         c_PC_RcevStrs = 0;
00141     }
00142     else if( PC_RcevStrs[c_PC_RcevStrs] == 0x08 )   //BackSpace key
00143     {
00144         if(c_PC_RcevStrs >= 1)
00145         {
00146             PC_RcevStrs[c_PC_RcevStrs] = '\0';
00147             PC_RcevStrs[c_PC_RcevStrs-1] = '\0';
00148             c_PC_RcevStrs--;
00149         }
00150     }
00151     else if(PC_RcevStrs[c_PC_RcevStrs] == 0x10) //DLE ^P
00152     {
00153         pc.printf("All LED ON Mode!\r\n");
00154         func_mode = 1;
00155         c_PC_RcevStrs = 0;
00156     }
00157     else
00158     {
00159         if( !(c_PC_RcevStrs >= StrsBufSize) )
00160         {
00161             c_PC_RcevStrs++;
00162         }
00163         else
00164         {
00165             pc.printf("Buf Over Size!!!\r\n");      
00166         }
00167     }
00168 
00169     if(c_PC_RcevStrs >= 1 )     //char入力処理結果表示
00170     {
00171         if( PC_RcevStrs[c_PC_RcevStrs-1] != '\r' )
00172         {
00173             pc.printf("rcevStrs=%s\r\n",PC_RcevStrs);
00174             pc.printf("rcevCnt=%d\r\n",c_PC_RcevStrs);
00175         }
00176     }
00177 }
00178 
00179 void TestMode_FullON(void)
00180 {
00181     memset(ImageBuf,0xffff,sizeof(ImageBuf));
00182     wait(0.1);
00183     outBordData();
00184 }
00185 
00186 int main()
00187 {
00188     unsigned int i = 0;
00189     unsigned int StrsDotSize = 0;
00190     char strs[StrsBufSize]={0x48,0x65,0x6c,0x6c,0x6f,0x57,0x6f,0x72,0x6c,0x64,0x21,0x20,0x83,0x6a,0x83,0x52,
00191                     0x83,0x6a,0x83,0x52,0x8b,0x5a,0x8f,0x70,0x95,0x94,0x00};
00192     PowerLED = 1;
00193 
00194     pc.baud(115200);
00195     pc.attach(&callback);
00196 
00197     spi.format(16,1);
00198     spi.frequency(500000);
00199 
00200 //************************USE Local File Sys************************************//
00201 #ifdef _USE_LocalFileRead
00202     memset(strs,' ',sizeof(strs));
00203     // Read text file for display message, if exist.
00204     FILE *fp;
00205     fp = fopen("/local/message.txt", "r"); 
00206     if (fp != NULL) {
00207         fgets(strs, sizeof(strs), fp);
00208         fclose(fp);
00209 #if defined(__MICROLIB) && defined(__ARMCC_VERSION) // with microlib and ARM compiler
00210         free(fp);
00211 #endif
00212 
00213 #endif
00214 //************************USE Local File Sys end********************************//
00215 
00216     memset(ImageBuf,0,sizeof(ImageBuf));
00217 
00218     wait(1);
00219     RunLED = 1;
00220 
00221     //TestMode();
00222 
00223     while(1)
00224     {
00225         memset(ImageBuf,0,sizeof(ImageBuf));
00226 
00227         if(f_PCInput == 1)  //char proccses
00228         {
00229             memcpy(strs, PC_RcevStrs, sizeof(strs));    //Set Strs
00230             memset(PC_RcevStrs,0,sizeof(PC_RcevStrs));  //Clear PC Rcev Buff
00231             c_PC_RcevStrs = 0;
00232             f_PCInput = 0;
00233         }
00234         while(func_mode == 1)
00235         {
00236             TestMode_FullON();
00237         }
00238         StrsDotSize = 8*strlen(strs);
00239 
00240         for(i=0;i<(DISPLAY_XSIZE+StrsDotSize);i++)
00241         {
00242             drawStr15x16(strs ,i);
00243             outBordData();
00244             wait_ms(20);
00245             if(f_PCInput == 1)  //break to char proccses
00246             {
00247                 f_PCInput = 1;
00248                 break;
00249             }
00250         }
00251     }
00252 }