超乗合馬車電光掲示板用制御ソフトです。
Embed:
(wiki syntax)
Show/hide line numbers
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 }
Generated on Sat Aug 6 2022 07:51:11 by 1.7.2