Schnittstelle zur microSPS

Fork of com_0 by V09

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers com.cpp Source File

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