void App_t::ShowAddRemoveResult(AddRemoveResult_t Rslt) { switch(Rslt) { case arrAddingOk: Led.StartSequence(lsqAddingAccessNew); LedService.StartSequence(lsqAddingAccessNew); break; case arrAddingErr: Led.StartSequence(lsqAddingAccessError); LedService.StartSequence(lsqAddingAccessError); break; case arrRemovingOk: Led.StartSequence(lsqRemovingAccessNew); LedService.StartSequence(lsqRemovingAccessNew); break; } }
int main() { // ==== Setup clock ==== Clk.UpdateFreqValues(); uint8_t ClkResult = FAILURE; Clk.SetupFlashLatency(12); // Setup Flash Latency for clock in MHz // 12 MHz/6 = 2; 2*192 = 384; 384/8 = 48 (preAHB divider); 384/8 = 48 (USB clock) Clk.SetupPLLDividers(6, 192, pllSysDiv8, 8); // 48/4 = 12 MHz core clock. APB1 & APB2 clock derive on AHB clock Clk.SetupBusDividers(ahbDiv4, apbDiv1, apbDiv1); if((ClkResult = Clk.SwitchToPLL()) == 0) Clk.HSIDisable(); Clk.UpdateFreqValues(); // ==== Init OS ==== halInit(); chSysInit(); // ==== Init Hard & Soft ==== App.PThd = chThdSelf(); Uart.Init(115200); Uart.Printf("\rLockNFC3 F205 AHB freq=%uMHz", Clk.AHBFreqHz/1000000); // Report problem with clock if any if(ClkResult) Uart.Printf("Clock failure\r"); LedService.Init(); LedService.StartSequence(lsqBlinkGreenX2); Led.Init(); Led.StartSequence(lsqDoorClose); Sensors.Init(); Pn.Init(); SD.Init(); // SD-card init App.IDStore.Load(); // Init Srorage of IDs SndList.Init(); App.ReadConfig(); // Read config from SD-card Sound.Init(); Sound.SetVolume(250); Sound.RegisterAppThd(chThdSelf()); Sound.Play("alive.wav"); #if USB_ENABLED MassStorage.Init(); // Init USB MassStorage device #endif // ==== Main cycle ==== App.ITask(); }
int main(void) { // ==== Init Vcore & clock system ==== SetupVCore(vcore1V5); Clk.UpdateFreqValues(); // ==== Init OS ==== halInit(); chSysInit(); // ==== Init Hard & Soft ==== Uart.Init(115200); Uart.Printf("\rLocket AHB=%u", Clk.AHBFreqHz); App.InitThread(); // App.LoadSettings(); // PinSensors.Init(); // Beeper.Init(); // Beeper.StartSequence(bsqBeepBeep); Led.Init(); Led.StartSequence(lsqStart); // Vibro.Init(); // Vibro.StartSequence(vsqBrrBrr); // PinSetupOut(GPIOB, 8, omPushPull, pudNone); // PinClear(GPIOB, 8); // PwmPin_t IPin; // IPin.Init(GPIOB, 8, TIM4, 3, 22); // IPin.SetFreqHz(450); // IPin.Set(11); // Radio.Init(); // Main cycle App.ITask(); }
void App_t::EnterState(AppState_t NewState) { State = NewState; switch(NewState) { case asIdle: if(IDStore.HasChanged) IDStore.Save(); Led.StartSequence(lsqDoorClose); LedService.StartSequence(lsqIdle); return; break; case asAddingAccess: Led.StartSequence(lsqAddingAccessWaiting); LedService.StartSequence(lsqAddingAccessWaiting); break; case asRemovingAccess: Led.StartSequence(lsqRemovingAccessWaiting); LedService.StartSequence(lsqRemovingAccessWaiting); break; case asAddingAdder: LedService.StartSequence(lsqAddingAdderWaiting); break; case asRemovingAdder: LedService.StartSequence(lsqRemovingAdderWaiting); break; case asAddingRemover: LedService.StartSequence(lsqAddingRemoverWaiting); break; case asRemovingRemover: LedService.StartSequence(lsqRemovingRemoverWaiting); break; } // switch RestartStateTimer(); }
static msg_t LedThread(void *arg) { (void)arg; chRegSetThreadName("Lcd"); while(1) Led.Task(); return 0; }
void App_t::ITask() { while(true) { uint32_t EvtMsk = chEvtWaitAny(ALL_EVENTS); // ==== Card ==== if(EvtMsk & EVTMSK_CARD_APPEARS) ProcessCardAppearance(); #if 1 // ==== Door ==== if(EvtMsk & EVTMSK_DOOR_OPEN) { DoorState = dsOpen; Led.StartSequence(lsqDoorOpen); // Set color SndList.PlayRandomFileFromDir(DIRNAME_GOOD_KEY); Uart.Printf("\rDoor is open"); chSysLock(); if(chVTIsArmedI(&IDoorTmr)) chVTResetI(&IDoorTmr); chVTSetI(&IDoorTmr, MS2ST(DOOR_CLOSE_TIMEOUT), TmrGeneralCallback, (void*)EVTMSK_DOOR_SHUT); chSysUnlock(); } if(EvtMsk & EVTMSK_DOOR_SHUT) { DoorState = dsClosed; Led.StartSequence(lsqDoorClose); // Set color SndList.PlayRandomFileFromDir(DIRNAME_DOOR_CLOSING); Uart.Printf("\rDoor is closing"); } if(EvtMsk & EVTMSK_BAD_KEY) { Led.StartSequence(lsqDoorWrongKey); SndList.PlayRandomFileFromDir(DIRNAME_BAD_KEY); Uart.Printf("\rBadKey"); } #endif #if 1 // ==== Secret key ==== if(EvtMsk & EVTMSK_SECRET_KEY) { Led.StartSequence(lsqDoorSecretKey); SndList.PlayRandomFileFromDir(DIRNAME_SECRET); Uart.Printf("\rSecretKey"); } #endif #if 1 // ==== Keys ==== if(EvtMsk & EVTMSK_KEYS) { KeyEvtInfo_t EInfo; while(Keys.EvtBuf.Get(&EInfo) == OK) { // Uart.Printf("\rEinfo: %u, %u, %u", EInfo.Type, EInfo.KeysCnt, EInfo.KeyID[0]); if(EInfo.Type == kePress) { switch(EInfo.KeyID[0]) { // Iterate AccessAdd / AccessRemove / Idle case keyA: switch(State) { case asAddingAccess: EnterState(asRemovingAccess); break; case asRemovingAccess: EnterState(asIdle); break; default: EnterState(asAddingAccess); break; } // switch State break; // Iterate AdderAdd / AdderRemove / Idle case keyB: switch(State) { case asAddingAdder: EnterState(asRemovingAdder); break; case asRemovingAdder: EnterState(asIdle); break; default: EnterState(asAddingAdder); break; } // switch State break; // Iterate RemoverAdd / RemoverRemove / Idle case keyC: switch(State) { case asAddingRemover: EnterState(asRemovingRemover); break; case asRemovingRemover: EnterState(asIdle); break; default: EnterState(asAddingRemover); break; } // switch State break; } // switch } // if keypress else if(EInfo.Type == keCombo and EInfo.KeyID[0] == keyA and EInfo.KeyID[1] == keyB) { LedService.StartSequence(lsqEraseAll); IDStore.EraseAll(); chThdSleepMilliseconds(1530); // Allow LED to complete blinking EnterState(asIdle); } } // while } // if keys #endif #if USB_ENABLED // ==== USB connection ==== if(EvtMsk & EVTMSK_USB_CONNECTED) { chSysLock(); Clk.SetFreq48Mhz(); Clk.InitSysTick(); chSysUnlock(); Usb.Init(); chThdSleepMilliseconds(540); Usb.Connect(); Uart.Printf("\rUsb connected, AHB freq=%uMHz", Clk.AHBFreqHz/1000000); } if(EvtMsk & EVTMSK_USB_DISCONNECTED) { Usb.Shutdown(); MassStorage.Reset(); chSysLock(); Clk.SetFreq12Mhz(); Clk.InitSysTick(); chSysUnlock(); Uart.Printf("\rUsb disconnected, AHB freq=%uMHz", Clk.AHBFreqHz/1000000); } #endif // ==== State timeout ==== if(EvtMsk & EVTMSK_STATE_TIMEOUT) EnterState(asIdle); } // while true }
static void LedThread(void *arg) { chRegSetThreadName("Lcd"); while(true) Led.Task(); }
// Timer callback static void LedTmrCallback(void *p) { chSysLockFromIsr(); Led.IStartSequenceI((const LedChunk_t*)p); chSysUnlockFromIsr(); }