Speichern von Dateien auf einem Stick
Dependencies: KL46Z-USBHost MODSERIAL-RTOS mbed-rtos mbed
main.cpp@0:dc4ad683fe77, 2014-05-11 (annotated)
- 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?
User | Revision | Line number | New 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 |