diff --git a/Source/hal_board_cfg.h b/Source/hal_board_cfg.h index 4f235cd..e34719f 100644 --- a/Source/hal_board_cfg.h +++ b/Source/hal_board_cfg.h @@ -61,25 +61,25 @@ #define HAL_LED_BLINK_DELAY() st( { volatile uint32 i; for (i=0; i<0x5800; i++) { }; } ) #if defined(HAL_BOARD_TARGET) - //led - #define LED1_BV BV(4) - #define LED1_SBIT P0_4 - #define LED1_DDR P0DIR + //blue + #define LED1_BV BV(7) + #define LED1_SBIT P1_7 + #define LED1_DDR P1DIR #define LED1_POLARITY ACTIVE_HIGH -//catch - #define LED2_BV BV(1) - #define LED2_SBIT P0_1 - #define LED2_DDR P0DIR +//green + #define LED2_BV BV(6) + #define LED2_SBIT P1_6 + #define LED2_DDR P1DIR #define LED2_POLARITY ACTIVE_HIGH -//answer - #define LED3_BV BV(2) - #define LED3_SBIT P0_2 - #define LED3_DDR P0DIR +//red + #define LED3_BV BV(5) + #define LED3_SBIT P1_5 + #define LED3_DDR P1DIR #define LED3_POLARITY ACTIVE_HIGH -//handset +//NC #define LED4_BV BV(3) #define LED4_SBIT P0_3 - #define LED4_DDR P0DIR + #define LED4_DDR P1DIR #define LED4_POLARITY ACTIVE_HIGH diff --git a/Source/preinclude.h b/Source/preinclude.h index 5138b8b..344c391 100644 --- a/Source/preinclude.h +++ b/Source/preinclude.h @@ -65,7 +65,7 @@ #endif #define BTN_HOLD_TIME 1000 -#define FACTORY_RESET_HOLD_TIME_LONG 5000 +#define FACTORY_RESET_HOLD_TIME_LONG 10000 #if defined( DO_DEBUG_UART ) #define HAL_UART_ISR 2 diff --git a/Source/zcl_app.c b/Source/zcl_app.c index c41a1d5..ba5464c 100644 --- a/Source/zcl_app.c +++ b/Source/zcl_app.c @@ -68,7 +68,8 @@ byte zclApp_TaskID; * LOCAL VARIABLES */ -static uint8 currentBtnClickPhase = 0; +//static uint8 currentBtnClickPhase = 0; +//static byte BtnClickCount = 0; /********************************************************************* * LOCAL FUNCTIONS @@ -78,16 +79,18 @@ static void zclApp_BasicResetCB(void); static void zclApp_RestoreAttributesFromNV(void); static void zclApp_SaveAttributesToNV(void); static void zclApp_HandleKeys(byte portAndAction, byte keyCode); +static void zclApp_ControlPinsInit(void); static ZStatus_t zclApp_ReadWriteAuthCB(afAddrType_t *srcAddr, zclAttrRec_t *pAttr, uint8 oper); static void zclApp_Report(void); static void zclApp_OneReport(void); static void zclApp_ConfigInit(bool restart); -static void zclApp_BtnClick(bool hold); +static void zclApp_BtnClicks(byte count); static void zclApp_RingRun(void); static void zclApp_TalkStart(void); static void zclApp_RingEnd(void); +static void zclApp_WorkWithLEDs(void); /********************************************************************* * ZCL General Profile Callback table @@ -123,11 +126,23 @@ void zclApp_Init(byte task_id) { zclApp_ConfigInit(TIMER_START); + zclApp_ControlPinsInit(); + osal_start_timerEx(zclApp_TaskID, APP_WORK_LED_EVT, 100); + IO_IMODE_PORT_PIN(0,0,IO_TRI); #if defined( ZIC_BATTERY_MODE ) ZMacSetTransmitPower(TX_PWR_PLUS_4); // set 4dBm #endif + +} + +static void zclApp_ControlPinsInit (void) { + P0SEL &= ~0x0E; //Set P0_1, P0_2, P0_3 as general I/O port functions + P0DIR |= 0x0E; //Set the port transmission mode of P0_1, P0_2, P0_3 to output + P0SEL &= ~0x01; //Set P0_0 as general I/O port function + P0DIR &= ~0x01; //Set the port transmission mode of P0_0 to input + // ? P0INP &= ~0x01; //Set the port input mode of P0_0 to: pull up/down } @@ -171,21 +186,22 @@ static void zclApp_HandleKeys(byte portAndAction, byte keyCode) { zclFactoryResetter_HandleKeys(portAndAction, keyCode); if (portAndAction & HAL_KEY_PRESS) { LREPMaster("Key pressed\r\n"); - zclApp_State.pressTime = osal_GetSystemClock(); - LREP("pressTime = %ld\r\n", zclApp_State.pressTime); + zclApp_State.clicks++; + + osal_start_timerEx(zclApp_TaskID, APP_BTN_HOLD_EVT, 2000); + osal_stop_timerEx(zclApp_TaskID, APP_BTN_CLICK_EVT); } if (portAndAction & HAL_KEY_RELEASE) { LREPMaster("Key released\r\n"); - uint32 holdTime = osal_GetSystemClock() - zclApp_State.pressTime; - LREP("holdTime = %ld \r\n", holdTime); - if (zclApp_State.pressTime != 0 && holdTime >= BTN_HOLD_TIME) { // check release without press and hold milliseconds - osal_start_timerEx(zclApp_TaskID, APP_BTN_HOLD_EVT, 50); + + osal_stop_timerEx(zclApp_TaskID, APP_BTN_HOLD_EVT); + if (zclApp_State.clicks == 1) { + osal_start_timerEx(zclApp_TaskID, APP_BTN_CLICK_EVT, 250); } - else { - osal_start_timerEx(zclApp_TaskID, APP_BTN_CLICK_EVT, 50); + if (zclApp_State.clicks == 2) { + osal_start_timerEx(zclApp_TaskID, APP_BTN_DOUBLE_EVT, 250); } - zclApp_State.pressTime = 0; - } + } } } @@ -234,7 +250,7 @@ uint16 zclApp_event_loop(uint8 task_id, uint16 events) { if (events & APP_BTN_CLICK_EVT) { LREPMaster("APP_BTN_CLICK_EVT\r\n"); - zclApp_BtnClick(false); + zclApp_BtnClicks(1); return (events ^ APP_BTN_CLICK_EVT); } @@ -256,13 +272,26 @@ uint16 zclApp_event_loop(uint8 task_id, uint16 events) { return (events ^ APP_TALK_START_EVT); } + if (events & APP_WORK_LED_EVT) { + LREPMaster("APP_WORK_LED_EVT\r\n"); + zclApp_WorkWithLEDs(); + return (events ^ APP_WORK_LED_EVT); + } + if (events & APP_BTN_HOLD_EVT) { LREPMaster("APP_BTN_HOLD_EVT\r\n"); - #if !defined( ZIC_BATTERY_MODE ) - zclApp_BtnClick(true); - #endif + //#if !defined( ZIC_BATTERY_MODE ) + zclApp_BtnClicks(255); + //#endif return (events ^ APP_BTN_HOLD_EVT); } + + if (events & APP_BTN_DOUBLE_EVT) { + LREPMaster("APP_BTN_DOUBLE_EVT\r\n"); + zclApp_BtnClicks(2); + return (events ^ APP_BTN_DOUBLE_EVT); + } + return 0; } @@ -297,7 +326,8 @@ static void zclApp_RingRun(void) { if ((zclApp_Config.ModeOpen == Once) || (zclApp_Config.ModeOpen == Always)){ if (zclApp_State.RingRunStep > ((zclApp_Config.TimeRing + zclApp_Config.TimeTalk) * 2)) { zclApp_State.State = Open; - HalLedSet(ANSWER_PIN, HAL_LED_MODE_OFF); + //HalLedSet(ANSWER_PIN, HAL_LED_MODE_OFF); + ANSWER_O_PIN = 0; zclApp_OneReport(); } } @@ -325,20 +355,26 @@ static void zclApp_TalkStart(void) { //osal_stop_timerEx(zclApp_TaskID, APP_RING_STOP_EVT); //osal_clear_event(zclApp_TaskID, APP_RING_STOP_EVT); zclApp_OneReport(); - HalLedSet(ANSWER_PIN, HAL_LED_MODE_ON); + //HalLedSet(ANSWER_PIN, HAL_LED_MODE_ON); + ANSWER_O_PIN = 1; if (zclApp_Config.ModeSound == true) { - HalLedSet(HANDSET_PIN, HAL_LED_MODE_ON); + //HalLedSet(HANDSET_PIN, HAL_LED_MODE_ON); + HANDSET_O_PIN = 1; } else { - HalLedSet(CATCH_PIN, HAL_LED_MODE_OFF); + //HalLedSet(CATCH_PIN, HAL_LED_MODE_OFF); + CATCH_O_PIN = 0; } } static void zclApp_RingEnd(void) { LREPMaster("Ring end\r\n"); - HalLedSet(CATCH_PIN, !zclApp_Config.ModeSound); - HalLedSet(HANDSET_PIN, !zclApp_Config.ModeSound); - HalLedSet(ANSWER_PIN, HAL_LED_MODE_OFF); + //HalLedSet(CATCH_PIN, !zclApp_Config.ModeSound); + CATCH_O_PIN = !zclApp_Config.ModeSound; + //HalLedSet(HANDSET_PIN, !zclApp_Config.ModeSound); + HANDSET_O_PIN = !zclApp_Config.ModeSound; + //HalLedSet(ANSWER_PIN, HAL_LED_MODE_OFF); + ANSWER_O_PIN = 0; osal_stop_timerEx(zclApp_TaskID, APP_RING_RUN_EVT); //osal_clear_event(zclApp_TaskID, APP_RING_RUN_EVT); //osal_stop_timerEx(zclApp_TaskID, APP_RING_STOP_EVT); @@ -360,57 +396,78 @@ static void zclApp_RingEnd(void) { #endif } -static void zclApp_BtnClick(bool hold) { - LREP("currentBtnClickPhase %d\r\n", currentBtnClickPhase); - switch (currentBtnClickPhase++) { - case 0: - if (hold) { - zclApp_Config.ModeSound = !zclApp_Config.ModeSound; - HalLedSet(HANDSET_PIN, !zclApp_Config.ModeSound); - HalLedSet(CATCH_PIN, !zclApp_Config.ModeSound); + +static void zclApp_WorkWithLEDs(void) { + if (zclApp_Config.ModeOpen == Always) { + HalLedSet(GREEN_LED_PIN, HAL_LED_MODE_ON); + } + if (zclApp_Config.ModeOpen != Always) { + HalLedSet(GREEN_LED_PIN, HAL_LED_MODE_OFF); + } + if (zclApp_Config.ModeOpen == Once) { + HalLedSet(GREEN_LED_PIN, HAL_LED_MODE_BLINK); //FLASH + } + if (zclApp_Config.ModeOpen == Drop) { + HalLedSet(RED_LED_PIN, HAL_LED_MODE_ON); + } + if (zclApp_Config.ModeOpen != Drop) { + HalLedSet(RED_LED_PIN, HAL_LED_MODE_OFF); + } + if (zclApp_State.State != Idle) { + HalLedSet(RED_LED_PIN, HAL_LED_MODE_BLINK); + } + if (zclApp_Config.ModeSound == true) { + HalLedSet(BLUE_LED_PIN, HAL_LED_MODE_OFF); + } + else { + HalLedSet(BLUE_LED_PIN, HAL_LED_MODE_ON); + } + osal_start_timerEx(zclApp_TaskID, APP_WORK_LED_EVT, 1000); +} + +static void zclApp_BtnClicks(byte count) { + zclApp_State.clicks = 0; + switch (count) { + case 1: + LREPMaster("Button click\r\n"); + if (zclApp_State.State == Idle) { + if (zclApp_Config.ModeOpen < Drop) { + zclApp_Config.ModeOpen++; + } + else { + zclApp_Config.ModeOpen = Never; + } + zclApp_OneReport(); } else { - if (zclApp_Config.ModeOpen < Drop) { - zclApp_Config.ModeOpen++; - } - else { - zclApp_Config.ModeOpen = Never; - } + zclApp_Config.ModeOpen = Once; } break; - case 1: - zclApp_OneReport(); - break; case 2: - if (hold) { - HalLedBlink(LED_PIN, zclApp_Config.ModeSound+1, 50, 750); - } - else { - HalLedBlink(LED_PIN, zclApp_Config.ModeOpen+1, 50, 250); + LREPMaster("Button double\r\n"); + if (zclApp_State.State == Idle) { + zclApp_Config.ModeSound = !zclApp_Config.ModeSound; + HANDSET_O_PIN = !zclApp_Config.ModeSound; + CATCH_O_PIN = !zclApp_Config.ModeSound; + zclApp_OneReport(); } break; - default: - /* - if (hold) { - osal_stop_timerEx(zclApp_TaskID, APP_BTN_HOLD_EVT); - osal_clear_event(zclApp_TaskID, APP_BTN_HOLD_EVT); + case 255: + LREPMaster("Button hold\r\n"); + if (zclApp_State.State == Idle) { + zclApp_Config.ModeSound = true; + HANDSET_O_PIN = !zclApp_Config.ModeSound; + CATCH_O_PIN = !zclApp_Config.ModeSound; + zclApp_Config.ModeOpen = Never; + zclApp_OneReport(); } else { - osal_stop_timerEx(zclApp_TaskID, APP_BTN_CLICK_EVT); - osal_clear_event(zclApp_TaskID, APP_BTN_CLICK_EVT); + zclApp_State.State = Droped; + zclApp_TalkStart(); + osal_start_timerEx(zclApp_TaskID, APP_RING_STOP_EVT, 250); } - */ - currentBtnClickPhase = 0; break; } - if (currentBtnClickPhase != 0) { - if (hold) { - osal_start_timerEx(zclApp_TaskID, APP_BTN_HOLD_EVT, 50); - } - else { - osal_start_timerEx(zclApp_TaskID, APP_BTN_CLICK_EVT, 50); - } - } } static void zclApp_Report(void) { @@ -418,7 +475,7 @@ static void zclApp_Report(void) { } static void zclApp_OneReport(void) { - HalLedSet(LED_PIN, HAL_LED_MODE_BLINK); + //HalLedSet(BLUE_LED_PIN, HAL_LED_MODE_BLINK); bdb_RepChangedAttrValue(zclApp_FirstEP.EndPoint, ZCL_INTERCOM, ATTRID_STATE); bdb_RepChangedAttrValue(zclApp_FirstEP.EndPoint, ZCL_INTERCOM, ATTRID_MODEOPEN); #if !defined( ZIC_BATTERY_MODE ) @@ -454,9 +511,12 @@ static void zclApp_ConfigInit(bool restart) { LREP("Start report with interval %d seconds\r\n", ReportInterval); osal_start_reload_timer(zclApp_TaskID, APP_REPORT_EVT, ((uint32)ReportInterval*(uint32)1000)); - HalLedSet(HANDSET_PIN, !zclApp_Config.ModeSound); - HalLedSet(CATCH_PIN, !zclApp_Config.ModeSound); - HalLedSet(ANSWER_PIN, HAL_LED_MODE_OFF); + //HalLedSet(HANDSET_PIN, !zclApp_Config.ModeSound); + HANDSET_O_PIN = !zclApp_Config.ModeSound; + //HalLedSet(CATCH_PIN, !zclApp_Config.ModeSound); + CATCH_O_PIN = !zclApp_Config.ModeSound; + //HalLedSet(ANSWER_PIN, HAL_LED_MODE_OFF); + ANSWER_O_PIN = 0; } static void zclApp_RestoreAttributesFromNV(void) { diff --git a/Source/zcl_app.h b/Source/zcl_app.h index 654e266..fdeb153 100644 --- a/Source/zcl_app.h +++ b/Source/zcl_app.h @@ -24,6 +24,8 @@ extern "C" { #define APP_BTN_HOLD_EVT 0x0010 #define APP_RING_STOP_EVT 0x0020 #define APP_TALK_START_EVT 0x0040 +#define APP_WORK_LED_EVT 0x0080 +#define APP_BTN_DOUBLE_EVT 0x0100 /********************************************************************* * MACROS @@ -56,10 +58,14 @@ extern "C" { #define ATTRID_TIMEBELL 0x0057 #define ATTRID_TIMEREPORT 0x0056 -#define LED_PIN HAL_LED_1 -#define CATCH_PIN HAL_LED_2 -#define ANSWER_PIN HAL_LED_3 -#define HANDSET_PIN HAL_LED_4 +#define BLUE_LED_PIN HAL_LED_1 +#define GREEN_LED_PIN HAL_LED_2 +#define RED_LED_PIN HAL_LED_3 +//#define HANDSET_PIN HAL_LED_4 + +#define CATCH_O_PIN P0_1 +#define ANSWER_O_PIN P0_2 +#define HANDSET_O_PIN P0_3 #define TIMER_RESTART TRUE #define TIMER_START FALSE @@ -116,6 +122,7 @@ typedef struct { WorkState_t State; uint8 RingRunStep; uint32 pressTime; + byte clicks; } device_state_t; diff --git a/hardware/Домофон zintercom.docx b/hardware/Домофон zintercom.docx new file mode 100644 index 0000000..0813ada Binary files /dev/null and b/hardware/Домофон zintercom.docx differ