Schnittstelle zur microSPS
Fork of com_0 by
Embed:
(wiki syntax)
Show/hide line numbers
com.cpp
00001 00002 //--------------------------------------------------------------------------- 00003 // Modul...: COM.CPP 00004 // Chip....: KL25Z 00005 // 00006 //--------------------------------------------------------------------------- 00007 // Author..: Reinhold Schäfer 00008 // Date....: 2014.06.08 00009 // http....: //www.microsps.net 00010 //--------------------------------------------------------------------------- 00011 #include <stdarg.h> 00012 #include <ctype.h> 00013 #include "mon.h" 00014 #include "MODSERIAL.h" 00015 #include "SDFileSystem.h" 00016 #include "FATDirHandle.h" 00017 #include "myTextLCD.h" 00018 #include "timer0.h" 00019 00020 #define LED_OFF 1 00021 #define LED_ON 0 00022 #define COM_LINE_LEN 128 // maximale Länge der Eingabezeile 00023 #define TEL_SIZE 10 00024 00025 #define XON 0x11 00026 #define XOFF 0x13 00027 00028 struct com_struct 00029 { 00030 uint8_t flag; // Flag zur Steuerung 00031 uint8_t sm; // State maschine 00032 uint8_t index; // Index für Zeichenzähler 00033 uint8_t len; // Zeichenzähler für Telegramlänge 00034 uint8_t nr; // Zähler für array 00035 uint8_t byte[10]; // Bytes für Zwischenablage 00036 char line[COM_LINE_LEN]; 00037 }; 00038 00039 extern MODSERIAL pc; // definiert in main 00040 extern MODSERIAL uart1; // definiert in main, tx, rx 00041 extern TextLCD lcd; 00042 extern timer0 down_timer; // Timer für Zeitsteuerung 00043 extern DigitalOut led3; // definiert in main 00044 extern DigitalOut lcd_bl; // definiert in main, Hintergrundbeleuchtung 00045 extern PwmOut lcd_kontrast; // Kontrast wird über PWM gesteuert 00046 00047 // Bitposition und Belegung 00048 // bit 1 CR Flag 00049 // bit 2 byte speichern 00050 // bit 4 00051 // bit 8 00052 00053 struct com_struct com; // Schnittstelle zur microSPS 00054 00055 void com_init(void) 00056 { 00057 uint8_t i; 00058 00059 led3 = LED_OFF; 00060 00061 00062 // Speicher für die Eingangszeile löschen 00063 for (i=0; i < COM_LINE_LEN; i++) 00064 { 00065 com.line[i] = 0; 00066 } 00067 com.flag = 0; 00068 com.sm = 0; 00069 com.index = 0; 00070 } 00071 00072 // Bitposition und Belegung 00073 // bit 1 Daten speichern in aktion 00074 // bit 2 Datei anlegen 00075 // bit 4 Daten schreiben 00076 // bit 8 Datei schließen 00077 00078 00079 // In dieser therad werden Daten aus der Seriellen Schnittstelle gelesen. Nach dem lesen 00080 // von einem Telegramm wird dieses falls es für das Speicher verwendet wird in m_msd abgelegt. 00081 // Die anderen Telergamme und die Antworten werde in dieser thread gleich bearbeitet. 00082 00083 void com_line(void) 00084 { 00085 00086 char ch; 00087 uint8_t n; 00088 int i; 00089 FILE *fp; 00090 00091 while (true) 00092 { 00093 if (uart1.readable()) 00094 { 00095 led3 = 0; 00096 00097 // Falls mehr Zeichen ankommen als verarbeitet werden, wird die microSPS gebremst 00098 //i = uart1.rxBufferGetCount(); 00099 //if (i > 800) // buffer hat 1014 Zeichen 00100 //{ 00101 // uart1.putc(XOFF); 00102 // pc.printf("\nrxBuffer XOFF %d",i); 00103 //} 00104 00105 //---------------------------------------------------------------------------------------------------- 00106 // Eingehende Zeichen lesen und abspeichern 00107 00108 ch = uart1.getc(); // Zeichen lesen und auswerten 00109 // pc.printf("\ntel> SM[%02d]",com.sm); 00110 00111 com.line[com.index] = ch; // Zeichen einfuegen 00112 com.index++; // Zeichenzähler erhöhen 00113 if (com.index >= 80) com.sm = 100; // ein Telegramm enthält maximal 80 Zeichen 00114 /* 00115 for (i = 0; i < com.index; i++) 00116 { 00117 pc.printf(" %02x",com.line[i]); 00118 } 00119 00120 pc.printf("\n"); 00121 */ 00122 //---------------------------------------------------------------------------------------------------- 00123 // auf Startzeichen auswerten 00124 00125 switch (com.sm) // com.sm ist state machine 00126 { 00127 case 0 : // erstes Zeichen aus einem Telegramm 00128 00129 if (ch == 0xE5) com.sm = 1; // Telegramm erstes Startzeichen wurde erkannt 00130 if (ch == 0x00) com.sm = 100; // 0 ist kein gültiges Telegramm 00131 break; 00132 00133 case 1 : // zweites Zeichen aus einem Telegramm 00134 00135 if (ch == 0x02) com.sm = 2; // Telegramm zweites Startzeichen wurde erkannt 00136 if (ch != 0x02) com.sm = 100; // 0 ist kein gültiges Telegramm 00137 break; 00138 00139 case 2 : // Command byte auswerten 00140 00141 switch(ch) 00142 { 00143 case 0x00: 00144 com.sm = 100; // bei 0 wieder von vorne starten 00145 break; 00146 00147 case 0x04: // RESET Kennung 00148 case 0x06: // Zeit Stempel lesen 00149 case 0x10: // LCD löschen 00150 case 0x11: // Hintergundbeleuchtung aus 00151 case 0x12: // Hintergundbeleuchtung an 00152 case 0x13: // Cursor setzen 00153 case 0x14: // Text für die LCD Anzeige 00154 com.sm = 5; // nur ein Zeichen 00155 break; 00156 00157 case 0x15: // Text für die LCD Anzeige mit Positionsangabe 00158 case 0x20: 00159 com.sm = 5; 00160 break; 00161 00162 default: // Zeichen zum abspeichern 00163 uart1.puts("\nsm CMD unbekannt"); 00164 com.sm = 12; // Speicher löschen 00165 break; 00166 00167 } // ende SWITCH 00168 00169 break; // end case 0: 00170 00171 case 5: // Telegrammlänge ermitteln, danach folgt Text 00172 00173 com.len = ch; 00174 com.nr = 0; 00175 if (com.len == 0xff) 00176 { 00177 com.sm = 11; 00178 } 00179 else 00180 { 00181 com.sm = 7; 00182 } 00183 break; 00184 00185 case 7: // Index Zeichen lesen 00186 com.byte[com.nr] = ch, 00187 com.nr++; 00188 com.len--; 00189 if (com.len == 0) 00190 { 00191 com.sm = 12; 00192 00193 // Telegramm zum Testen ausgeben 00194 /* 00195 pc.printf("\ntel: "); 00196 for(i=0; i <= com.index; i++) 00197 { 00198 pc.printf(" %02x",com.line[i]); 00199 } 00200 */ 00201 } 00202 break; 00203 00204 case 11: 00205 //---------------------------------------------------------------------------------------------------- 00206 // bis Abschlussbit alle Zeichen lesen und bei Abschlußzeichen die Auswertung angehen 00207 // bei einer Zeichenkette bis 00 lesen 00208 00209 if (ch == 0x00) 00210 { 00211 com.sm = 12; 00212 00213 // Telegramm zum Testen ausgeben 00214 /* 00215 pc.printf("\ntel "); 00216 for(i=0; i < com.index; i++) 00217 { 00218 pc.printf(" %02x",com.line[i]); 00219 } 00220 */ 00221 } 00222 00223 break; // end case 1: 00224 00225 } // end switch 00226 00227 //---------------------------------------------------------------------------------------------------- 00228 // Hier werden die Telegramme ausgewertet 00229 00230 if (com.sm == 12) // Hardware Reset 00231 { 00232 switch (com.line[2]) 00233 { 00234 case 0x04: 00235 char buffer[40]; 00236 fp = fopen("/sd/log.txt", "a"); 00237 if(fp == NULL) 00238 { 00239 pc.printf("\ncom_line #4 Could not open file for write"); 00240 } 00241 else 00242 { 00243 strftime(buffer, 40, "%a,%d.%m.%Y %H:%M:%S", localtime(&down_timer.seconds)); 00244 fprintf(fp, "\n%s Reset %02x ", buffer,com.line[4]); 00245 } 00246 fclose(fp); 00247 pc.printf("\n%s RESET %02x\n",buffer,com.line[4]); 00248 break; 00249 00250 case 0x06: // Systemzeit setzen 00251 com.line[9] += 80; // Zeitstempel für Jahr ist beim RTC 1980 und bei kl25z 1900 00252 // 00253 // pc.printf("\n telegramm #6 "); 00254 // for (i = 0; i < 12; i++) 00255 // { 00256 // pc.printf(" %02x",com.line[i]); 00257 // } 00258 // pc.printf("\n"); 00259 down_timer.Set_t((uint8_t *)&com.line[4]); 00260 break; 00261 00262 case 0x10: // LCD löschen 00263 lcd.cls(); 00264 break; 00265 00266 case 0x11 : // LCD backlight off 00267 lcd_bl = 0; 00268 break; 00269 00270 case 0x12 : // LCD backlight on 00271 lcd_bl = 1; 00272 break; 00273 00274 case 0x13: // Cursor setzen 00275 //pc.printf("\nCursor setzen %d %d",com.line[4],com.line[5]); 00276 lcd.locate(com.line[4], com.line[5]); 00277 break; 00278 00279 case 0x14: // Text auf LCD ausgeben 00280 //pc.printf("\nLCD '%s'",&com.line[4]); 00281 lcd.printf("%s",&com.line[4]); 00282 lcd.writeLCD(); 00283 break; 00284 00285 case 0x15: // Text auf LCD ausgeben 00286 lcd.locate(com.byte[0], com.byte[1]); 00287 lcd.printf("%s",&com.line[6]); 00288 lcd.writeLCD(); 00289 break; 00290 00291 case 0x20: 00292 char name[] = "/sd/SD_000.CSV"; // create a file name 00293 00294 // Dateiname bilden 00295 uint8_t index = com.byte[0]; 00296 n = index / 100; 00297 name[7] = n + '0'; 00298 index -= n * 100; 00299 name[8] = index/10 + '0'; 00300 name[9] = index%10 + '0'; 00301 00302 // Daten abspeichern 00303 fp = fopen(name, "a"); 00304 if(fp == NULL) 00305 { 00306 pc.printf("\ncom_line #20 Could not open file for append"); 00307 } 00308 else 00309 { 00310 fprintf(fp, "%s",&com.line[5]); 00311 // pc.printf("\nfile %d %s",com.byte[0],&com.line[5]); 00312 } 00313 fclose(fp); 00314 break; 00315 00316 default: // ungültiges Telegram 00317 00318 pc.printf("\nTelegramm 02 ungueltiges Zeichen %02x\n",com.line[2]); 00319 break; 00320 } // end switch 00321 00322 com.sm = 100; // Eingabe wieder löschen 00323 00324 } // end if (com.sm == 8) 00325 00326 00327 //---------------------------------------------------------------------------------------------------- 00328 // Zeile wieder löschen 00329 00330 if (com.sm == 100) 00331 { 00332 // uart1.puts("\nsm 12 Speicher loeschen"); 00333 00334 for (i = 0; i < COM_LINE_LEN; i++) com.line[i] = 0x00; 00335 00336 com.index = 0; 00337 com.flag = 0; 00338 com.sm = 0; 00339 break; // nach einem Befehl wieder zum Hauptprogramm verzweigen 00340 } 00341 00342 } // end if (uart1.readabel 00343 else break; 00344 00345 } // end while(1) 00346 00347 led3 = 1; 00348 } 00349 00350 00351
Generated on Fri Jul 15 2022 19:47:35 by 1.7.2