Speichern von Dateien auf einem Stick

Dependencies:   KL46Z-USBHost MODSERIAL-RTOS mbed-rtos mbed

Committer:
rs27
Date:
Sun May 11 15:23:50 2014 +0000
Revision:
0:dc4ad683fe77
erste Version 11/05/14

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rs27 0:dc4ad683fe77 1 //------------------------------------------------------------------------
rs27 0:dc4ad683fe77 2 //
rs27 0:dc4ad683fe77 3 // kl25z_USB_4
rs27 0:dc4ad683fe77 4 // Programm zum Speichern von Dateien auf einem memery Stick
rs27 0:dc4ad683fe77 5 //
rs27 0:dc4ad683fe77 6 // Erstellt am 10.05.14 R. Schäfer
rs27 0:dc4ad683fe77 7 //
rs27 0:dc4ad683fe77 8 #include "mbed.h"
rs27 0:dc4ad683fe77 9 #include "rtos.h"
rs27 0:dc4ad683fe77 10 #include "USBHostMSD.h"
rs27 0:dc4ad683fe77 11 #include "MODSERIAL.h"
rs27 0:dc4ad683fe77 12
rs27 0:dc4ad683fe77 13 #define LED_OFF 1
rs27 0:dc4ad683fe77 14 #define LED_ON 0
rs27 0:dc4ad683fe77 15 #define COM_LINE_LEN 128 // maximale Länge der Eingabezeile
rs27 0:dc4ad683fe77 16
rs27 0:dc4ad683fe77 17 struct com_struct {
rs27 0:dc4ad683fe77 18 uint8_t flag; // Flag zur Steuerung
rs27 0:dc4ad683fe77 19 uint8_t sm; // State maschine
rs27 0:dc4ad683fe77 20 uint8_t index; // Index für Zeichenzähler
rs27 0:dc4ad683fe77 21 char line[COM_LINE_LEN];
rs27 0:dc4ad683fe77 22 };
rs27 0:dc4ad683fe77 23
rs27 0:dc4ad683fe77 24 struct msd_struct {
rs27 0:dc4ad683fe77 25 bool connect; // wird bei Verbindung true
rs27 0:dc4ad683fe77 26 uint8_t flag; // Flag zur Steuerung
rs27 0:dc4ad683fe77 27 uint8_t sm; // State maschine
rs27 0:dc4ad683fe77 28 uint8_t index; // Index für Zeichenzähler
rs27 0:dc4ad683fe77 29 char line[COM_LINE_LEN];
rs27 0:dc4ad683fe77 30 };
rs27 0:dc4ad683fe77 31
rs27 0:dc4ad683fe77 32 extern "C" void NVIC_SystemReset();
rs27 0:dc4ad683fe77 33
rs27 0:dc4ad683fe77 34 Thread *(msdTaskp);
rs27 0:dc4ad683fe77 35
rs27 0:dc4ad683fe77 36 Serial pc(USBTX,USBRX);
rs27 0:dc4ad683fe77 37
rs27 0:dc4ad683fe77 38 // Make TX buffer 1024bytes and RX buffer use 512bytes.
rs27 0:dc4ad683fe77 39 // MODSERIAL uart1(PTA2, PTA1, 256, 1024); // tx, rx
rs27 0:dc4ad683fe77 40 MODSERIAL uart1(PTC4, PTC3, 128, 1024); // tx, rx
rs27 0:dc4ad683fe77 41
rs27 0:dc4ad683fe77 42 DigitalOut led1(PTB18);
rs27 0:dc4ad683fe77 43 DigitalOut led2(PTB19);
rs27 0:dc4ad683fe77 44 int err_counter = 0;
rs27 0:dc4ad683fe77 45
rs27 0:dc4ad683fe77 46 // ---- globle Veariablen ----------------------------------------------
rs27 0:dc4ad683fe77 47
rs27 0:dc4ad683fe77 48 // Bitposition und Belegung
rs27 0:dc4ad683fe77 49 // bit 1 CR Flag
rs27 0:dc4ad683fe77 50 // bit 2 byte speichern
rs27 0:dc4ad683fe77 51 // bit 4
rs27 0:dc4ad683fe77 52 // bit 8
rs27 0:dc4ad683fe77 53
rs27 0:dc4ad683fe77 54 struct com_struct com; // Eingangszeile
rs27 0:dc4ad683fe77 55
rs27 0:dc4ad683fe77 56 // Bitposition und Belegung
rs27 0:dc4ad683fe77 57 // bit 1 Daten speichern in aktion
rs27 0:dc4ad683fe77 58 // bit 2 Datei anlegen
rs27 0:dc4ad683fe77 59 // bit 4 Daten schreiben
rs27 0:dc4ad683fe77 60 // bit 8 Datei schließen
rs27 0:dc4ad683fe77 61
rs27 0:dc4ad683fe77 62 struct msd_struct m_msd; // Speicher für Stick
rs27 0:dc4ad683fe77 63
rs27 0:dc4ad683fe77 64 // mit dieser Task werden die Datem in Hintergrund im Stick abgespeichert
rs27 0:dc4ad683fe77 65 // es wird auch geprüft ob für das Speichern ein Stick vorhanden ist
rs27 0:dc4ad683fe77 66 // falls kein Stick erkannt wird, löst das Programm einen Reset aus, womit
rs27 0:dc4ad683fe77 67 // die USB Schnittstelle neu initialiesiert wird. Damit kann auch ein Stick
rs27 0:dc4ad683fe77 68 // im Betieb abgesteckt und wieder angestecht werden.
rs27 0:dc4ad683fe77 69 //
rs27 0:dc4ad683fe77 70 // Änderungen
rs27 0:dc4ad683fe77 71 // Thread Zeit reduzieren
rs27 0:dc4ad683fe77 72 // Dateinamen über globale Variable ersetzen
rs27 0:dc4ad683fe77 73
rs27 0:dc4ad683fe77 74 void msd_task(void const *)
rs27 0:dc4ad683fe77 75 {
rs27 0:dc4ad683fe77 76 int i = 0;
rs27 0:dc4ad683fe77 77 int n;
rs27 0:dc4ad683fe77 78 FILE * fp = 0;
rs27 0:dc4ad683fe77 79
rs27 0:dc4ad683fe77 80 USBHostMSD msd("usb");
rs27 0:dc4ad683fe77 81 err_counter = 0;
rs27 0:dc4ad683fe77 82
rs27 0:dc4ad683fe77 83 // in a loop, append a file
rs27 0:dc4ad683fe77 84 // if the device is disconnected, we try to connect it again
rs27 0:dc4ad683fe77 85 while(msd.connect())
rs27 0:dc4ad683fe77 86 {
rs27 0:dc4ad683fe77 87 m_msd.connect = true;
rs27 0:dc4ad683fe77 88 Thread::signal_wait(0x1);
rs27 0:dc4ad683fe77 89
rs27 0:dc4ad683fe77 90 // uart1.printf("\nmsd> ");
rs27 0:dc4ad683fe77 91 //
rs27 0:dc4ad683fe77 92 // for (i = 0; i < com.index; i++)
rs27 0:dc4ad683fe77 93 // {
rs27 0:dc4ad683fe77 94 // uart1.printf(" %02x",m_msd.line[i]);
rs27 0:dc4ad683fe77 95 // }
rs27 0:dc4ad683fe77 96
rs27 0:dc4ad683fe77 97 // uart1.printf("\n");
rs27 0:dc4ad683fe77 98
rs27 0:dc4ad683fe77 99 switch (m_msd.line[0])
rs27 0:dc4ad683fe77 100 {
rs27 0:dc4ad683fe77 101 case 02: // Datei anlegen
rs27 0:dc4ad683fe77 102
rs27 0:dc4ad683fe77 103 char buffer[40];
rs27 0:dc4ad683fe77 104 sprintf(buffer, "/usb/%s", &m_msd.line[1]);
rs27 0:dc4ad683fe77 105 fp = fopen(buffer, "w");
rs27 0:dc4ad683fe77 106
rs27 0:dc4ad683fe77 107 // uart1.printf("\nMSD Datei %s anlegen",buffer);
rs27 0:dc4ad683fe77 108
rs27 0:dc4ad683fe77 109 break;
rs27 0:dc4ad683fe77 110
rs27 0:dc4ad683fe77 111 case 03: // Daten schreiben
rs27 0:dc4ad683fe77 112
rs27 0:dc4ad683fe77 113 if (fp)
rs27 0:dc4ad683fe77 114 {
rs27 0:dc4ad683fe77 115 n = fprintf(fp,"%s",&m_msd.line[1]);
rs27 0:dc4ad683fe77 116 // uart1.printf("\nwrite file [%d] %s",n,&m_msd.line[1]);
rs27 0:dc4ad683fe77 117 } // if (fp ..
rs27 0:dc4ad683fe77 118
rs27 0:dc4ad683fe77 119 break;
rs27 0:dc4ad683fe77 120
rs27 0:dc4ad683fe77 121 case 04: // Datei schließen
rs27 0:dc4ad683fe77 122
rs27 0:dc4ad683fe77 123 if (fp) n = fclose(fp);
rs27 0:dc4ad683fe77 124 // uart1.printf("\n close file");
rs27 0:dc4ad683fe77 125 break;
rs27 0:dc4ad683fe77 126
rs27 0:dc4ad683fe77 127 } // end switch(msd-line[0]
rs27 0:dc4ad683fe77 128
rs27 0:dc4ad683fe77 129 // Speicher für die Zeile löschen
rs27 0:dc4ad683fe77 130 for (i=0; i < COM_LINE_LEN; i++) m_msd.line[i] = 0;
rs27 0:dc4ad683fe77 131 m_msd.flag &= ~0x01;
rs27 0:dc4ad683fe77 132
rs27 0:dc4ad683fe77 133 // if device disconnected, try to connect again
rs27 0:dc4ad683fe77 134 if (!msd.connected())
rs27 0:dc4ad683fe77 135 {
rs27 0:dc4ad683fe77 136 // uart1.printf("\n disconnected break");
rs27 0:dc4ad683fe77 137 m_msd.connect = false;
rs27 0:dc4ad683fe77 138 break;
rs27 0:dc4ad683fe77 139 }
rs27 0:dc4ad683fe77 140
rs27 0:dc4ad683fe77 141 } // end while (msd_connected)
rs27 0:dc4ad683fe77 142
rs27 0:dc4ad683fe77 143 // Task wird beendet
rs27 0:dc4ad683fe77 144 }
rs27 0:dc4ad683fe77 145
rs27 0:dc4ad683fe77 146 // In dieser therad werden Daten aus der Seriellen Schnittstelle gelesen. Nach dem lesen
rs27 0:dc4ad683fe77 147 // von einem Telegramm wird dieses falls es für das Speicher verwendet wird in m_msd abgelegt.
rs27 0:dc4ad683fe77 148 // Die anderen Telergamme und die Antworten werde in dieser thread gleich bearbeitet.
rs27 0:dc4ad683fe77 149
rs27 0:dc4ad683fe77 150 void com_thread(void const *args)
rs27 0:dc4ad683fe77 151 {
rs27 0:dc4ad683fe77 152 char ch;
rs27 0:dc4ad683fe77 153 int i;
rs27 0:dc4ad683fe77 154
rs27 0:dc4ad683fe77 155 while (true)
rs27 0:dc4ad683fe77 156 {
rs27 0:dc4ad683fe77 157 if ((uart1.readable()) && ((com.flag & 0x80) == 0))
rs27 0:dc4ad683fe77 158 {
rs27 0:dc4ad683fe77 159 //----------------------------------------------------------------------------------------------------
rs27 0:dc4ad683fe77 160 // Eingehende Zeichen lesen und abspeichern
rs27 0:dc4ad683fe77 161
rs27 0:dc4ad683fe77 162 ch = uart1.getc(); // Zeichen lesen und auswerten
rs27 0:dc4ad683fe77 163 // uart1.printf("\ntel> ");
rs27 0:dc4ad683fe77 164
rs27 0:dc4ad683fe77 165 com.line[com.index] = ch; // Zeichen einfuegen
rs27 0:dc4ad683fe77 166 com.index++; // Zeichenzähler erhöhen
rs27 0:dc4ad683fe77 167 if (com.index >= 125) com.sm = 2; // ein Telegramm enthält maximal 1125 Zeichen
rs27 0:dc4ad683fe77 168
rs27 0:dc4ad683fe77 169 // for (i = 0; i < com.index; i++)
rs27 0:dc4ad683fe77 170 // {
rs27 0:dc4ad683fe77 171 // uart1.printf(" %02x",com.line[i]);
rs27 0:dc4ad683fe77 172 // }
rs27 0:dc4ad683fe77 173
rs27 0:dc4ad683fe77 174 // uart1.printf("\n");
rs27 0:dc4ad683fe77 175
rs27 0:dc4ad683fe77 176 //----------------------------------------------------------------------------------------------------
rs27 0:dc4ad683fe77 177 // Abschlußbit auswerten und Telegramm umsetzen
rs27 0:dc4ad683fe77 178
rs27 0:dc4ad683fe77 179 switch (com.sm) // com.sm ist state machine
rs27 0:dc4ad683fe77 180 {
rs27 0:dc4ad683fe77 181 case 0 : // erstes Zeichen aus einem Telegramm
rs27 0:dc4ad683fe77 182
rs27 0:dc4ad683fe77 183 switch(ch)
rs27 0:dc4ad683fe77 184 {
rs27 0:dc4ad683fe77 185 case 0x00: // Endzeichen an erter Stelle zum testen
rs27 0:dc4ad683fe77 186 // uart1.puts("Telegramm 0x00\n"); // direkt ausführen
rs27 0:dc4ad683fe77 187 com.sm = 12; // neues Telegramm
rs27 0:dc4ad683fe77 188 break;
rs27 0:dc4ad683fe77 189
rs27 0:dc4ad683fe77 190 case 0x01: // Reset
rs27 0:dc4ad683fe77 191 // uart1.puts("Telegramm 0x01\n"); // direkt ausführen
rs27 0:dc4ad683fe77 192 com.sm = 12; // nur ein Zeichen
rs27 0:dc4ad683fe77 193 break;
rs27 0:dc4ad683fe77 194
rs27 0:dc4ad683fe77 195 case 0x02: // Datei anlegen und öffnen
rs27 0:dc4ad683fe77 196 com.sm = 1; // Kommando Byte abspeichern
rs27 0:dc4ad683fe77 197 break; // Dateinamen bis 0x00 lesen
rs27 0:dc4ad683fe77 198
rs27 0:dc4ad683fe77 199 case 0x03: // Daten schreiben
rs27 0:dc4ad683fe77 200 com.sm = 1; // Kommando Byte abspeichern
rs27 0:dc4ad683fe77 201 break; // Dateinamen bis 0x00 lesen
rs27 0:dc4ad683fe77 202
rs27 0:dc4ad683fe77 203 case 0x04: // Datei schließen
rs27 0:dc4ad683fe77 204 // uart1.puts("Telegramm 0x04\n"); // direkt ausführen
rs27 0:dc4ad683fe77 205 com.sm = 10; // Kommando besteht nur aus einem Zeichen
rs27 0:dc4ad683fe77 206 break;
rs27 0:dc4ad683fe77 207
rs27 0:dc4ad683fe77 208 case 0x05: // SD Stick erkannt, direkt ausführen
rs27 0:dc4ad683fe77 209 if (m_msd.connect)
rs27 0:dc4ad683fe77 210 uart1.puts("\nStick erkannt");
rs27 0:dc4ad683fe77 211 else
rs27 0:dc4ad683fe77 212 uart1.puts("\nStick nicht erkannt");
rs27 0:dc4ad683fe77 213
rs27 0:dc4ad683fe77 214 com.sm = 12; // Kommando besteht nur aus einem Zeichen
rs27 0:dc4ad683fe77 215 break;
rs27 0:dc4ad683fe77 216
rs27 0:dc4ad683fe77 217 default: // Zeichen zum abspeichern
rs27 0:dc4ad683fe77 218 // uart1.puts("\nsm 0 unbekannter Befehl");
rs27 0:dc4ad683fe77 219 com.sm = 12; // Speicher löschen
rs27 0:dc4ad683fe77 220 break;
rs27 0:dc4ad683fe77 221
rs27 0:dc4ad683fe77 222 } // ende SWITCH
rs27 0:dc4ad683fe77 223
rs27 0:dc4ad683fe77 224 break; // end case 0:
rs27 0:dc4ad683fe77 225
rs27 0:dc4ad683fe77 226 case 1: // Lesen von weitern Zeichen nach dem ersten Zeichen
rs27 0:dc4ad683fe77 227
rs27 0:dc4ad683fe77 228 //----------------------------------------------------------------------------------------------------
rs27 0:dc4ad683fe77 229 // bis Abschlussbit alle Zeichen lesen und bei Abschlußzeichen die Auswertung angehen
rs27 0:dc4ad683fe77 230
rs27 0:dc4ad683fe77 231 if (ch == 0x00)
rs27 0:dc4ad683fe77 232 {
rs27 0:dc4ad683fe77 233 com.sm = 10;
rs27 0:dc4ad683fe77 234 } // end if (ch == 0x00)
rs27 0:dc4ad683fe77 235
rs27 0:dc4ad683fe77 236 break; // end case 1:
rs27 0:dc4ad683fe77 237
rs27 0:dc4ad683fe77 238 case 2: // Zeichenkette ist länger als 125 Zeichen
rs27 0:dc4ad683fe77 239
rs27 0:dc4ad683fe77 240 // uart1.puts("\nsm 2 String ist groesser 125 Zeichen");
rs27 0:dc4ad683fe77 241 com.sm = 11;
rs27 0:dc4ad683fe77 242
rs27 0:dc4ad683fe77 243 break; // end case 2
rs27 0:dc4ad683fe77 244
rs27 0:dc4ad683fe77 245 } // end switch
rs27 0:dc4ad683fe77 246
rs27 0:dc4ad683fe77 247 //----------------------------------------------------------------------------------------------------
rs27 0:dc4ad683fe77 248 // Telegramme die an die Task msd weitergeleitet werden
rs27 0:dc4ad683fe77 249
rs27 0:dc4ad683fe77 250 if (com.sm == 10)
rs27 0:dc4ad683fe77 251 {
rs27 0:dc4ad683fe77 252 if ((m_msd.flag & 0x01) == 0)
rs27 0:dc4ad683fe77 253 {
rs27 0:dc4ad683fe77 254 // uart1.puts("\nsm 10 Speicher kopieren");
rs27 0:dc4ad683fe77 255
rs27 0:dc4ad683fe77 256 for (i = 0; i < COM_LINE_LEN; i++)
rs27 0:dc4ad683fe77 257 {
rs27 0:dc4ad683fe77 258 m_msd.line[i] = com.line[i];
rs27 0:dc4ad683fe77 259 if (com.line[i] == 0x00) break;
rs27 0:dc4ad683fe77 260 }
rs27 0:dc4ad683fe77 261
rs27 0:dc4ad683fe77 262 m_msd.flag = 0x01;
rs27 0:dc4ad683fe77 263 com.sm = 12;
rs27 0:dc4ad683fe77 264
rs27 0:dc4ad683fe77 265 msdTaskp->signal_set(0x1);
rs27 0:dc4ad683fe77 266 }
rs27 0:dc4ad683fe77 267 else
rs27 0:dc4ad683fe77 268 {
rs27 0:dc4ad683fe77 269 com.flag |= 0x80; // kann erst später gespeichert werden
rs27 0:dc4ad683fe77 270 }
rs27 0:dc4ad683fe77 271
rs27 0:dc4ad683fe77 272 }
rs27 0:dc4ad683fe77 273
rs27 0:dc4ad683fe77 274 //----------------------------------------------------------------------------------------------------
rs27 0:dc4ad683fe77 275 // bei mehr asl 125 Zeichen werden die Daten an die msd Task übergeben
rs27 0:dc4ad683fe77 276
rs27 0:dc4ad683fe77 277 if (com.sm == 11)
rs27 0:dc4ad683fe77 278 {
rs27 0:dc4ad683fe77 279 //----------------------------------------------------------------------------------------------------
rs27 0:dc4ad683fe77 280 // Daten abspeichern
rs27 0:dc4ad683fe77 281
rs27 0:dc4ad683fe77 282 if ((m_msd.flag & 0x01) == 0)
rs27 0:dc4ad683fe77 283 {
rs27 0:dc4ad683fe77 284 for (i = 0; i < COM_LINE_LEN; i++)
rs27 0:dc4ad683fe77 285 {
rs27 0:dc4ad683fe77 286 m_msd.line[i] = com.line[i];
rs27 0:dc4ad683fe77 287 if (com.line[i] == 0x00) break;
rs27 0:dc4ad683fe77 288 }
rs27 0:dc4ad683fe77 289
rs27 0:dc4ad683fe77 290 m_msd.flag = 0x01;
rs27 0:dc4ad683fe77 291 m_msd.sm = 0x03;
rs27 0:dc4ad683fe77 292
rs27 0:dc4ad683fe77 293 msdTaskp->signal_set(0x1);
rs27 0:dc4ad683fe77 294
rs27 0:dc4ad683fe77 295 for (i = 1; i < COM_LINE_LEN; i++) com.line[i] = 0x00;
rs27 0:dc4ad683fe77 296
rs27 0:dc4ad683fe77 297 com.index = 1;
rs27 0:dc4ad683fe77 298 com.sm = 1;
rs27 0:dc4ad683fe77 299
rs27 0:dc4ad683fe77 300 }
rs27 0:dc4ad683fe77 301 else
rs27 0:dc4ad683fe77 302 {
rs27 0:dc4ad683fe77 303 com.flag |= 0x80; // kann erst später gespeichert werden
rs27 0:dc4ad683fe77 304 }
rs27 0:dc4ad683fe77 305
rs27 0:dc4ad683fe77 306 } // end if com.sm == 11
rs27 0:dc4ad683fe77 307
rs27 0:dc4ad683fe77 308 //----------------------------------------------------------------------------------------------------
rs27 0:dc4ad683fe77 309 // Zeile wieder löschen
rs27 0:dc4ad683fe77 310
rs27 0:dc4ad683fe77 311 if (com.sm == 12)
rs27 0:dc4ad683fe77 312 {
rs27 0:dc4ad683fe77 313 // uart1.puts("\nsm 12 Speicher loeschen");
rs27 0:dc4ad683fe77 314
rs27 0:dc4ad683fe77 315 for (i = 0; i < COM_LINE_LEN; i++) com.line[i] = 0x00;
rs27 0:dc4ad683fe77 316
rs27 0:dc4ad683fe77 317 com.index = 0;
rs27 0:dc4ad683fe77 318 com.flag = 0;
rs27 0:dc4ad683fe77 319 com.sm = 0;
rs27 0:dc4ad683fe77 320 }
rs27 0:dc4ad683fe77 321
rs27 0:dc4ad683fe77 322
rs27 0:dc4ad683fe77 323 } // end if (uart1.readabel
rs27 0:dc4ad683fe77 324 else
rs27 0:dc4ad683fe77 325 {
rs27 0:dc4ad683fe77 326 //----------------------------------------------------------------------------------------------------
rs27 0:dc4ad683fe77 327 // prüfen ob die Daten auf dem Stick schon abgespeichert sind
rs27 0:dc4ad683fe77 328
rs27 0:dc4ad683fe77 329 if ((com.flag & 0x80) == 0x80)
rs27 0:dc4ad683fe77 330 {
rs27 0:dc4ad683fe77 331 if ((m_msd.flag & 0x01) == 0)
rs27 0:dc4ad683fe77 332 {
rs27 0:dc4ad683fe77 333 //----------------------------------------------------------------------------------------------------
rs27 0:dc4ad683fe77 334 // Telegramme die an die Task msd weitergeleitet werden
rs27 0:dc4ad683fe77 335
rs27 0:dc4ad683fe77 336 if (com.sm == 10)
rs27 0:dc4ad683fe77 337 {
rs27 0:dc4ad683fe77 338 for (i = 0; i < COM_LINE_LEN; i++)
rs27 0:dc4ad683fe77 339 {
rs27 0:dc4ad683fe77 340 m_msd.line[i] = com.line[i];
rs27 0:dc4ad683fe77 341 if (com.line[i] == 0x00) break;
rs27 0:dc4ad683fe77 342 }
rs27 0:dc4ad683fe77 343
rs27 0:dc4ad683fe77 344 m_msd.flag = 0x01;
rs27 0:dc4ad683fe77 345 com.sm = 12;
rs27 0:dc4ad683fe77 346
rs27 0:dc4ad683fe77 347 msdTaskp->signal_set(0x1);
rs27 0:dc4ad683fe77 348 }
rs27 0:dc4ad683fe77 349
rs27 0:dc4ad683fe77 350 if (com.sm == 11)
rs27 0:dc4ad683fe77 351 {
rs27 0:dc4ad683fe77 352 //----------------------------------------------------------------------------------------------------
rs27 0:dc4ad683fe77 353 // Daten abspeichern
rs27 0:dc4ad683fe77 354
rs27 0:dc4ad683fe77 355 for (i = 0; i < COM_LINE_LEN; i++)
rs27 0:dc4ad683fe77 356 {
rs27 0:dc4ad683fe77 357 m_msd.line[i] = com.line[i];
rs27 0:dc4ad683fe77 358 if (com.line[i] == 0x00) break;
rs27 0:dc4ad683fe77 359 }
rs27 0:dc4ad683fe77 360
rs27 0:dc4ad683fe77 361 m_msd.flag = 0x01;
rs27 0:dc4ad683fe77 362
rs27 0:dc4ad683fe77 363 msdTaskp->signal_set(0x1);
rs27 0:dc4ad683fe77 364
rs27 0:dc4ad683fe77 365 for (i = 1; i < COM_LINE_LEN; i++) com.line[i] = 0x00;
rs27 0:dc4ad683fe77 366
rs27 0:dc4ad683fe77 367 com.index = 1;
rs27 0:dc4ad683fe77 368 com.sm = 1;
rs27 0:dc4ad683fe77 369
rs27 0:dc4ad683fe77 370 } // end if com.sm == 11
rs27 0:dc4ad683fe77 371
rs27 0:dc4ad683fe77 372 //----------------------------------------------------------------------------------------------------
rs27 0:dc4ad683fe77 373 // Zeile wieder löschen
rs27 0:dc4ad683fe77 374
rs27 0:dc4ad683fe77 375 if (com.sm == 12)
rs27 0:dc4ad683fe77 376 {
rs27 0:dc4ad683fe77 377 // uart1.puts("\nsm 10 Speicher loeschen");
rs27 0:dc4ad683fe77 378
rs27 0:dc4ad683fe77 379 for (i = 0; i < COM_LINE_LEN; i++) com.line[i] = 0x00;
rs27 0:dc4ad683fe77 380
rs27 0:dc4ad683fe77 381 com.index = 0;
rs27 0:dc4ad683fe77 382 com.flag = 0;
rs27 0:dc4ad683fe77 383 com.sm = 0;
rs27 0:dc4ad683fe77 384 }
rs27 0:dc4ad683fe77 385 }
rs27 0:dc4ad683fe77 386 Thread::wait(10); // falls keine Zeichn mehr im Buffer 10 ms warten
rs27 0:dc4ad683fe77 387 }
rs27 0:dc4ad683fe77 388 else
rs27 0:dc4ad683fe77 389 {
rs27 0:dc4ad683fe77 390 Thread::wait(100); // falls keine Zeichn mehr im Buffer 10 ms warten
rs27 0:dc4ad683fe77 391 }
rs27 0:dc4ad683fe77 392 }
rs27 0:dc4ad683fe77 393
rs27 0:dc4ad683fe77 394 led2 = !led2;
rs27 0:dc4ad683fe77 395 }
rs27 0:dc4ad683fe77 396 }
rs27 0:dc4ad683fe77 397
rs27 0:dc4ad683fe77 398 //---------------------------------------------------------------------
rs27 0:dc4ad683fe77 399
rs27 0:dc4ad683fe77 400 int main()
rs27 0:dc4ad683fe77 401 {
rs27 0:dc4ad683fe77 402 int i;
rs27 0:dc4ad683fe77 403
rs27 0:dc4ad683fe77 404 // Speicher für die Eingangszeile löschen
rs27 0:dc4ad683fe77 405 for (i=0; i < COM_LINE_LEN; i++)
rs27 0:dc4ad683fe77 406 {
rs27 0:dc4ad683fe77 407 com.line[i] = 0;
rs27 0:dc4ad683fe77 408 }
rs27 0:dc4ad683fe77 409 com.flag = 0;
rs27 0:dc4ad683fe77 410 com.sm = 0;
rs27 0:dc4ad683fe77 411 com.index = 0;
rs27 0:dc4ad683fe77 412
rs27 0:dc4ad683fe77 413 // Speicher für den Stick Speicher löschen
rs27 0:dc4ad683fe77 414 for (i=0; i < COM_LINE_LEN; i++)
rs27 0:dc4ad683fe77 415 {
rs27 0:dc4ad683fe77 416 m_msd.line[i] = 0;
rs27 0:dc4ad683fe77 417 }
rs27 0:dc4ad683fe77 418 m_msd.connect = false;
rs27 0:dc4ad683fe77 419 m_msd.flag = 0;
rs27 0:dc4ad683fe77 420 m_msd.sm = 0;
rs27 0:dc4ad683fe77 421 m_msd.index = 0;
rs27 0:dc4ad683fe77 422
rs27 0:dc4ad683fe77 423 led2 = LED_OFF;
rs27 0:dc4ad683fe77 424
rs27 0:dc4ad683fe77 425 // Uhrzeit initialisieren
rs27 0:dc4ad683fe77 426 struct tm t;
rs27 0:dc4ad683fe77 427 t.tm_sec = 00; // 0-59
rs27 0:dc4ad683fe77 428 t.tm_min = 01; // 0-59
rs27 0:dc4ad683fe77 429 t.tm_hour = 11; // 0-23
rs27 0:dc4ad683fe77 430 t.tm_mday = 4; // 1-31
rs27 0:dc4ad683fe77 431 t.tm_mon = 2; // 0-11 0 = Januar
rs27 0:dc4ad683fe77 432 t.tm_year = 114; // year since 1900
rs27 0:dc4ad683fe77 433
rs27 0:dc4ad683fe77 434 // Zeit umwandeln und setzen >> die Zeit wird für die Datei benötigt
rs27 0:dc4ad683fe77 435 time_t seconds = mktime(&t);
rs27 0:dc4ad683fe77 436 set_time(seconds);
rs27 0:dc4ad683fe77 437
rs27 0:dc4ad683fe77 438 // pc ist die USB Schnittstelle des Debuggers
rs27 0:dc4ad683fe77 439 pc.baud(56700);
rs27 0:dc4ad683fe77 440 pc.printf("\nUSB_4 Test Programm V1.0d");
rs27 0:dc4ad683fe77 441
rs27 0:dc4ad683fe77 442 // uart1 ist die Schnittstelle zur microSPS
rs27 0:dc4ad683fe77 443 uart1.baud(56700);
rs27 0:dc4ad683fe77 444 // uart1.printf("\nUSB_2 Test Programm V1.0d");
rs27 0:dc4ad683fe77 445
rs27 0:dc4ad683fe77 446 //uart1.attach(&txCallback, MODSERIAL::TxIrq);
rs27 0:dc4ad683fe77 447 //uart1.attach(&rxCallback, MODSERIAL::RxIrq);
rs27 0:dc4ad683fe77 448 //uart1.attach(&txEmpty, MODSERIAL::TxEmpty);
rs27 0:dc4ad683fe77 449
rs27 0:dc4ad683fe77 450 // diese Task werden die nakommenden Zeichen gelesen und ausgewertet
rs27 0:dc4ad683fe77 451 Thread thread(com_thread, NULL, osPriorityNormal, 512);
rs27 0:dc4ad683fe77 452
rs27 0:dc4ad683fe77 453 // diese Taks ist die Schnittstelle zum Stick
rs27 0:dc4ad683fe77 454 Thread msdTask(msd_task, NULL, osPriorityNormal, 1024 * 4);
rs27 0:dc4ad683fe77 455 msdTaskp = &msdTask;
rs27 0:dc4ad683fe77 456
rs27 0:dc4ad683fe77 457 while(1)
rs27 0:dc4ad683fe77 458 {
rs27 0:dc4ad683fe77 459 // falls der Stick gezogen wurde, wird damit die USB Schnittstelle neu initialisiert
rs27 0:dc4ad683fe77 460 if (err_counter >= 10)
rs27 0:dc4ad683fe77 461 {
rs27 0:dc4ad683fe77 462 NVIC_SystemReset();
rs27 0:dc4ad683fe77 463 }
rs27 0:dc4ad683fe77 464
rs27 0:dc4ad683fe77 465 // Systemzeit neu setzen, da keine Hardwareuhr
rs27 0:dc4ad683fe77 466 // auf der oginal Karte wird die Uhr über einen Eingang angesteuert
rs27 0:dc4ad683fe77 467 time_t seconds = time(NULL);
rs27 0:dc4ad683fe77 468 char buffer[40];
rs27 0:dc4ad683fe77 469 strftime(buffer, 40, "%a,%d %m %Y.%H:%M:%S", localtime(&seconds));
rs27 0:dc4ad683fe77 470 pc.printf("\nTime as a custom formatted string = %s %02x %02x %02x", buffer, com.index, com.sm, com.flag);
rs27 0:dc4ad683fe77 471 // uart1.printf("\nTime as a custom formatted string");
rs27 0:dc4ad683fe77 472 seconds++;
rs27 0:dc4ad683fe77 473 set_time(seconds);
rs27 0:dc4ad683fe77 474
rs27 0:dc4ad683fe77 475 // Zeitintervall
rs27 0:dc4ad683fe77 476 // könnte auch in eine Taks verlagert werden
rs27 0:dc4ad683fe77 477 led1 = !led1;
rs27 0:dc4ad683fe77 478 Thread::wait(1000);
rs27 0:dc4ad683fe77 479
rs27 0:dc4ad683fe77 480 } // end while
rs27 0:dc4ad683fe77 481 }
rs27 0:dc4ad683fe77 482