/* * * Copyright (c) 2020 Project CHIP Authors * All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include #include #include "FreeRTOS.h" #include "timers.h" #include using namespace ::chip; using namespace ::chip::DeviceLayer; #define APP_BUTTON_PRESSED_ITVL 50 #define APP_BUTTON_PRESS_JITTER 100 #define APP_BUTTON_PRESS_SHORT 1000 #define APP_BUTTON_PRESS_LONG 4000 #define APP_TIMER_EVENT_DEFAULT_ITVL 1000 #define APP_LIGHT_ENDPOINT_ID 1 #define APP_REBOOT_RESET_COUNT 3 #define APP_REBOOT_RESET_COUNT_KEY "app_reset_cnt" // Application-defined error codes in the CHIP_ERROR space. #define APP_ERROR_EVENT_QUEUE_FAILED CHIP_APPLICATION_ERROR(0x01) #define APP_ERROR_CREATE_TASK_FAILED CHIP_APPLICATION_ERROR(0x02) #define APP_ERROR_UNHANDLED_EVENT CHIP_APPLICATION_ERROR(0x03) #define APP_ERROR_CREATE_TIMER_FAILED CHIP_APPLICATION_ERROR(0x04) #define APP_ERROR_START_TIMER_FAILED CHIP_APPLICATION_ERROR(0x05) #define APP_ERROR_STOP_TIMER_FAILED CHIP_APPLICATION_ERROR(0x06) struct Identify; class AppTask { public: friend AppTask & GetAppTask(void); enum app_event_t { APP_EVENT_NONE = 0x00000000, APP_EVENT_TIMER = 0x00000010, APP_EVENT_BTN_SHORT = 0x00000020, APP_EVENT_FACTORY_RESET = 0x00000040, APP_EVENT_BTN_LONG = 0x00000080, APP_EVENT_BTN_ISR = 0x00000100, APP_EVENT_LIGHTING_ONOFF = 0x00010000, APP_EVENT_LIGHTING_LEVEL = 0x00020000, APP_EVENT_LIGHTING_COLOR = 0x00040000, APP_EVENT_LIGHTING_MASK = APP_EVENT_LIGHTING_ONOFF | APP_EVENT_LIGHTING_LEVEL | APP_EVENT_LIGHTING_COLOR, APP_EVENT_IDENTIFY_START = 0x01000000, APP_EVENT_IDENTIFY_IDENTIFY = 0x02000000, APP_EVENT_IDENTIFY_STOP = 0x04000000, APP_EVENT_IDENTIFY_MASK = APP_EVENT_IDENTIFY_START | APP_EVENT_IDENTIFY_IDENTIFY | APP_EVENT_IDENTIFY_STOP, APP_EVENT_ALL_MASK = APP_EVENT_LIGHTING_MASK | APP_EVENT_TIMER | APP_EVENT_BTN_SHORT | APP_EVENT_BTN_LONG | APP_EVENT_BTN_ISR | APP_EVENT_IDENTIFY_MASK, }; void SetEndpointId(EndpointId endpointId) { if (mEndpointId != (EndpointId) -1) mEndpointId = endpointId; } EndpointId GetEndpointId(void) { return mEndpointId; } void PostEvent(app_event_t event); void ButtonEventHandler(uint8_t btnIdx, uint8_t btnAction); #ifdef BOOT_PIN_RESET static void ButtonEventHandler(void * arg); #endif static void IdentifyStartHandler(Identify *); static void IdentifyStopHandler(Identify *); static void IdentifyHandleOp(app_event_t event); private: friend void StartAppTask(void); friend PlatformManagerImpl; static uint32_t AppRebootCheck(uint32_t time = 0); static void LightingSetBleAdv(void); static void LightingSetProvisioned(void); static void LightingSetFactoryReset(void); static void LightingUpdate(app_event_t event = APP_EVENT_NONE); static bool StartTimer(void); static void CancelTimer(void); static void TimerEventHandler(app_event_t event); static void TimerCallback(TimerHandle_t xTimer); #ifdef BOOT_PIN_RESET static void ButtonInit(void); static bool ButtonPressed(void); #endif static void ScheduleInit(intptr_t arg); static void AppTaskMain(void * pvParameter); static CHIP_ERROR StartAppShellTask(); static void AppShellTask(void * args); EndpointId mEndpointId = (EndpointId) 1; TaskHandle_t sAppTaskHandle; QueueHandle_t sAppEventQueue; TimerHandle_t sTimer; uint32_t mTimerIntvl; uint64_t mButtonPressedTime; static StackType_t appStack[APP_TASK_STACK_SIZE / sizeof(StackType_t)]; static StaticTask_t appTaskStruct; static AppTask sAppTask; }; inline AppTask & GetAppTask(void) { return AppTask::sAppTask; } void StartAppTask();