void boardOff() { BACKLIGHT_OFF(); #if defined(REV9E) topLcdOff(); #endif #if defined(REV9E) while (pwrPressed()) { wdt_reset(); } #endif lcdOff(); SysTick->CTRL = 0; // turn off systick pwrOff(); }
void menusTask(void * pdata) { opentxInit(); #if defined(PCBTARANIS) && defined(REV9E) while (1) { uint32_t pwr_check = pwrCheck(); if (pwr_check == e_power_off) { break; } else if (pwr_check == e_power_press) { continue; } #else while (pwrCheck() != e_power_off) { #endif U64 start = CoGetOSTime(); perMain(); // TODO remove completely massstorage from sky9x firmware U32 runtime = (U32)(CoGetOSTime() - start); // deduct the thread run-time from the wait, if run-time was more than // desired period, then skip the wait all together if (runtime < MENU_TASK_PERIOD_TICKS) { CoTickDelay(MENU_TASK_PERIOD_TICKS - runtime); } } #if defined(REV9E) topLcdOff(); #endif BACKLIGHT_OFF(); #if defined(PCBTARANIS) displaySleepBitmap(); #else lcd_clear(); displayPopup(STR_SHUTDOWN); #endif opentxClose(); boardOff(); // Only turn power off if necessary } extern void audioTask(void* pdata); void tasksStart() { CoInitOS(); #if defined(CLI) cliStart(); #endif #if defined(BLUETOOTH) btTaskId = CoCreateTask(btTask, NULL, 15, &btStack[BT_STACK_SIZE-1], BT_STACK_SIZE); #endif mixerTaskId = CoCreateTask(mixerTask, NULL, 5, &mixerStack[MIXER_STACK_SIZE-1], MIXER_STACK_SIZE); menusTaskId = CoCreateTask(menusTask, NULL, 10, &menusStack[MENUS_STACK_SIZE-1], MENUS_STACK_SIZE); audioTaskId = CoCreateTask(audioTask, NULL, 7, &audioStack[AUDIO_STACK_SIZE-1], AUDIO_STACK_SIZE); #if !defined(SIMU) audioMutex = CoCreateMutex(); mixerMutex = CoCreateMutex(); #endif CoStartOS(); }
int main(void){ bPriLev=PRI_MAIN; tTime.bDay=7; tTime.bMonth=8; tTime.bYear=11; _init(); while(1) { /* Infinite Loop */ switch(bState){ /*--------------------------------------------------------------------------------------------------*/ case STATE_IDLE: switch(bBtn){ case NO_BTN: if(bTimeColonToToggle){ toggleTimeColon(); bTimeColonToToggle=0; } refreshQuote(); bFirst=1; break; case BTN_A: case BTN_B: case BTN_C: case BTN_A_LONG: case BTN_B_LONG: START_BACKLIGHT(); bBtn=NO_BTN; break; case BTN_C_LONG: bState = STATE_MENU; BACKLIGHT_ON(); bBtn=NO_BTN; break; default: break; } break; /*--------------------------------------------------------------------------------------------------*/ case STATE_MENU: switch(bBtn){ case NO_BTN: if(bSelectionMenuChanged || bFirst){ bFirst=0; bSelectionMenuChanged=0; LCDWriteStringXY(0,0,"-"); LCDWriteStringXY(1,0, options[bSelectionMenu]); LCDWriteStringXY(0,1," "); LCDWriteStringXY(1,1, options[bSelectionMenu+1]); } break; case BTN_A: bSelectionMenu++; bSelectionMenu %= NUMBER_OF_OPTIONS; bSelectionMenuChanged=1; bBtn=NO_BTN; break; case BTN_B: if(bSelectionMenu>0) bSelectionMenu--; else bSelectionMenu=(NUMBER_OF_OPTIONS-1); bSelectionMenu %= NUMBER_OF_OPTIONS; bSelectionMenuChanged=1; bBtn=NO_BTN; break; case BTN_C: switch(bSelectionMenu){ case SEL_DATE: bState = STATE_EDIT_DATE; bBtn = NO_BTN; break; case SEL_TIME: bState = STATE_EDIT_TIME; bBtn = NO_BTN; break; case SEL_TIMEZONE: bState = STATE_EDIT_TIMEZONE; bBtn = NO_BTN; break; default: break; } bFirst=1; break; case BTN_C_LONG: bState = STATE_IDLE; bBtn=NO_BTN; BACKLIGHT_OFF(); START_BACKLIGHT(); LCD_RESET(); bSelectionMenu=0; bDateChanged=1; // Appena rientro in idle stampo le quote bTimeChanged=1; bTempChanged=1; break; default: break; } break; /*--------------------------------------------------------------------------------------------------*/ case STATE_EDIT_DATE: switch(bBtn){ case NO_BTN: if(bFirst){ bFirst=0; LCDClear(); tTimeEditing = tTime; sprintf(str, "%02d/%02d/%02d", tTimeEditing.bDay, tTimeEditing.bMonth, tTimeEditing.bYear); LCDWriteStringXY(0,0, "Editing date:"); LCDWriteStringXY(3,1, str); LCDCmd(0x0f); // set blinking cursor LCD_CURSOR_LEFT_N(8); } break; case BTN_A: bBtn = NO_BTN; changeEditDate(bSelectionDate, BTN_A); sprintf(str, "%02d/%02d/%02d", tTimeEditing.bDay, tTimeEditing.bMonth, tTimeEditing.bYear); LCDWriteStringXY(3,1,str); LCD_CURSOR_LEFT_N(8-bSelectionDate); break; case BTN_B: bBtn = NO_BTN; changeEditDate(bSelectionDate, BTN_B); sprintf(str, "%02d/%02d/%02d", tTimeEditing.bDay, tTimeEditing.bMonth, tTimeEditing.bYear); LCDWriteStringXY(3,1,str); LCD_CURSOR_LEFT_N(8-bSelectionDate); break; case BTN_C: if(bSelectionDate<7){ LCD_CURSOR_RIGHT_N(1); bSelectionDate++; } else{ bSelectionDate=0; LCD_CURSOR_LEFT_N(7); } // eseguo il controllo della data solo se passo da giorno a mese e da mese a anno if(bSelectionDate==2 || bSelectionDate==5){ LCD_CURSOR_RIGHT_N(1); bSelectionDate++; if(checkDate(&tTimeEditing, aDays)){ sprintf(str, "%02d/%02d/%02d", tTimeEditing.bDay, tTimeEditing.bMonth, tTimeEditing.bYear); LCDWriteStringXY(3,1,str); LCD_CURSOR_LEFT_N(8-bSelectionDate); } } bBtn = NO_BTN; break; case BTN_C_LONG: bState=STATE_EDIT_DATE_CONFIRM; bBtn=NO_BTN; bFirst=1; break; default: break; } break; /*--------------------------------------------------------------------------------------------------*/ case STATE_EDIT_DATE_CONFIRM: switch(bBtn){ case NO_BTN: if(bFirst){ LCDWriteStringXY(0,0, "Confermi? Si/No"); LCD_CURSOR_LEFT_N(5); bFirst=0; bSelectionDate=0; } if(bSelectionDateChanged){ if(bSelectionDate==0){ LCD_SET_CURSOR_POSITION(10); } else{ LCD_SET_CURSOR_POSITION(13); } bSelectionDateChanged=0; } break; case BTN_C: bSelectionDate = (bSelectionDate == 0)?1:0; bSelectionDateChanged=1; bBtn=NO_BTN; break; case BTN_C_LONG: if(bSelectionDate){ bState = STATE_MENU; bSelectionDate=0; }else{ tTime.bDay = tTimeEditing.bDay; tTime.bMonth = tTimeEditing.bMonth; tTime.bYear = tTimeEditing.bYear; bState = STATE_MENU; LCD_RESET(); } bBtn = NO_BTN; bFirst=1; break; default: break; } break; /*--------------------------------------------------------------------------------------------------*/ case STATE_EDIT_TIME: switch(bBtn){ case NO_BTN: if(bFirst){ bFirst=0; LCDClear(); tTimeEditing = tTime; sprintf(str, "%02d:%02d:%02d", tTimeEditing.bHour, tTimeEditing.bMin, tTimeEditing.bSec); LCDWriteStringXY(0,0, "Editing time:"); LCDWriteStringXY(3,1, str); LCDCmd(0x0f); // set blinking cursor LCD_CURSOR_LEFT_N(8); } break; case BTN_A: bBtn = NO_BTN; changeEditTime(bSelectionTime, BTN_A); sprintf(str, "%02d:%02d:%02d", tTimeEditing.bHour, tTimeEditing.bMin, tTimeEditing.bSec); LCDWriteStringXY(3,1,str); LCD_CURSOR_LEFT_N(8-bSelectionTime); break; case BTN_B: bBtn = NO_BTN; changeEditTime(bSelectionTime, BTN_B); sprintf(str, "%02d:%02d:%02d", tTimeEditing.bHour, tTimeEditing.bMin, tTimeEditing.bSec); LCDWriteStringXY(3,1,str); LCD_CURSOR_LEFT_N(8-bSelectionTime); break; case BTN_C: if(bSelectionTime<7){ LCDCmd(0x14); bSelectionTime++; } else{ bSelectionTime=0; LCD_CURSOR_LEFT_N(7); } if(bSelectionTime==2 || bSelectionTime==5){ LCDCmd(0x14); bSelectionTime++; } bBtn = NO_BTN; break; case BTN_C_LONG: bState=STATE_EDIT_TIME_CONFIRM; bBtn=NO_BTN; bFirst=1; break; default: break; } break; /*--------------------------------------------------------------------------------------------------*/ case STATE_EDIT_TIME_CONFIRM: switch(bBtn){ case NO_BTN: if(bFirst){ LCDWriteStringXY(0,0, "Confermi? Si/No"); LCD_CURSOR_LEFT_N(5); bFirst=0; bSelectionTime=0; } if(bSelectionTimeChanged){ if(bSelectionTime==0){ LCD_SET_CURSOR_POSITION(10); } else{ LCD_SET_CURSOR_POSITION(13); } bSelectionTimeChanged=0; } break; case BTN_C: bSelectionTime = (bSelectionTime == 0)?1:0; bSelectionTimeChanged=1; bBtn=NO_BTN; break; case BTN_C_LONG: if(bSelectionTime){ bState = STATE_MENU; bSelectionTime=0; }else{ tTime.bSec = tTimeEditing.bSec; tTime.bMin = tTimeEditing.bMin; tTime.bHour = tTimeEditing.bHour; bState = STATE_MENU; LCD_RESET(); } bBtn = NO_BTN; bFirst=1; break; default: break; } break; /*--------------------------------------------------------------------------------------------------*/ case STATE_EDIT_TIMEZONE: switch(bBtn){ case NO_BTN: if(bFirst){ bFirst=0; LCDClear(); LCDWriteStringXY(0,0, "Edit timezone:"); LCDWriteStringXY(0,1,"1="); } break; default: break; } break; default: break; } } }