Changeset 380
- Timestamp:
- 09/10/09 14:34:14 (3 years ago)
- Location:
- branches/yfe_rtos
- Files:
-
- 18 edited
-
FiFiSMSer.c (modified) (7 diffs)
-
FreeRTOSConfig.h (modified) (1 diff)
-
LCD.c (modified) (8 diffs)
-
LCD.h (modified) (3 diffs)
-
MHeard.c (modified) (4 diffs)
-
MenuMain.c (modified) (1 diff)
-
MenuNachrichten.c (modified) (1 diff)
-
MenuSetup.c (modified) (2 diffs)
-
MenuVerfassen.c (modified) (1 diff)
-
Message.c (modified) (9 diffs)
-
Message.h (modified) (1 diff)
-
RFM12_MAC.c (modified) (1 diff)
-
RFM12_PHY.c (modified) (1 diff)
-
Ressources.c (modified) (5 diffs)
-
Ressources.h (modified) (2 diffs)
-
Screen.c (modified) (19 diffs)
-
heap_2.c (modified) (2 diffs)
-
l2rx.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
branches/yfe_rtos/FiFiSMSer.c
r379 r380 122 122 SPCR = (0<<SPIE) // SPI Interrupt disable 123 123 | (1<<SPE) // SPI Enable 124 | (0<<DORD) // Data Order: MSB First125 | (1<<MSTR) // Master Mode126 | (0<<CPOL) // Leading Edge: rising127 | (0<<CPHA) // Leading Edge: Sample128 | (0<<SPR1) // SPI Clock124 | (0<<DORD) // Data Order: MSB First 125 | (1<<MSTR) // Master Mode 126 | (0<<CPOL) // Leading Edge: rising 127 | (0<<CPHA) // Leading Edge: Sample 128 | (0<<SPR1) // SPI Clock 129 129 | (1<<SPR0); // SPI Clock : Clock/4 //DEBUG 130 130 … … 210 210 } 211 211 212 213 if (xTaskCreate( vTaskMain, (signed portCHAR*) MainStr, 224, NULL, 0, NULL) != pdPASS){ 212 // Main Task (UI Task) erzeugen und starten 213 // Stackgröße = 224 Bytes 214 // Priorität = 1 (normal) 215 216 if (xTaskCreate( vTaskMain, (signed portCHAR*) MainStr, 224, NULL, 1, NULL) != pdPASS){ 214 217 for(;;); 215 218 } … … 250 253 GLOBALFLAGS.IsPowerOn = true; 251 254 252 253 if (xTaskCreate( vCronTask, (signed portCHAR*) CronStr, 128, NULL, 0, NULL) != pdPASS){ 255 // Cron Task erzeugen und starten 256 // Stackgröße = 128 Bytes 257 // Priorität = 1 (normal) 258 if (xTaskCreate( vCronTask, (signed portCHAR*) CronStr, 128, NULL, 1, NULL) != pdPASS){ 254 259 for(;;); 255 260 } 256 261 257 262 258 259 if (xTaskCreate( vRxTask, (signed portCHAR*) L2RXStr, 128, NULL, 1, NULL) != pdPASS){ 263 // L2RX Task erzeugen und starten 264 // Stackgröße = 128 Bytes 265 // Priorität = 2 (hoch) 266 if (xTaskCreate( vRxTask, (signed portCHAR*) L2RXStr, 128, NULL, 2, NULL) != pdPASS){ 260 267 for(;;); 261 268 } … … 263 270 264 271 Screen_DrawStandby(); 272 265 273 for(;;) 266 274 { … … 301 309 if (Keypad_lastScanCode == Keypad_SC_2) 302 310 { 311 uint8_t status=TakeSpiMutex(portMAX_DELAY); 303 312 RFM12_PHY_modeRX(); 313 GiveSpiMutex(status); 304 314 } 305 315 … … 338 348 339 349 Keypad_WaitForKeyStroke(); 350 340 351 } 352 353 /* 354 uint8_t MenuStack[4]; 355 356 MenuStack[0]=0; 357 358 for(;;) 359 { 360 uint8_t ShowNext=0; 361 uint8_t MenuIndex=0; 362 363 Screen_DrawStandby(); 364 365 Keypad_WaitForKeyStroke(); 366 367 switch(Keypad_lastScanCode) 368 { 369 case Keypad_SC_MRechts: 370 { 371 if (GLOBALFLAGS.NewRX) 372 { 373 //Screen_ShowNachrichten(); 374 ShowNext = SHOW_MESSAGE; 375 } 376 else 377 { 378 ShowNext = SHOW_MHEARD; 379 } 380 break; 381 } 382 case Keypad_SC_MLinks: 383 { 384 ShowNext = MAIN_MENU; 385 break; 386 } 387 case Keypad_SC_5: 388 { 389 SmpBuf.addr = 0x2000; 390 CVSD_active = 1; 391 vTaskDelay(100); // Sicherstellen, dass SmpBuf gefüllt ist 392 TIMSK1 |= _BV(TOIE1); 393 break; 394 } 395 case Keypad_SC_6: 396 { 397 CVSD_active = 0; 398 TIMSK1 &= ~_BV(TOIE1); 399 break; 400 } 401 } 402 403 404 // Dialoge anzeigen 405 // Ziel dieser Implementation ist es, Speicher zu sparen indem das verschachtelte 406 // Aufrufen von Menüs vermieden wird. 407 do 408 { 409 if (ShowNext!=0) 410 { 411 if (MenuIndex==3) 412 { 413 strncpy(&MenuStack[1], &MenuStack[2], 3); 414 MenuIndex--; 415 } 416 MenuStack[++MenuIndex]=ShowNext; 417 } 418 419 switch(MenuStack[MenuIndex--]) 420 { 421 case MAIN_MENU: 422 { 423 ShowNext=MainMenu(); 424 break; 425 } 426 case SHOW_MESSAGE: 427 { 428 break; 429 } 430 case EDIT_MESSAGE: 431 { 432 break; 433 } 434 case MHEARD: 435 { 436 break; 437 } 438 case ERWEITERT: 439 { 440 break; 441 } 442 case SETUP: 443 { 444 break; 445 } 446 case AUSSCHALTEN: 447 { 448 break; 449 } 450 default: 451 { 452 break; 453 } 454 } 455 }while(MenuIndex!=0) 456 } 457 458 */ 341 459 } 342 460 … … 357 475 void vApplicationIdleHook( void ){ 358 476 //idleCtr++; 477 478 // TODO: 479 // Sleep Mode aktivieren (Takt auf 1 MHz runtersetzen) 359 480 }; 360 481 -
branches/yfe_rtos/FreeRTOSConfig.h
r379 r380 72 72 #define configCPU_CLOCK_HZ ( ( unsigned portLONG ) 8000000 ) 73 73 #define configTICK_RATE_HZ ( ( portTickType ) 1000 ) 74 #define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 2)74 #define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 3 ) 75 75 #define configMINIMAL_STACK_SIZE ( ( unsigned portSHORT ) 72 ) 76 76 #define configTOTAL_HEAP_SIZE ( (size_t ) ( 1300 ) ) -
branches/yfe_rtos/LCD.c
r379 r380 18 18 #include "FontJumptable.h" 19 19 #include "MenuSetup.h" 20 20 21 #include "FreeRTOS.h" 22 #include "portable.h" 23 #include "task.h" 24 21 25 #include "EEPROM.h" 22 26 … … 25 29 26 30 // Merker für XorMaske 27 static uint8_t _LCD_XorMaske; 31 uint8_t LCD_XorMaske; 32 uint8_t LCD_Cursor=0; 28 33 29 34 static inline void LCD_Reset(void); 35 30 36 31 37 … … 46 52 { 47 53 PORTC &= ~(1 << PORTC4); 48 _delay_ms(1); 54 vTaskDelay( 1 / portTICK_RATE_MS); // 1 ms warten 55 // _delay_ms(1); 49 56 50 57 PORTC |= (1 << PORTC4); 51 _delay_ms(1); 58 vTaskDelay( 1 / portTICK_RATE_MS); // 1 ms warten 59 // _delay_ms(1); 52 60 } 53 61 … … 60 68 inline void LCD_Init(void) 61 69 { 62 _LCD_XorMaske = 0x00;70 LCD_XorMaske = 0x00; 63 71 _LCD_FontTyp = 1; 64 72 65 73 LCD_Reset(); 66 _delay_ms(10); 74 // _delay_ms(10); 75 vTaskDelay( 10 / portTICK_RATE_MS); // 10 ms warten 67 76 68 77 //Initialisierung 69 78 LCD_WriteCmd(LCD_FunctionSet | LCD_FSExtended); // Erweiterter Kommando-Mode 70 LCD_WriteCmd(LCD_SetVop | (40 + SetupValues.Kontrast) ); //&HC8 Mittlerer Kontrast (nur im erweiterten Mode)79 LCD_WriteCmd(LCD_SetVop | (40 + SetupValues.Kontrast) ); //&HC8 Mittlerer Kontrast (nur im erweiterten Mode) 71 80 //LCD_WriteCmd(LCD_SetVop | 70); 72 81 LCD_WriteCmd(LCD_TempControl | 2); // Temperatur-Ausgleich (nur im erweiterten Mode) 73 82 LCD_WriteCmd(LCD_BiasSystem | 3); // Bias 1:48 (optimum) (nur im erweiterten Mode) 74 83 LCD_WriteCmd(LCD_FunctionSet); // Normaler Kommando-Mode 84 LCD_WriteCmd(LCD_DisplayControl | LCD_DCDisplayAllOn); // invertierte Ausgabe (nur im normalen Mode) 85 86 vTaskDelay( 600 / portTICK_RATE_MS); // 600 ms warten 87 75 88 LCD_WriteCmd(LCD_DisplayControl | LCD_DCDisplayNorm); //Normale, nicht invertierte Ausgabe (nur im normalen Mode) 76 89 … … 84 97 { 85 98 _LCD_FontTyp = FontTyp; 86 _LCD_XorMaske = XorMaske;99 LCD_XorMaske = XorMaske; 87 100 } 88 101 … … 110 123 loop_until_bit_is_set(SPSR,SPIF); // Warten bis alle Bits raus 111 124 112 //uint8_t dummy = SPDR; // Pseudolesen zum löschen des Flags -> TODO: Ist das Löschen des Flags wirklich nötig?113 114 125 // LCD als Empfänger für den SPI abwählen (low-aktiv) 115 126 PORTD |= (1 << CS_LCD); … … 152 163 153 164 // Schreibt den an gegebenen Flash-String aufs Display 154 voidLCD_PutString_P(const char *progstr)165 uint8_t LCD_PutString_P(const char *progstr) 155 166 { 156 char c; 167 uint8_t i=0; 168 char c; 157 169 while ( (c = pgm_read_byte(progstr++)) ) 158 170 { 159 171 LCD_PutChar(c); 160 } 172 i++; 173 } 174 return i; 161 175 } 162 176 … … 208 222 Bitmuster = pgm_read_byte(CharPointer++); 209 223 ende = (Bitmuster & 0x01) == 1; 210 Bitmuster = (Bitmuster & 0xFE) ^ _LCD_XorMaske;224 Bitmuster = (Bitmuster & 0xFE) ^ LCD_XorMaske; 211 225 LCD_WriteData(Bitmuster); 212 226 } while (!ende); 213 227 } 214 LCD_WriteData( _LCD_XorMaske); // Die Leerspalte hinter dem Buchstaben ausgeben228 LCD_WriteData(LCD_Cursor^ LCD_XorMaske); // Die Leerspalte hinter dem Buchstaben ausgeben 215 229 216 230 } //endof Proc -
branches/yfe_rtos/LCD.h
r379 r380 45 45 #define LCD_SetVop 0b10000000 46 46 47 #define FontStyle_Underline 0x80 48 #define FontStyle_Invert 0x7E 47 49 50 extern uint8_t LCD_XorMaske; 48 51 49 52 // Initialisisert das Display … … 63 66 void LCD_WriteCmd(const uint8_t Cmd); 64 67 68 65 69 // Löscht den LCD Bildschirm 66 70 void LCD_ClearScreen(void); … … 73 77 74 78 // Schreibt den angegebenen Flash-String auf den Bildschirm 75 voidLCD_PutString_P(const char *progstr);79 uint8_t LCD_PutString_P(const char *progstr); 76 80 77 81 // Schreibt die angegebene Grafik auf den Bildschirm -
branches/yfe_rtos/MHeard.c
r373 r380 19 19 for (uint8_t i = 0; i < MHEARD_MAX; i++) 20 20 { 21 MHListe[i].HeardTime = 0;21 MHListe[i].HeardTime = MHEARD_MAX-i; 22 22 strcpy_P(MHListe[i].Name, STR_TempCall); 23 23 } … … 28 28 { 29 29 uint8_t OldPos = MHEARD_MAX; // "Hinter der Liste" 30 uint 32_t LastHeard = 0;30 uint16_t LastHeard = 0; 31 31 32 32 for (uint8_t i = 0; i < MHEARD_MAX; i++) … … 56 56 } 57 57 58 58 59 while(OldPos > 0) 59 60 { … … 65 66 } 66 67 67 // Erste Eintrag erstellen68 strncpy(MHListe[0].Name, Name, ADDRESS_MAXCHAR);69 MHListe[0].HeardTime = (Timer_LifeTimeCounter >> 4)+1;70 68 } 71 69 -
branches/yfe_rtos/MenuMain.c
r373 r380 34 34 const char PROGMEM MM_6[] = "Ausschalten"; 35 35 36 36 /* 37 void MainMenu() 38 { 39 Screen_DrawMenu(MM_Titel); 40 41 } 42 */ 37 43 38 44 // Menü-Funktion MHeard Liste -
branches/yfe_rtos/MenuNachrichten.c
r372 r380 36 36 37 37 // Message Buffer leeren 38 memset(Message_EditBuffer->Nachricht, 0, sizeof(Message_EditBuffer->Nachricht));39 38 //memset(Message_EditBuffer->Nachricht, 0, sizeof(Message_EditBuffer->Nachricht)); 39 Message_EditBuffer->Nachricht[0]=0; 40 40 41 41 Screen_DoMsgEdit(Message_EditBuffer->Nachricht, sizeof(Message_EditBuffer->Nachricht), MN_1, true); -
branches/yfe_rtos/MenuSetup.c
r379 r380 141 141 static char* GetAddStr_MS_7(char* Buffer) 142 142 { 143 // TODO: Frequenzwert mit itoa umwandeln! (Speicher sparen) 144 if (SetupValues.Frequenz == 0) 143 // TODO: Frequenzwert mit itoa umwandeln! (Speicher sparen) 144 145 /* 146 if (SetupValues.Frequenz == 0) 145 147 return strcat_P(Buffer, STR_QRG0); 146 148 147 149 if (SetupValues.Frequenz == 1) 148 150 return strcat_P(Buffer, STR_QRG1); 149 151 */ 150 152 151 return strcat_P(Buffer, STR_QRG2);153 return strcat_P(Buffer, &STR_QRG[SetupValues.Frequenz][0]); 152 154 } 153 155 … … 205 207 static uint8_t Exec_MS_1(void) 206 208 { 207 memset(buf, 0, sizeof(buf));209 //memset(buf, 0, sizeof(buf)); 208 210 // Eigentlich sollte immer die größe von Empfangsbuffer angegeben werden, 209 211 // Da aber der SrcBuf kleiner ist, und evtl auch mal ganz voll ist, ist maxLen = sizeof(srcbuf) 210 212 strncpy(buf, (const char*)SetupValues.UserID, sizeof(SetupValues.UserID)); 213 buf[8]=0; 211 214 if (Screen_DoMsgEdit(buf, 8, MS_1, false) == true) 212 215 { -
branches/yfe_rtos/MenuVerfassen.c
r373 r380 82 82 static uint8_t Exec_MV_2(void) 83 83 { 84 memset(buf, 0, sizeof(buf)); // Buffer leeren85 str cpy(buf, Message_EditBuffer->Header.Empfaenger); // Evtl vorhandenen Empfänger übernehmen86 84 //memset(buf, 0, sizeof(buf)); // Buffer leeren 85 strncpy(buf, Message_EditBuffer->Header.Empfaenger, ADDRESS_MAXCHAR); // Evtl vorhandenen Empfänger übernehmen 86 buf[8] = 0; 87 87 if (Screen_DoMsgEdit(buf, ADDRESS_MAXCHAR, MV_2, false) == true) // Editieren 88 88 { 89 strcpy(Message_EditBuffer->Header.Empfaenger, buf); // Wenn OK, dann übernehmen 89 //strcpy(Message_EditBuffer->Header.Empfaenger, buf); // Wenn OK, dann übernehmen 90 strncpy(Message_EditBuffer->Header.Empfaenger, buf, sizeof(Message_EditBuffer->Header.Empfaenger)); 90 91 } 91 92 -
branches/yfe_rtos/Message.c
r379 r380 99 99 Flags.AsByte = spieeprom_read_byte((uint32_t) ((uint16_t)&(PtrToMsg->Flags))); 100 100 101 // Wir haben eine Nachricht gefunden102 //if (Flags.AsFlags.Status == MessageFlagStatusQueue)103 101 if ((Flags.AsFlags.Status == MessageStatus) || 104 102 (Flags.AsFlags.Status == MessageStatus2)) 105 103 { 106 // Nachricht in Sendewarteschlange hängen (als EEPROM Nachricht mit Buffer=NULL) 107 // TxMessageToQueue(NULL,1,0,SetupValues.Sendeversuche,MessageBlockNr); 104 // Nachricht mit gesuchtem Status gefunden 108 105 break; // raus hier 109 106 } … … 173 170 if (MsgPtr == NULL){ // nur bei nachrichten aus ext. EEPROM: 174 171 uint8_t j; 175 for(j= Priority;j<TxQueueLength;j++){ // prüfen ob EEPROM Nachricht bereits in der Liste ist176 if (TxMessageQueue[ i].EepBlock == EepBlock)172 for(j=0;j<TxQueueLength;j++){ // prüfen ob EEPROM Nachricht bereits in der Liste ist 173 if (TxMessageQueue[j].EepBlock == EepBlock) 177 174 { 178 175 return true; // Falls das der Fall ist, Erfolg melden, aber nicht erneut einhängen … … 199 196 (TxMessageQueue[i].EepBlock!=0)) 200 197 { 201 if (TxMessageQueue[i].TimeToWait == 0){ // und die Wartezeit (in s) abgelaufen ist 198 if (TxMessageQueue[i].TimeToWait == 0) // und die Wartezeit (in s) abgelaufen ist 199 { 202 200 203 201 if (TxMessageQueue[i].Ptr == NULL) // Nachricht aus EEPROM ? … … 205 203 TxMessageQueue[i].Ptr = pvPortMalloc(TRXBufSize); // dann erstmal ins RAM kopieren 206 204 207 if (TxMessageQueue[i].Ptr != NULL){ // Nur aus EEPROM lesen, wenn Pufferspeicher frei ist 205 if (TxMessageQueue[i].Ptr != NULL) // Nur aus EEPROM lesen, wenn Pufferspeicher verfügbar ist 206 { 208 207 // Nachricht in TxBuffer laden 209 208 uint16_t PtrToMsg = EE_BlockSize * TxMessageQueue[i].EepBlock; … … 251 250 else 252 251 { 253 TxMessageQueue[i].TimeToWait--; 252 TxMessageQueue[i].TimeToWait--; // Wartezeit um 1s vermindern 254 253 } 255 254 } … … 264 263 if (TxFrameBuf == NULL) // Sendepuffer verfügbar? 265 264 { 266 // ACK zu senden? - Ack wird von RX Behandlung erzeugt und in TX Schlange eingereiht 267 // Nachricht aus EEPROM zu senden? - dies wird nur noch jede Sekunden geprüft, viel schneller 268 // kann keine neue Nachricht dazu kommen 269 WalkTxQueue(); 265 WalkTxQueue(); // Prüfen ob eine Nachricht sendebereit ist 270 266 } 271 267 } … … 339 335 // ('Pass by Reference' für MessageBuffer (den Zeiger) und 340 336 // nicht nur 'Pass by Reference' für den Nachrichtenpuufer) 337 338 // MsgbufptrPtr = Adresse von Zeiger auf Nachrichtenspeicher 339 // *MsgbufptrPtr = Zeiger auf Nachrichtenspeicher 340 // **MsgbufptrPtr = Nachrichtenspeicher 341 341 342 uint8_t i = 0; 342 343 uint8_t MessageBlockNr; … … 408 409 { 409 410 // Ack Message rausschicken 410 // TODO:Empfangene Nachricht wurde soeben gespeichert -> Buffer für ACK ist verfügbar!411 // Empfangene Nachricht wurde soeben gespeichert -> Buffer für ACK ist verfügbar! 411 412 412 413 // Antwort vorbereiten … … 441 442 RxMessageQueue[i].Ptr = NULL; // Nachricht aus Empfangsliste streichen 442 443 443 MHeard_NewHeard(MessageBuffer->Header.Absender); // Absender in MH Liste eintragen (nicht nur bei Baken!)444 // MHeard_NewHeard(MessageBuffer->Header.Absender); // Absender in MH Liste eintragen (nicht nur bei Baken!) 444 445 445 446 switch (MessageBuffer->Header.Flags.Type) // Typ der Nachricht prüfen 446 447 { 447 case MessageFlagsTypeAck: // Es wurde ein ACK empfangen 448 Message_Cron_RxAck(MessageBuffer); // nach passender Nachricht suchen und ggf. markieren 449 break; 450 case MessageFlagsTypeBake: // Es wurde eine Bake empfangen 451 Message_UserHeard(MessageBuffer); // Nach nicht zugestellten Nachrichten suchen 452 break; 453 case MessageFlagsTypeText : 454 Message_Cron_RxText(&MessageBuffer); // Zeiger auf MsgPtr übergeben 455 break; // Falls Buffer für Ack verwendet wird, wird der Ptr = NULL 456 } 457 458 if (MessageBuffer != NULL) // nachricht wurde verarbeitet, Speicher freigeben 459 { 460 vPortFree(MessageBuffer); 461 } 448 case MessageFlagsTypeAck: 449 { // Es wurde ein ACK empfangen 450 Message_Cron_RxAck(MessageBuffer); // nach passender Nachricht suchen und ggf. markieren 451 break; 452 } 453 case MessageFlagsTypeBake: 454 { // Es wurde eine Bake empfangen 455 Message_UserHeard(MessageBuffer); // Nach nicht zugestellten Nachrichten suchen 456 break; 457 } 458 case MessageFlagsTypeText : 459 { 460 Message_Cron_RxText(&MessageBuffer); // Zeiger auf MsgPtr übergeben 461 break; // Falls Buffer für Ack verwendet wird, wird der Ptr = NULL 462 } 463 } 464 465 // if (MessageBuffer != NULL) // nachricht wurde verarbeitet, Speicher freigeben 466 // { 467 vPortFree(MessageBuffer); 468 // } 462 469 } 463 470 } 464 471 } 472 465 473 466 474 -
branches/yfe_rtos/Message.h
r379 r380 105 105 // Buffer für zu lesende/schreibende Nachrichten 106 106 extern Message_t *Message_EditBuffer; 107 extern Message_t Message_RxDoubleBuffer;108 107 109 108 extern TxMessageQueue_t TxMessageQueue[]; -
branches/yfe_rtos/RFM12_MAC.c
r379 r380 138 138 } 139 139 case 7: 140 default:{ 140 default: 141 { 141 142 counter = 0; 142 143 tx_state = 0; 143 144 RFM12_MAC_endCtrlTransmission(); 144 145 GLOBALFLAGS.IsTXing = false; 145 if ( TxFrameBuf!=NULL ){ 146 vPortFree( (void *) TxFrameBuf ); 147 TxFrameBuf = NULL; 148 } 146 vPortFree( (void *) TxFrameBuf ); 147 TxFrameBuf = NULL; 149 148 150 if ( TxParityBuf!=NULL ){ 151 vPortFree( (void *) TxParityBuf ); 152 TxParityBuf = NULL; 153 } 149 vPortFree( (void *) TxParityBuf ); 150 TxParityBuf = NULL; 151 154 152 return(0); 155 153 } -
branches/yfe_rtos/RFM12_PHY.c
r379 r380 267 267 case RFM12_RX:{ 268 268 //Timer_SetSystemSpeed_Slow(RFM_ISR | FORCE); 269 if( RFM12_EndRx ) 270 { 271 RFM12_PHY_modeRX(); // RX beenden 272 } 269 273 uint8_t data; 270 274 data = RFM12_fifoRead(); // Daten von RFM12 lesen 271 // Daten an L2RxTask weiterleiten, Task damit ggf. aufwecken 272 if( RFM12_EndRx || 273 (xQueueSendToBackFromISR(RxDataInHandle, &data, (int8_t *) &xHigherPriorityTaskWoken)==errQUEUE_FULL)) 275 // Daten an L2RxTask weiterleiten, Task damit ggf. aufwecken 276 if(xQueueSendToBackFromISR(RxDataInHandle, &data, (int8_t *) &xHigherPriorityTaskWoken)==errQUEUE_FULL) 274 277 { 275 278 RFM12_PHY_modeRX(); // Queue voll -> Abbruch, RFM12 soll wieder auf Sync warten -
branches/yfe_rtos/Ressources.c
r369 r380 47 47 ////////////// Strings 48 48 const char STR_DeviceName[] PROGMEM = "FiFiSMSer"; 49 const char STR_Ausschalten[] PROGMEM = "Ausschalten ?";49 const char STR_Ausschalten[] PROGMEM = "Ausschalten?"; 50 50 const char STR_TempCall[] PROGMEM = "NOCALL"; 51 51 const char STR_NoTime[] PROGMEM = "xx:xx"; … … 53 53 const char STR_EintragLoeschen[] PROGMEM = "Eintrag löschen?"; 54 54 const char STR_min[] PROGMEM = "min"; 55 const char STR_ERROR[] PROGMEM = "Not see me";56 55 const char STR_MHListe[] PROGMEM = "MH Liste"; 57 56 const char ST_Details[] PROGMEM = "Details"; … … 59 58 const char STR_Empf[] PROGMEM = "Empf: "; 60 59 const char STR_Zeit[] PROGMEM = "Zeit:"; 61 const char STR_KeinEmpf[] PROGMEM = "Kein Empfänger gesetzt. An alle senden ?";60 const char STR_KeinEmpf[] PROGMEM = "Kein Empfänger gesetzt. An alle senden?"; 62 61 const char STR_Alle[] PROGMEM = "CQ"; 63 62 const char STR_Ansehen[] PROGMEM = "Ansehen"; … … 65 64 const char STR_EIN[] PROGMEM = "ein"; // ProgString "ein" 66 65 const char STR_MsgQueued[] PROGMEM = "Msg in Postaus- gang eingereiht"; 67 const char STR_MsgEntwurf[] PROGMEM = " Messageentwurf abgespeichert";66 const char STR_MsgEntwurf[] PROGMEM = "Entwurf gespeichert"; 68 67 const char STR_Entwurf[] PROGMEM = "ENTWURF"; 69 68 const char STR_SaveFailed[] PROGMEM = "Speicher voll! Nicht gespeichert"; … … 93 92 94 93 // Entsprechend Ticket #12 94 /* 95 95 const char STR_QRG0[] PROGMEM = "434.500"; 96 96 const char STR_QRG1[] PROGMEM = "439.700"; 97 97 const char STR_QRG2[] PROGMEM = "434.900"; 98 */ 99 const char STR_QRG[3][8] PROGMEM = {"434.500", "439.700", "434.900"}; 98 100 99 101 -
branches/yfe_rtos/Ressources.h
r369 r380 50 50 extern const char PROGMEM STR_EintragLoeschen[]; 51 51 extern const char PROGMEM STR_min[]; 52 extern const char PROGMEM STR_ERROR[];53 52 extern const char PROGMEM STR_MHListe[]; 54 53 extern const char PROGMEM ST_Details[]; … … 91 90 extern const char PROGMEM STR_RXed[]; 92 91 93 extern const char STR_QRG 0[];92 extern const char STR_QRG[][8]; 94 93 #define QRG0 434.500 95 94 -
branches/yfe_rtos/Screen.c
r379 r380 102 102 LCD_SetFontAttribs(FontTyp_Small,0); 103 103 104 uint16_t ADRechnung = ADC_Messwert * 100; 105 uint16_t Ergebnis = ADRechnung / 112; 106 104 //uint16_t ADRechnung = ADC_Messwert * 100; 105 //uint16_t Ergebnis = ADRechnung / 112; 106 107 uint16_t Ergebnis = ADC_Messwert >> 3; // *25/28 ist ungefähr 7/8 (Abweichung 2%) 108 // Diese Genauigkeit ist ausreichend für den Zweck der 109 // Batteriespannungsanzeige (6 mV Abweichung bei 3 Volt) 110 Ergebnis = ADC_Messwert - Ergebnis; // Die Berechnung erfordert allerdings nur Shift und Subtraktion 111 // Anstelle einer Multiplikation und einer Division 107 112 itoa(Ergebnis, buf, 10); 108 113 109 if (strlen(buf) == 2) 114 //if (strlen(buf) == 2) 115 if (buf[2] == 0) 110 116 { 111 117 LCD_PutChar('0'); … … 159 165 160 166 //Es folgt die Ausgabe des Rufzeichens: 161 memset(buf, 0, sizeof(buf)); 167 //memset(buf, 0, sizeof(buf)); 168 162 169 strncpy(buf, (const char*)SetupValues.UserID, ADDRESS_MAXCHAR); 163 unsigned char xpos = 42 - LCD_MeasureString(buf) / 2; 170 buf[8]=0; // 0-terminieren 171 172 unsigned char xpos = 42 - LCD_MeasureString(buf) / 2; 164 173 LCD_SetTextCursor(xpos, 2); 165 174 LCD_PutString(buf); 166 175 167 176 //Es folgt die Ausgabe der eingestellten Frequenz: 168 memset(buf, 0, sizeof(buf)); 169 if (SetupValues.Frequenz == 0) 170 strcat_P(buf, STR_QRG0); 171 if (SetupValues.Frequenz == 1) 172 strcat_P(buf, STR_QRG1); 173 if (SetupValues.Frequenz == 2) 174 strcat_P(buf, STR_QRG2); 177 strncpy_P(buf, &STR_QRG[SetupValues.Frequenz][0], 7); 178 179 buf[7]=0; 180 175 181 LCD_SetTextCursor(28, 3); 176 182 LCD_SetFontAttribs(FontTyp_Small,0); … … 840 846 { 841 847 cursor--; 842 strcpy(&Buffer[cursor],&Buffer[cursor+1]); 848 //strcpy(&Buffer[cursor],&Buffer[cursor+1]); 849 // strcpy rausgeworfen -> wird sonst nirgendwo gebraucht 850 // daher spart die "zu Fuß" Implementation hier Flash 851 uint8_t i = cursor; 852 do 853 { 854 Buffer[i] = Buffer[i+1]; 855 } while(Buffer[i]!=0); 843 856 } 844 857 else{ … … 999 1012 if (!GLOBALFLAGS.IsKeyAgain) // Lücke schaffen 1000 1013 { 1001 for (uint8_t i = Len; i > cursor; i--) 1002 Buffer[i] = Buffer[i-1]; 1003 1004 Buffer[actualStrLen+1] = 0; 1014 for (uint8_t i = Len+1; i > cursor; i--) 1015 Buffer[i] = Buffer[i-1]; 1016 //Buffer[actualStrLen+1] = 0; 1005 1017 } 1006 1018 Buffer[cursor] = key; // Zeichen setzen 1007 cursor++; // weiter1019 cursor++; // weiter 1008 1020 } 1009 1021 } 1010 1022 } 1023 1011 1024 1012 1025 … … 1018 1031 uint8_t cursorIdx = 1; 1019 1032 uint8_t menuLen = MHEARD_MAX; 1033 Message_t *Screen_ShowMhBuf = NULL; 1020 1034 1021 1035 while(1) … … 1062 1076 LCD_PutChar(' ');*/ 1063 1077 //Zeitspanne bestimmen und in Stunden und Minuten aufspalten 1064 div_t HoursMins = div(Timer_GetTimeSpanMins( MHListe[topIdx-1+i].HeardTime<<4), 60);1078 div_t HoursMins = div(Timer_GetTimeSpanMins(((uint32_t)MHListe[topIdx-1+i].HeardTime-1)<<4), 60); 1065 1079 if (HoursMins.quot > 99){ 1066 1080 //mehr als 99:59 Stunden her - nur noch xx:xx anzeigen statt Zeit … … 1072 1086 itoa(HoursMins.quot, buf, 10); 1073 1087 if (HoursMins.quot < 10){ 1074 LCD_Put String_P(&STR_QRG0[6]);//Falls nötig führende Null einfügen1088 LCD_PutChar('0'); 1075 1089 } 1076 //LCD_PutChar('0');1077 1090 LCD_PutString(buf); 1078 1091 //Zwischendurch Doppelpunkt … … 1081 1094 itoa(HoursMins.rem, buf, 10); 1082 1095 if (HoursMins.rem<10){ 1083 LCD_PutString_P(&STR_QRG0[6]);//Falls nötig führende Null einfügen 1084 //LCD_PutChar('0'); //Falls nötig führende Null einfügen 1096 LCD_PutChar('0'); //Falls nötig führende Null einfügen 1085 1097 } 1086 1098 LCD_PutString(buf); … … 1095 1107 LCD_SetFontAttribs(FontTyp_Norm,0x00); 1096 1108 // Namen aus der MH Liste kopieren 1097 memset(buf, 0, sizeof(buf));1109 //memset(buf, 0, sizeof(buf)); 1098 1110 strncpy(buf, MHListe[topIdx-1+i].Name, ADDRESS_MAXCHAR); 1099 LCD_PutString(buf); 1111 buf[ADDRESS_MAXCHAR]=0; 1112 LCD_PutString(buf); 1100 1113 } 1101 1114 } … … 1133 1146 if (retval == 2) 1134 1147 { 1135 Message_EditBuffer= pvPortMalloc(TRXBufSize);1136 if ( Message_EditBuffer!= NULL){1148 Screen_ShowMhBuf = pvPortMalloc(TRXBufSize); 1149 if (Screen_ShowMhBuf!= NULL){ 1137 1150 // Absender als Empfänger setzen 1138 strncpy( Message_EditBuffer->Header.Empfaenger, MHListe[cursorIdx-1].Name, ADDRESS_MAXCHAR);1151 strncpy(Screen_ShowMhBuf->Header.Empfaenger, MHListe[cursorIdx-1].Name, ADDRESS_MAXCHAR); 1139 1152 // Message Buffer leeren 1140 memset(&Message_EditBuffer->Nachricht, 0, TRXBufSize);1141 1142 Screen_DoMsgEdit( Message_EditBuffer->Nachricht, sizeof(Message_EditBuffer->Nachricht), MH_1, true);1153 //memset(&Screen_ShowMhBuf->Nachricht, 0, TRXBufSize); 1154 Screen_ShowMhBuf->Nachricht[0]=0; 1155 Screen_DoMsgEdit(Screen_ShowMhBuf->Nachricht, sizeof(Screen_ShowMhBuf->Nachricht), MH_1, true); 1143 1156 } 1144 1157 } … … 1146 1159 } 1147 1160 } 1161 1148 1162 1149 1163 … … 1152 1166 uint8_t topIdx = 1; 1153 1167 uint8_t cursorIdx = 1; 1154 1168 Message_t *Screen_MsgBuffer = NULL; 1155 1169 // Länge ermitteln 1156 1170 while(1) … … 1216 1230 } 1217 1231 void* MsgPtr = (void*)(EE_BlockSize * MessageBlockNr); 1218 Message_EditBuffer = (void *) buf; // Message_EditBuffer auf "buf" (20 Zeichen) zeigen lassen1219 spieeprom_read_block((uint32_t) ((uint16_t) MsgPtr), Message_EditBuffer, sizeof(MessageHeader_t));1232 Screen_MsgBuffer = (void *) buf; // Message_EditBuffer auf "buf" (20 Zeichen) zeigen lassen 1233 spieeprom_read_block((uint32_t) ((uint16_t) MsgPtr), Screen_MsgBuffer, sizeof(MessageHeader_t)); 1220 1234 1221 1235 // Nachricht Eintrag Zeichnen … … 1226 1240 1227 1241 bool IsCQ = false; 1228 if (strcasecmp_P( Message_EditBuffer->Header.Empfaenger, STR_Alle) == 0){1242 if (strcasecmp_P(Screen_MsgBuffer->Header.Empfaenger, STR_Alle) == 0){ 1229 1243 IsCQ = true; 1230 1244 } 1231 1245 1232 switch ( Message_EditBuffer->Header.Flags.Status)1246 switch (Screen_MsgBuffer->Header.Flags.Status) 1233 1247 { 1234 1248 //case MessageFlagStatusGeloescht : 1235 1249 // GlyphPtr = Glyph_Deleted; 1236 // NamePtr = & Message_EditBuffer.Header.Empfaenger;1250 // NamePtr = &Screen_MsgBuffer.Header.Empfaenger; 1237 1251 // break; 1238 1252 case MessageFlagStatusEntwurf : 1239 1253 GlyphPtr = Glyph_Entwurf; 1240 NamePtr = Message_EditBuffer->Nachricht;1254 NamePtr = Screen_MsgBuffer->Nachricht; 1241 1255 break; 1242 1256 case MessageFlagStatusGesendet : 1243 1257 GlyphPtr = Glyph_OutSend; 1244 NamePtr = Message_EditBuffer->Header.Empfaenger;1258 NamePtr = Screen_MsgBuffer->Header.Empfaenger; 1245 1259 break; 1246 1260 case MessageFlagStatusQueue : 1247 1261 GlyphPtr = Glyph_OutQueue; 1248 NamePtr = Message_EditBuffer->Header.Empfaenger;1262 NamePtr = Screen_MsgBuffer->Header.Empfaenger; 1249 1263 break; 1250 1264 case MessageFlagStatusEmpfangenGelesen : 1251 1265 GlyphPtr = Glyph_InRead; 1252 NamePtr = Message_EditBuffer->Header.Absender;1266 NamePtr = Screen_MsgBuffer->Header.Absender; 1253 1267 break; 1254 1268 case MessageFlagStatusEmpfangenUngelesen : 1255 1269 GlyphPtr = Glyph_InUnread; 1256 NamePtr = Message_EditBuffer->Header.Absender;1270 NamePtr = Screen_MsgBuffer->Header.Absender; 1257 1271 break; 1258 1272 case MessageFlagStatusTxMaxtry : 1259 1273 GlyphPtr = Glyph_Maxtry; 1260 NamePtr = Message_EditBuffer->Header.Empfaenger;1274 NamePtr = Screen_MsgBuffer->Header.Empfaenger; 1261 1275 break; 1262 1276 } … … 1287 1301 LCD_PutString(NamePtr); // String gleich von "NamePtr" ausgeben lassen 1288 1302 } 1289 Message_EditBuffer = NULL; // Message_EditBuffer wieder "NULL"-en1303 Screen_MsgBuffer = NULL; // Message_EditBuffer wieder "NULL"-en 1290 1304 Keypad_WaitForKeyStroke(); 1291 1305 … … 1301 1315 } 1302 1316 1303 if (Keypad_lastScanCode == Keypad_SC_MRechts) 1304 { 1305 return 0; 1317 if (Keypad_lastScanCode == Keypad_SC_MRechts) // BACK 1318 { 1319 return 0; // Menü verlassen 1306 1320 } 1307 1321 … … 1311 1325 if (highlightMessageBlockNr > 0) 1312 1326 { 1313 Message_EditBuffer = pvPortMalloc( TRXBufSize); // Speicher zuweisen lassen1314 if ( Message_EditBuffer != NULL) // und nur wenn Speicher verfügbar ist1327 Screen_MsgBuffer = pvPortMalloc( TRXBufSize); // Speicher zuweisen lassen 1328 if (Screen_MsgBuffer != NULL) // und nur wenn Speicher verfügbar ist 1315 1329 { 1316 1330 spieeprom_read_block((uint32_t) ((uint16_t)EECurrPtr), 1317 Message_EditBuffer, sizeof(MessageHeader_t)); // Header einlesen (wg. Längenangabe)1331 Screen_MsgBuffer, sizeof(MessageHeader_t)); // Header einlesen (wg. Längenangabe) 1318 1332 1319 if ( Message_EditBuffer->Header.Laenge > MESSAGE_MAXLEN)1333 if (Screen_MsgBuffer->Header.Laenge > MESSAGE_MAXLEN) 1320 1334 { // Niemals mehr Zeichen einlesen als zulässig (z.B. bei EEPROM/Flash Fehler) 1321 Message_EditBuffer->Header.Laenge = MESSAGE_MAXLEN;1335 Screen_MsgBuffer->Header.Laenge = MESSAGE_MAXLEN; 1322 1336 } 1323 1337 // Nachricht einlesen 1324 1338 spieeprom_read_block((uint32_t) ((uint16_t)EECurrPtr), 1325 Message_EditBuffer, sizeof(MessageHeader_t)+Message_EditBuffer->Header.Laenge );1326 Message_EditBuffer->Nachricht[sizeof(MessageHeader_t)+ Message_EditBuffer->Header.Laenge] = 0; // Mit 0 terminieren1339 Screen_MsgBuffer, sizeof(MessageHeader_t)+Screen_MsgBuffer->Header.Laenge ); 1340 Screen_MsgBuffer->Nachricht[sizeof(MessageHeader_t)+ Screen_MsgBuffer->Header.Laenge] = 0; // Mit 0 terminieren 1327 1341 Keypad_PadMode = PAD_Steuer; 1328 Screen_ShowMsg(Message_EditBuffer, highlightMessageBlockNr); 1329 vPortFree(Message_EditBuffer); // Speicher wieder freigeben 1342 Message_EditBuffer = Screen_MsgBuffer; // TODO: Pointer als Argument übergeben 1343 Screen_ShowMsg(Screen_MsgBuffer, highlightMessageBlockNr); 1344 vPortFree(Screen_MsgBuffer); // Speicher wieder freigeben 1330 1345 } 1331 1346 //TODO: Fehlermeldung ausgeben, wenn zu wenig Speicher frei … … 1352 1367 LCD_SetTextCursor(0,1); 1353 1368 LCD_PutString_P(STR_Absend); 1354 memset(buf, 0, sizeof(buf));1355 1369 strncpy(buf, Message_EditBuffer->Header.Absender, ADDRESS_MAXCHAR); 1370 buf[8]=0; 1356 1371 LCD_PutString(buf); 1357 1372 1358 1373 LCD_SetTextCursor(0,2); 1359 1374 LCD_PutString_P(STR_Empf); 1360 memset(buf, 0, sizeof(buf));1361 1375 strncpy(buf, Message_EditBuffer->Header.Empfaenger, ADDRESS_MAXCHAR); 1362 1376 LCD_PutString(buf); … … 1365 1379 LCD_SetTextCursor(0,3); 1366 1380 LCD_PutString_P(STR_Zeit); 1367 memset(buf, 0, sizeof(buf)); 1381 //memset(buf, 0, sizeof(buf)); 1382 // -> itoa liefer 0-terminierten String! 1368 1383 LCD_PutString(itoa(Message_EditBuffer->Header.UniqueID, buf, 10)); 1369 1384 -
branches/yfe_rtos/heap_2.c
r331 r380 240 240 xBlockLink *pxLink; 241 241 242 if( pv )242 if( pv!=NULL ) 243 243 { 244 244 /* The memory being freed will have an xBlockLink structure immediately … … 254 254 prvInsertBlockIntoFreeList( ( ( xBlockLink * ) pxLink ) ); 255 255 } 256 xTaskResumeAll(); 256 xTaskResumeAll(); 257 257 } 258 258 } -
branches/yfe_rtos/l2rx.c
r379 r380 366 366 while( xQueueReceive(RxDataInHandle, &data, 0)==pdPASS ); // Queue leeren 367 367 368 if (RxBuffer!=NULL) // Speicher freigeben, falls welcher angefordert wurde 369 { 370 vPortFree(RxBuffer); 371 } 372 if (ParBuffer!=NULL) 373 { 374 vPortFree(ParBuffer); 375 } 368 // Speicher freigeben, falls welcher angefordert wurde 369 vPortFree(RxBuffer); 370 vPortFree(ParBuffer); 376 371 rx_state = IDLE; 377 372 }
Note: See TracChangeset
for help on using the changeset viewer.
