int streamdatad_send_data_packets_req_handler(ke_msg_id_t const msgid, struct streamdatad_send_data_packets_req const *param, ke_task_id_t const dest_id, ke_task_id_t const src_id) { uint16_t next_packet; uint16_t nr_packets; uint16_t* packet_buffer_enabled; uint16_t len = 0; if (!streamdatad_env.stream_enabled) return KE_MSG_CONSUMED; next_packet = 0; nr_packets = param->nr_packets; nb_buf_av = l2cm_get_nb_buffer_available(); for (int li = 0; (li < STREAMDATAD_MAX) && (nr_packets > 0) && (nb_buf_av > 0); li++) { packet_buffer_enabled = NULL; attmdb_att_get_value(STREAMDATAD_DIR_EN_HANDLE(streamdatad_env.next_attribute_idx), &(len), (uint8_t**)&(packet_buffer_enabled)); if ((packet_buffer_enabled && (*packet_buffer_enabled))) { // Update the value in the attribute database attmdb_att_set_value(STREAMDATAD_DIR_VAL_HANDLE(streamdatad_env.next_attribute_idx), sizeof(uint8_t) * STREAMDATAD_PACKET_SIZE, (uint8_t*) &(param->packets[next_packet][0])); // Send notification prf_server_send_event((prf_env_struct *)&(streamdatad_env.con_info), false, STREAMDATAD_DIR_VAL_HANDLE(streamdatad_env.next_attribute_idx)); } else { len = 2; } //set_pxact_gpio(); next_packet++; nr_packets--; nb_buf_av--; streamdatad_env.next_attribute_idx++; if (streamdatad_env.next_attribute_idx >= STREAMDATAD_MAX) { streamdatad_env.next_attribute_idx = 0; break; // the for loop } // else notification at this index was not enabled; } //set_pxact_gpio(); return (KE_MSG_CONSUMED); }
void streamdatad_streamonoff(void) { uint16_t len = 0; uint8_t* streamdatad_en = NULL; attmdb_att_get_value(STREAMDATAD_HANDLE(STREAMDATAD_IDX_ENABLE_VAL), &(len), &(streamdatad_en)); // Indicate to the application the state of the profile int on = ((len == 2) && (streamdatad_en && (*streamdatad_en))) ? 1 : 0; if (on) { // Allocate the start indication message struct streamdatad_start_ind *ind = KE_MSG_ALLOC(STREAMDATAD_START_IND, streamdatad_env.appid, TASK_STREAMDATAD, streamdatad_start_ind); streamdatad_env.stream_enabled = (*streamdatad_en); ind->status = PRF_ERR_OK; // Send the message ke_msg_send(ind); } else { streamdatad_env.next_attribute_idx = 0; streamdatad_env.stream_enabled = 0; // Send the stop indication ke_msg_send_basic(STREAMDATAD_STOP_IND, streamdatad_env.appid, TASK_STREAMDATAD); } uint16_t enable_val = streamdatad_en?(*streamdatad_en):0; // Enable or disable all data notifications streamdatad_env.nr_enabled_attributes = 0; int lastattr = enable_val?((STREAMDATAD_MAX>MAX_TRANSMIT_BUFFER_PACKETS)?MAX_TRANSMIT_BUFFER_PACKETS:STREAMDATAD_MAX):STREAMDATAD_MAX; attmdb_att_set_value(STREAMDATAD_IDX_ENABLE_EN, sizeof(uint16_t),(uint8_t*) &(enable_val)); for (int i = 0; i < lastattr; i++) { attmdb_att_set_value(STREAMDATAD_DIR_EN_HANDLE(i), sizeof(uint16_t),(uint8_t*) &(enable_val)); streamdatad_env.nr_enabled_attributes++; } if (!enable_val) streamdatad_env.nr_enabled_attributes = 0; }
int streamdatad_send_data_packet(uint8_t *data) { uint16_t* packet_buffer_enabled; int retval = 0; uint16_t len = 0; packet_buffer_enabled = NULL; attmdb_att_get_value(STREAMDATAD_DIR_EN_HANDLE(streamdatad_env.next_attribute_idx), &(len), (uint8_t**)&(packet_buffer_enabled)); if ((packet_buffer_enabled && (*packet_buffer_enabled))) { // Update the value in the attribute database attmdb_att_set_value(STREAMDATAD_DIR_VAL_HANDLE(streamdatad_env.next_attribute_idx), sizeof(uint8_t) * STREAMDATAD_PACKET_SIZE, data); // Send notification prf_server_send_event((prf_env_struct *)&(streamdatad_env.con_info), false, STREAMDATAD_DIR_VAL_HANDLE(streamdatad_env.next_attribute_idx)); retval = 1; } streamdatad_env.next_attribute_idx++; if (streamdatad_env.next_attribute_idx >= STREAMDATAD_MAX) streamdatad_env.next_attribute_idx = 0; return retval; }