From 1c766cbc279259659e4c088a1e290c35a79865c0 Mon Sep 17 00:00:00 2001 From: Olaf Rempel Date: Tue, 28 Nov 2017 20:52:00 +0100 Subject: [PATCH] implement register request --- funk_proto.h | 2 +- funkstuff.c | 111 +++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 86 insertions(+), 27 deletions(-) diff --git a/funk_proto.h b/funk_proto.h index cc25d55..99c250e 100644 --- a/funk_proto.h +++ b/funk_proto.h @@ -169,7 +169,7 @@ struct _register_response * - data_num is button number or channel ID * - data is for abs values, width is encoded in ctrl_type */ - struct _event_indication +struct _event_indication { uint8_t data_type; uint8_t data_num; diff --git a/funkstuff.c b/funkstuff.c index 1faf2cd..c21718f 100644 --- a/funkstuff.c +++ b/funkstuff.c @@ -38,17 +38,35 @@ /* *********************************************************************** */ static const struct _description_response control_desc[] PROGMEM = { - { DESCRIPTION_TYPE_CONTROL, 0xFF, 0xFF, EVENT_TYPE_PWM_COMMAND, EVENT_NUM_PWM_CH0, "Door Light Cmd" }, - { DESCRIPTION_TYPE_CONTROL, 0xFF, 0xFF, EVENT_TYPE_PWM_COMMAND, EVENT_NUM_PWM_CH1, "Wall Light Cmd" }, - { DESCRIPTION_TYPE_CONTROL, 0xFF, 0xFF, EVENT_TYPE_PWM_VALUE, EVENT_NUM_PWM_CH0, "Door Light Val" }, - { DESCRIPTION_TYPE_CONTROL, 0xFF, 0xFF, EVENT_TYPE_PWM_VALUE, EVENT_NUM_PWM_CH1, "Wall Light Val" }, + { DESCRIPTION_TYPE_CONTROL, 0xFF, 0xFF, EVENT_TYPE_PWM_COMMAND, EVENT_NUM_PWM_CH0, "door/pwm_cmd" }, + { DESCRIPTION_TYPE_CONTROL, 0xFF, 0xFF, EVENT_TYPE_PWM_COMMAND, EVENT_NUM_PWM_CH1, "wall/pwm_cmd" }, + { DESCRIPTION_TYPE_CONTROL, 0xFF, 0xFF, EVENT_TYPE_PWM_VALUE, EVENT_NUM_PWM_CH0, "door/pwm_set" }, + { DESCRIPTION_TYPE_CONTROL, 0xFF, 0xFF, EVENT_TYPE_PWM_VALUE, EVENT_NUM_PWM_CH1, "wall/pwm_set" }, }; static const struct _description_response event_desc[] PROGMEM = { - { DESCRIPTION_TYPE_EVENT, 0xFF, 0xFF, EVENT_TYPE_INPUT_BUTTON, EVENT_NUM_INPUT_BUTTON, "Wall Button" }, - { DESCRIPTION_TYPE_EVENT, 0xFF, 0xFF, EVENT_TYPE_INPUT_SWITCH, EVENT_NUM_INPUT_DOOR, "Door Switch" }, +// { DESCRIPTION_TYPE_EVENT, 0xFF, 0xFF, EVENT_TYPE_INPUT_BUTTON, EVENT_NUM_INPUT_BUTTON, "wall/input" }, +// { DESCRIPTION_TYPE_EVENT, 0xFF, 0xFF, EVENT_TYPE_INPUT_SWITCH, EVENT_NUM_INPUT_DOOR, "door/input" }, + { DESCRIPTION_TYPE_EVENT, 0xFF, 0xFF, EVENT_TYPE_PWM_STATUS, EVENT_NUM_PWM_CH0, "door/pwm" }, + { DESCRIPTION_TYPE_EVENT, 0xFF, 0xFF, EVENT_TYPE_PWM_STATUS, EVENT_NUM_PWM_CH1, "wall/pwm" }, }; +#define EVT_DATA_STATE_FREE 0x00 +#define EVT_DATA_STATE_REGISTERED 0x01 +#define EVT_DATA_STATE_UPDATE 0x02 +#define EVT_DATA_STATE_WAIT4CONF 0x04 + +struct _event_data +{ + uint8_t state; // free/registered/wait4conf/retrigger + uint8_t dest_address; + uint16_t data_value; // type/num via event_desc with same idx +}; + +static struct _event_data event_data[2]; +static uint8_t event_idx; +static uint8_t rtx_count; + /* *********************************************************************** */ #define LED_RX 0 @@ -140,9 +158,6 @@ int main(void) pwm_event_handler(event); break; - case EVENT_TYPE_PWM_STATUS: - break; - case EVENT_TYPE_INPUT_INCDEC: if (event->num == EVENT_NUM_INPUT_QUAD) { @@ -150,15 +165,13 @@ int main(void) { event_queue(EVENT_TYPE_PWM_COMMAND, EVENT_NUM_PWM_CH1, - EVENT_VALUE_PWM_DEC - ); + EVENT_VALUE_PWM_DEC); } else if (event->value == EVENT_VALUE_INPUT_QUAD_INC) { event_queue(EVENT_TYPE_PWM_COMMAND, EVENT_NUM_PWM_CH1, - EVENT_VALUE_PWM_INC - ); + EVENT_VALUE_PWM_INC); } } break; @@ -170,8 +183,7 @@ int main(void) { event_queue(EVENT_TYPE_PWM_COMMAND, EVENT_NUM_PWM_CH1, - EVENT_VALUE_PWM_TOGGLE - ); + EVENT_VALUE_PWM_TOGGLE); } } break; @@ -183,25 +195,21 @@ int main(void) { event_queue(EVENT_TYPE_PWM_COMMAND, EVENT_NUM_PWM_CH0, - EVENT_VALUE_PWM_KEEP - ); + EVENT_VALUE_PWM_KEEP); event_queue(EVENT_TYPE_TIMER_SET, EVENT_NUM_TIMER_DOOR_CLOSE_DELAY, - 2000 - ); + 2000); } else if (event->value == EVENT_VALUE_INPUT_DOOR_OPEN) { event_queue(EVENT_TYPE_PWM_COMMAND, EVENT_NUM_PWM_CH0, - EVENT_VALUE_PWM_FADE_MAX - ); + EVENT_VALUE_PWM_FADE_MAX); event_queue(EVENT_TYPE_TIMER_SET, EVENT_NUM_TIMER_DOOR_CLOSE_DELAY, - 0 - ); + 0); } } break; @@ -211,12 +219,17 @@ int main(void) break; case EVENT_TYPE_TIMER_ELAPSED: - if (event->num == EVENT_NUM_TIMER_DOOR_CLOSE_DELAY) + if ((event->num == EVENT_NUM_TIMER_DEBOUNCE1) || + (event->num == EVENT_NUM_TIMER_DEBOUNCE2) + ) + { + input_event_handler(event); + } + else if (event->num == EVENT_NUM_TIMER_DOOR_CLOSE_DELAY) { event_queue(EVENT_TYPE_PWM_COMMAND, EVENT_NUM_PWM_CH0, - EVENT_VALUE_PWM_FADE_MIN - ); + EVENT_VALUE_PWM_FADE_MIN); } break; @@ -224,6 +237,22 @@ int main(void) break; } + uint8_t i; + for (i = 0; i < ARRAY_SIZE(event_desc); i++) + { + if ((pgm_read_byte(&event_desc[i].data_type) == event->type) && + (pgm_read_byte(&event_desc[i].data_num) == event->num) + ) + { + event_data[i].data_value = event->value; + + if (event_data[i].state & EVT_DATA_STATE_REGISTERED) + { + event_data[i].state |= EVT_DATA_STATE_UPDATE; + } + } + } + event_clear(); } @@ -335,6 +364,35 @@ int main(void) } break; + case MSG_CMD_REGISTER_REQUEST: + rsp_msg->cause = CAUSE_INVALID_PARAMETER; + + for (i = 0; i < ARRAY_SIZE(control_desc); i++) + { + if ((pgm_read_byte(&event_desc[i].data_type) == req_msg->p.reg_req.data_type) && + (pgm_read_byte(&event_desc[i].data_num) == req_msg->p.reg_req.data_num) + ) + { + if (req_msg->p.reg_req.enable) + { + event_data[i].state |= EVT_DATA_STATE_REGISTERED; + event_data[i].dest_address = req_pkt->source_address; + } + else + { + event_data[i].state |= ~(EVT_DATA_STATE_REGISTERED | EVT_DATA_STATE_UPDATE); + } + + rsp_msg->cause = CAUSE_SUCCESS; + rsp_msg->p.reg_rsp.data_type = req_msg->p.reg_req.data_type; + rsp_msg->p.reg_rsp.data_num = req_msg->p.reg_req.data_num; + rsp_msg->p.reg_rsp.data_value = event_data[i].data_value; + rsp_pkt->data_length += sizeof(struct _register_response); + break; + } + } + break; + default: rsp_msg->cause = CAUSE_NOT_SUPPORTED; break; @@ -350,5 +408,6 @@ int main(void) } } } + return 0; } /* main */