1
0
mirror of https://github.com/Utyff/Zintercom.git synced 2026-01-12 09:17:41 +03:00

Add RGB led support

Rework button actions (single, double, hold)
Detail description can be found in hardware/Домофон zintercom.docx
This commit is contained in:
lost
2022-02-16 22:09:22 +02:00
parent e58b8a0f97
commit 23e04d3571
5 changed files with 152 additions and 84 deletions

View File

@@ -61,25 +61,25 @@
#define HAL_LED_BLINK_DELAY() st( { volatile uint32 i; for (i=0; i<0x5800; i++) { }; } ) #define HAL_LED_BLINK_DELAY() st( { volatile uint32 i; for (i=0; i<0x5800; i++) { }; } )
#if defined(HAL_BOARD_TARGET) #if defined(HAL_BOARD_TARGET)
//led //blue
#define LED1_BV BV(4) #define LED1_BV BV(7)
#define LED1_SBIT P0_4 #define LED1_SBIT P1_7
#define LED1_DDR P0DIR #define LED1_DDR P1DIR
#define LED1_POLARITY ACTIVE_HIGH #define LED1_POLARITY ACTIVE_HIGH
//catch //green
#define LED2_BV BV(1) #define LED2_BV BV(6)
#define LED2_SBIT P0_1 #define LED2_SBIT P1_6
#define LED2_DDR P0DIR #define LED2_DDR P1DIR
#define LED2_POLARITY ACTIVE_HIGH #define LED2_POLARITY ACTIVE_HIGH
//answer //red
#define LED3_BV BV(2) #define LED3_BV BV(5)
#define LED3_SBIT P0_2 #define LED3_SBIT P1_5
#define LED3_DDR P0DIR #define LED3_DDR P1DIR
#define LED3_POLARITY ACTIVE_HIGH #define LED3_POLARITY ACTIVE_HIGH
//handset //NC
#define LED4_BV BV(3) #define LED4_BV BV(3)
#define LED4_SBIT P0_3 #define LED4_SBIT P0_3
#define LED4_DDR P0DIR #define LED4_DDR P1DIR
#define LED4_POLARITY ACTIVE_HIGH #define LED4_POLARITY ACTIVE_HIGH

View File

@@ -56,7 +56,7 @@
#define INT_HEAP_LEN 2060 #define INT_HEAP_LEN 2060
#endif #endif
#define FACTORY_RESET_HOLD_TIME_LONG 5000 #define FACTORY_RESET_HOLD_TIME_LONG 10000
#if defined( DO_DEBUG_UART ) #if defined( DO_DEBUG_UART )
#define HAL_UART_ISR 2 #define HAL_UART_ISR 2

View File

@@ -68,7 +68,8 @@ byte zclApp_TaskID;
* LOCAL VARIABLES * LOCAL VARIABLES
*/ */
static uint8 currentBtnClickPhase = 0; //static uint8 currentBtnClickPhase = 0;
//static byte BtnClickCount = 0;
/********************************************************************* /*********************************************************************
* LOCAL FUNCTIONS * LOCAL FUNCTIONS
@@ -78,16 +79,18 @@ static void zclApp_BasicResetCB(void);
static void zclApp_RestoreAttributesFromNV(void); static void zclApp_RestoreAttributesFromNV(void);
static void zclApp_SaveAttributesToNV(void); static void zclApp_SaveAttributesToNV(void);
static void zclApp_HandleKeys(byte portAndAction, byte keyCode); 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 ZStatus_t zclApp_ReadWriteAuthCB(afAddrType_t *srcAddr, zclAttrRec_t *pAttr, uint8 oper);
static void zclApp_Report(void); static void zclApp_Report(void);
static void zclApp_OneReport(void); static void zclApp_OneReport(void);
static void zclApp_ConfigInit(bool restart); 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_RingRun(void);
static void zclApp_TalkStart(void); static void zclApp_TalkStart(void);
static void zclApp_RingEnd(void); static void zclApp_RingEnd(void);
static void zclApp_WorkWithLEDs(void);
/********************************************************************* /*********************************************************************
* ZCL General Profile Callback table * ZCL General Profile Callback table
@@ -123,11 +126,23 @@ void zclApp_Init(byte task_id) {
zclApp_ConfigInit(TIMER_START); zclApp_ConfigInit(TIMER_START);
zclApp_ControlPinsInit();
osal_start_timerEx(zclApp_TaskID, APP_WORK_LED_EVT, 100);
IO_IMODE_PORT_PIN(0,0,IO_TRI); IO_IMODE_PORT_PIN(0,0,IO_TRI);
#if defined( ZIC_BATTERY_MODE ) #if defined( ZIC_BATTERY_MODE )
ZMacSetTransmitPower(TX_PWR_PLUS_4); // set 4dBm ZMacSetTransmitPower(TX_PWR_PLUS_4); // set 4dBm
#endif #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,19 +186,20 @@ static void zclApp_HandleKeys(byte portAndAction, byte keyCode) {
zclFactoryResetter_HandleKeys(portAndAction, keyCode); zclFactoryResetter_HandleKeys(portAndAction, keyCode);
if (portAndAction & HAL_KEY_PRESS) { if (portAndAction & HAL_KEY_PRESS) {
LREPMaster("Key pressed\r\n"); LREPMaster("Key pressed\r\n");
zclApp_State.pressTime = osal_getClock(); zclApp_State.clicks++;
LREP("pressTime = %d\r\n", zclApp_State.pressTime);
osal_start_timerEx(zclApp_TaskID, APP_BTN_HOLD_EVT, 2000);
osal_stop_timerEx(zclApp_TaskID, APP_BTN_CLICK_EVT);
} }
if (portAndAction & HAL_KEY_RELEASE) { if (portAndAction & HAL_KEY_RELEASE) {
LREPMaster("Key released\r\n"); LREPMaster("Key released\r\n");
uint32 holdTime = osal_getClock() - zclApp_State.pressTime;
LREP("holdTime = %d \r\n", holdTime); osal_stop_timerEx(zclApp_TaskID, APP_BTN_HOLD_EVT);
zclApp_State.pressTime = 0; if (zclApp_State.clicks == 1) {
if (holdTime >= 1) { //seconds osal_start_timerEx(zclApp_TaskID, APP_BTN_CLICK_EVT, 250);
osal_start_timerEx(zclApp_TaskID, APP_BTN_HOLD_EVT, 50);
} }
else { if (zclApp_State.clicks == 2) {
osal_start_timerEx(zclApp_TaskID, APP_BTN_CLICK_EVT, 50); osal_start_timerEx(zclApp_TaskID, APP_BTN_DOUBLE_EVT, 250);
} }
} }
} }
@@ -234,7 +250,7 @@ uint16 zclApp_event_loop(uint8 task_id, uint16 events) {
if (events & APP_BTN_CLICK_EVT) { if (events & APP_BTN_CLICK_EVT) {
LREPMaster("APP_BTN_CLICK_EVT\r\n"); LREPMaster("APP_BTN_CLICK_EVT\r\n");
zclApp_BtnClick(false); zclApp_BtnClicks(1);
return (events ^ APP_BTN_CLICK_EVT); 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); 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) { if (events & APP_BTN_HOLD_EVT) {
LREPMaster("APP_BTN_HOLD_EVT\r\n"); LREPMaster("APP_BTN_HOLD_EVT\r\n");
#if !defined( ZIC_BATTERY_MODE ) //#if !defined( ZIC_BATTERY_MODE )
zclApp_BtnClick(true); zclApp_BtnClicks(255);
#endif //#endif
return (events ^ APP_BTN_HOLD_EVT); 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; return 0;
} }
@@ -297,7 +326,8 @@ static void zclApp_RingRun(void) {
if ((zclApp_Config.ModeOpen == Once) || (zclApp_Config.ModeOpen == Always)){ if ((zclApp_Config.ModeOpen == Once) || (zclApp_Config.ModeOpen == Always)){
if (zclApp_State.RingRunStep > ((zclApp_Config.TimeRing + zclApp_Config.TimeTalk) * 2)) { if (zclApp_State.RingRunStep > ((zclApp_Config.TimeRing + zclApp_Config.TimeTalk) * 2)) {
zclApp_State.State = Open; zclApp_State.State = Open;
HalLedSet(ANSWER_PIN, HAL_LED_MODE_OFF); //HalLedSet(ANSWER_PIN, HAL_LED_MODE_OFF);
ANSWER_O_PIN = 0;
zclApp_OneReport(); zclApp_OneReport();
} }
} }
@@ -325,20 +355,26 @@ static void zclApp_TalkStart(void) {
//osal_stop_timerEx(zclApp_TaskID, APP_RING_STOP_EVT); //osal_stop_timerEx(zclApp_TaskID, APP_RING_STOP_EVT);
//osal_clear_event(zclApp_TaskID, APP_RING_STOP_EVT); //osal_clear_event(zclApp_TaskID, APP_RING_STOP_EVT);
zclApp_OneReport(); 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) { if (zclApp_Config.ModeSound == true) {
HalLedSet(HANDSET_PIN, HAL_LED_MODE_ON); //HalLedSet(HANDSET_PIN, HAL_LED_MODE_ON);
HANDSET_O_PIN = 1;
} }
else { else {
HalLedSet(CATCH_PIN, HAL_LED_MODE_OFF); //HalLedSet(CATCH_PIN, HAL_LED_MODE_OFF);
CATCH_O_PIN = 0;
} }
} }
static void zclApp_RingEnd(void) { static void zclApp_RingEnd(void) {
LREPMaster("Ring end\r\n"); LREPMaster("Ring end\r\n");
HalLedSet(CATCH_PIN, !zclApp_Config.ModeSound); //HalLedSet(CATCH_PIN, !zclApp_Config.ModeSound);
HalLedSet(HANDSET_PIN, !zclApp_Config.ModeSound); CATCH_O_PIN = !zclApp_Config.ModeSound;
HalLedSet(ANSWER_PIN, HAL_LED_MODE_OFF); //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_stop_timerEx(zclApp_TaskID, APP_RING_RUN_EVT);
//osal_clear_event(zclApp_TaskID, APP_RING_RUN_EVT); //osal_clear_event(zclApp_TaskID, APP_RING_RUN_EVT);
//osal_stop_timerEx(zclApp_TaskID, APP_RING_STOP_EVT); //osal_stop_timerEx(zclApp_TaskID, APP_RING_STOP_EVT);
@@ -360,65 +396,87 @@ static void zclApp_RingEnd(void) {
#endif #endif
} }
static void zclApp_BtnClick(bool hold) {
LREP("currentBtnClickPhase %d\r\n", currentBtnClickPhase); static void zclApp_WorkWithLEDs(void) {
switch (currentBtnClickPhase++) { if (zclApp_Config.ModeOpen == Always) {
case 0: HalLedSet(GREEN_LED_PIN, HAL_LED_MODE_ON);
if (hold) { }
zclApp_Config.ModeSound = !zclApp_Config.ModeSound; if (zclApp_Config.ModeOpen != Always) {
HalLedSet(HANDSET_PIN, !zclApp_Config.ModeSound); HalLedSet(GREEN_LED_PIN, HAL_LED_MODE_OFF);
HalLedSet(CATCH_PIN, !zclApp_Config.ModeSound); }
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 { 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) { if (zclApp_Config.ModeOpen < Drop) {
zclApp_Config.ModeOpen++; zclApp_Config.ModeOpen++;
} }
else { else {
zclApp_Config.ModeOpen = Never; zclApp_Config.ModeOpen = Never;
} }
}
break;
case 1:
zclApp_OneReport(); zclApp_OneReport();
}
else {
zclApp_Config.ModeOpen = Once;
}
break; break;
case 2: case 2:
if (hold) { LREPMaster("Button double\r\n");
HalLedBlink(LED_PIN, zclApp_Config.ModeSound+1, 50, 750); if (zclApp_State.State == Idle) {
} zclApp_Config.ModeSound = !zclApp_Config.ModeSound;
else { HANDSET_O_PIN = !zclApp_Config.ModeSound;
HalLedBlink(LED_PIN, zclApp_Config.ModeOpen+1, 50, 250); CATCH_O_PIN = !zclApp_Config.ModeSound;
zclApp_OneReport();
} }
break; break;
default: case 255:
/* LREPMaster("Button hold\r\n");
if (hold) { if (zclApp_State.State == Idle) {
osal_stop_timerEx(zclApp_TaskID, APP_BTN_HOLD_EVT); zclApp_Config.ModeSound = true;
osal_clear_event(zclApp_TaskID, APP_BTN_HOLD_EVT); HANDSET_O_PIN = !zclApp_Config.ModeSound;
CATCH_O_PIN = !zclApp_Config.ModeSound;
zclApp_Config.ModeOpen = Never;
zclApp_OneReport();
} }
else { else {
osal_stop_timerEx(zclApp_TaskID, APP_BTN_CLICK_EVT); zclApp_State.State = Droped;
osal_clear_event(zclApp_TaskID, APP_BTN_CLICK_EVT); zclApp_TalkStart();
osal_start_timerEx(zclApp_TaskID, APP_RING_STOP_EVT, 250);
} }
*/
currentBtnClickPhase = 0;
break; 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) { static void zclApp_Report(void) {
zclApp_OneReport(); zclApp_OneReport();
} }
static void zclApp_OneReport(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_STATE);
bdb_RepChangedAttrValue(zclApp_FirstEP.EndPoint, ZCL_INTERCOM, ATTRID_MODEOPEN); bdb_RepChangedAttrValue(zclApp_FirstEP.EndPoint, ZCL_INTERCOM, ATTRID_MODEOPEN);
#if !defined( ZIC_BATTERY_MODE ) #if !defined( ZIC_BATTERY_MODE )
@@ -454,9 +512,12 @@ static void zclApp_ConfigInit(bool restart) {
LREP("Start report with interval %d seconds\r\n", ReportInterval); LREP("Start report with interval %d seconds\r\n", ReportInterval);
osal_start_reload_timer(zclApp_TaskID, APP_REPORT_EVT, ((uint32)ReportInterval*(uint32)1000)); osal_start_reload_timer(zclApp_TaskID, APP_REPORT_EVT, ((uint32)ReportInterval*(uint32)1000));
HalLedSet(HANDSET_PIN, !zclApp_Config.ModeSound); //HalLedSet(HANDSET_PIN, !zclApp_Config.ModeSound);
HalLedSet(CATCH_PIN, !zclApp_Config.ModeSound); HANDSET_O_PIN = !zclApp_Config.ModeSound;
HalLedSet(ANSWER_PIN, HAL_LED_MODE_OFF); //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) { static void zclApp_RestoreAttributesFromNV(void) {

View File

@@ -24,6 +24,8 @@ extern "C" {
#define APP_BTN_HOLD_EVT 0x0010 #define APP_BTN_HOLD_EVT 0x0010
#define APP_RING_STOP_EVT 0x0020 #define APP_RING_STOP_EVT 0x0020
#define APP_TALK_START_EVT 0x0040 #define APP_TALK_START_EVT 0x0040
#define APP_WORK_LED_EVT 0x0080
#define APP_BTN_DOUBLE_EVT 0x0100
/********************************************************************* /*********************************************************************
* MACROS * MACROS
@@ -56,10 +58,14 @@ extern "C" {
#define ATTRID_TIMEBELL 0x0057 #define ATTRID_TIMEBELL 0x0057
#define ATTRID_TIMEREPORT 0x0056 #define ATTRID_TIMEREPORT 0x0056
#define LED_PIN HAL_LED_1 #define BLUE_LED_PIN HAL_LED_1
#define CATCH_PIN HAL_LED_2 #define GREEN_LED_PIN HAL_LED_2
#define ANSWER_PIN HAL_LED_3 #define RED_LED_PIN HAL_LED_3
#define HANDSET_PIN HAL_LED_4 //#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_RESTART TRUE
#define TIMER_START FALSE #define TIMER_START FALSE
@@ -116,6 +122,7 @@ typedef struct {
WorkState_t State; WorkState_t State;
uint8 RingRunStep; uint8 RingRunStep;
uint32 pressTime; uint32 pressTime;
byte clicks;
} device_state_t; } device_state_t;

Binary file not shown.