示例#1
0
文件: main.cpp 项目: Kreyl/nute
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;
    }
}
示例#2
0
文件: main.cpp 项目: Kreyl/nute
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();
}
示例#3
0
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();
}
示例#4
0
文件: main.cpp 项目: Kreyl/nute
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();
}
示例#5
0
文件: led.cpp 项目: Kreyl/nute
static msg_t LedThread(void *arg) {
    (void)arg;
    chRegSetThreadName("Lcd");
    while(1) Led.Task();
    return 0;
}
示例#6
0
文件: main.cpp 项目: Kreyl/nute
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
}
示例#7
0
文件: led.cpp 项目: Kreyl/nute
static void LedThread(void *arg) {
    chRegSetThreadName("Lcd");
    while(true) Led.Task();
}
示例#8
0
文件: led_rgb.cpp 项目: Kreyl/nute
// Timer callback
static void LedTmrCallback(void *p) {
    chSysLockFromIsr();
    Led.IStartSequenceI((const LedChunk_t*)p);
    chSysUnlockFromIsr();
}