mesh: implement attention timer in mesh

This commit is contained in:
Matthias Ringwald 2019-07-16 13:21:28 +02:00
parent cc639358ce
commit 0728b042e0
4 changed files with 54 additions and 7 deletions

View File

@ -104,12 +104,12 @@ static void mesh_provisioning_message_handler (uint8_t packet_type, uint16_t cha
case MESH_SUBEVENT_PB_TRANSPORT_LINK_OPEN: case MESH_SUBEVENT_PB_TRANSPORT_LINK_OPEN:
printf("Provisioner link opened"); printf("Provisioner link opened");
break; break;
case MESH_SUBEVENT_ATTENTION_TIMER:
printf("Attention Timer: %u\n", mesh_subevent_attention_timer_get_attention_time(packet));
break;
case MESH_SUBEVENT_PB_TRANSPORT_LINK_CLOSED: case MESH_SUBEVENT_PB_TRANSPORT_LINK_CLOSED:
printf("Provisioner link close"); printf("Provisioner link close");
break; break;
case MESH_SUBEVENT_PB_PROV_ATTENTION_TIMER:
printf("Attention Timer: %u\n", mesh_subevent_pb_prov_attention_timer_get_attention_time(packet));
break;
case MESH_SUBEVENT_PB_PROV_COMPLETE: case MESH_SUBEVENT_PB_PROV_COMPLETE:
printf("Provisioning complete\n"); printf("Provisioning complete\n");
break; break;

View File

@ -147,6 +147,9 @@ static void * btstack_tlv_singleton_context;
static uint32_t sequence_number_last_stored; static uint32_t sequence_number_last_stored;
static uint32_t sequence_number_storage_trigger; static uint32_t sequence_number_storage_trigger;
// Attention Timer
static uint8_t attention_timer_timeout_s;
static btstack_timer_source_t attention_timer_timer;
static void mesh_access_setup_from_provisioning_data(const mesh_provisioning_data_t * provisioning_data){ static void mesh_access_setup_from_provisioning_data(const mesh_provisioning_data_t * provisioning_data){
@ -181,12 +184,52 @@ static void mesh_access_setup_from_provisioning_data(const mesh_provisioning_dat
#endif #endif
} }
// Attention Timer state
static void mesh_emit_attention_timer_event(uint8_t timer_s){
if (!provisioning_device_packet_handler) return;
uint8_t event[4] = { HCI_EVENT_MESH_META, 4, MESH_SUBEVENT_ATTENTION_TIMER};
event[3] = timer_s;
provisioning_device_packet_handler(HCI_EVENT_PACKET, 0, event, sizeof(event));
}
static void mesh_attention_timer_handler(btstack_timer_source_t * ts){
UNUSED(ts);
attention_timer_timeout_s--;
mesh_emit_attention_timer_event(attention_timer_timeout_s);
if (attention_timer_timeout_s == 0) return;
btstack_run_loop_set_timer(&attention_timer_timer, 1000);
btstack_run_loop_add_timer(&attention_timer_timer);
}
void mesh_attention_timer_set(uint8_t timer_s){
// stop old timer if running
if (attention_timer_timeout_s){
btstack_run_loop_remove_timer(&attention_timer_timer);
}
attention_timer_timeout_s = timer_s;
mesh_emit_attention_timer_event(attention_timer_timeout_s);
if (attention_timer_timeout_s){
btstack_run_loop_set_timer_handler(&attention_timer_timer, &mesh_attention_timer_handler);
btstack_run_loop_set_timer(&attention_timer_timer, 1000);
btstack_run_loop_add_timer(&attention_timer_timer);
}
}
uint8_t mesh_attention_timer_get(void){
return attention_timer_timeout_s;
}
static void mesh_provisioning_message_handler (uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){ static void mesh_provisioning_message_handler (uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
mesh_provisioning_data_t provisioning_data; mesh_provisioning_data_t provisioning_data;
switch(packet[0]){ switch(packet[0]){
case HCI_EVENT_MESH_META: case HCI_EVENT_MESH_META:
switch(packet[2]){ switch(packet[2]){
case MESH_SUBEVENT_PB_PROV_ATTENTION_TIMER:
mesh_attention_timer_set(mesh_subevent_pb_prov_attention_timer_get_attention_time(packet));
break;
case MESH_SUBEVENT_PB_PROV_COMPLETE: case MESH_SUBEVENT_PB_PROV_COMPLETE:
// get provisioning data // get provisioning data
provisioning_device_data_get(&provisioning_data); provisioning_device_data_get(&provisioning_data);
@ -948,6 +991,7 @@ void mesh_init(void){
#endif #endif
provisioning_device_init(); provisioning_device_init();
provisioning_device_register_packet_handler(&mesh_provisioning_message_handler);
// Node Configuration // Node Configuration
mesh_node_init(); mesh_node_init();
@ -975,5 +1019,4 @@ void mesh_init(void){
*/ */
void mesh_register_provisioning_device_packet_handler(btstack_packet_handler_t packet_handler){ void mesh_register_provisioning_device_packet_handler(btstack_packet_handler_t packet_handler){
provisioning_device_packet_handler = packet_handler; provisioning_device_packet_handler = packet_handler;
provisioning_device_register_packet_handler(&mesh_provisioning_message_handler);
} }

View File

@ -107,6 +107,10 @@ int mesh_model_contains_appkey(mesh_model_t * mesh_model, uint16_t appkey_index)
// Mesh Node Reset // Mesh Node Reset
void mesh_node_reset(void); void mesh_node_reset(void);
// Attention Timer
void mesh_attention_timer_set(uint8_t timer_s);
uint8_t mesh_attention_timer_get(void);
// temp // temp
void mesh_access_key_refresh_revoke_keys(mesh_subnet_t * subnet); void mesh_access_key_refresh_revoke_keys(mesh_subnet_t * subnet);
void mesh_access_netkey_finalize(mesh_network_key_t * network_key); void mesh_access_netkey_finalize(mesh_network_key_t * network_key);

View File

@ -148,8 +148,8 @@ static void mesh_provisioning_message_handler (uint8_t packet_type, uint16_t cha
case MESH_SUBEVENT_PB_TRANSPORT_LINK_CLOSED: case MESH_SUBEVENT_PB_TRANSPORT_LINK_CLOSED:
printf("Provisioner link close"); printf("Provisioner link close");
break; break;
case MESH_SUBEVENT_PB_PROV_ATTENTION_TIMER: case MESH_SUBEVENT_ATTENTION_TIMER:
printf("Attention Timer: %u\n", mesh_subevent_pb_prov_attention_timer_get_attention_time(packet)); printf("Attention Timer: %u\n", mesh_subevent_attention_timer_get_attention_time(packet));
break; break;
case MESH_SUBEVENT_PB_PROV_INPUT_OOB_REQUEST: case MESH_SUBEVENT_PB_PROV_INPUT_OOB_REQUEST:
printf("Enter passphrase: "); printf("Enter passphrase: ");