diff --git a/main/BLE_UUID.h b/main/BLE_UUID.h index a139f2b..1ca54b4 100644 --- a/main/BLE_UUID.h +++ b/main/BLE_UUID.h @@ -6,6 +6,8 @@ #define ELECTRIC_CURRENT_CHAR 0x2AEE #define VOLTAGE_CHAR 0x2B18 #define SAMPLING_RATE_CHAR 0x2C12 +#define ZERO_CALI_CHAR 0x2C13 +#define ZERO_CALI_NSAMP 0x2C14 #define CHAR_PRES_FORMAT 0x2904 @@ -17,6 +19,7 @@ #define VOLTS_UNIT_UUID 0x2728 #define HERTZ_UNIT_UUID 0x2722 #define SECONDS_UNIT_UUID 0x2703 +#define UNITLESS_UNIT_UUID 0x2700 #define NSP_DESC_MAIN 0x0106 #define NSP_DESC_INSIDE 0x010B diff --git a/main/ble.c b/main/ble.c index 827bf95..75cf8b1 100644 --- a/main/ble.c +++ b/main/ble.c @@ -105,7 +105,7 @@ static struct ble_gatt_svc_def gatt_svr_svcs[] = { .access_cb = gatt_char_access_sampling_rate, .flags = BLE_GATT_CHR_F_READ | BLE_GATT_CHR_F_WRITE, .min_key_size = 0, - .val_handle = settings_handle, + .val_handle = &settings_handle[RFRSH_RATE_ID], .arg = &settings_ctxt[RFRSH_RATE_ID], .descriptors = (struct ble_gatt_dsc_def[]){ [0] = { @@ -116,6 +116,30 @@ static struct ble_gatt_svc_def gatt_svr_svcs[] = { { 0 }, } }, + [ZEROS_CALI_ID] = { + .uuid = BLE_UUID16_DECLARE(ZERO_CALI_CHAR), + .access_cb = gatt_char_access_zeros_cali, + .flags = BLE_GATT_CHR_F_WRITE, + .min_key_size = 0, + .val_handle = &settings_handle[ZEROS_CALI_ID], + .arg = &settings_ctxt[ZEROS_CALI_ID], + }, + [ZEROS_CALI_NSAMP_ID] = { + .uuid = BLE_UUID16_DECLARE(ZERO_CALI_NSAMP), + .access_cb = gatt_char_access_zeros_cali, + .flags = BLE_GATT_CHR_F_READ | BLE_GATT_CHR_F_WRITE, + .min_key_size = 0, + .val_handle = &settings_handle[ZEROS_CALI_NSAMP_ID], + .arg = &settings_ctxt[ZEROS_CALI_NSAMP_ID], + .descriptors = (struct ble_gatt_dsc_def[]){ + [0] = { + .uuid = BLE_UUID16_DECLARE(CHAR_PRES_FORMAT), + .att_flags = BLE_ATT_F_READ, + .access_cb = gatt_char_access_zeros_cali, + }, + { 0 }, + } + }, { 0 }, } }, @@ -172,13 +196,15 @@ static int ble_gap_event(struct ble_gap_event *event, void* arg){ } // Generate a characteristic for each inputs -static void generate_svc_defs(configuration* conf, measurements* meas){ +static void generate_svc_defs(configuration* conf, measurements* meas, measurements_ctxt* meas_ctxt){ for(int i = 0; i < INPUTS_NUM; i++){ ev_ctxt[i].conf = conf; ev_ctxt[i].meas = meas; + ev_ctxt[i].meas_ctxt = meas_ctxt; cs_ctxt[i].conf = conf; cs_ctxt[i].meas = meas; + cs_ctxt[i].meas_ctxt = meas_ctxt; memcpy(&cs_char_array[i], ¤t_measure_char_template, sizeof(current_measure_char_template)); memcpy(&rvs_char_array[i], &voltage_measure_char_template, sizeof(voltage_measure_char_template)); @@ -199,13 +225,15 @@ static void generate_svc_defs(configuration* conf, measurements* meas){ for(int i = 0; i < SETTINGS_CHRS_NUM; i++){ + settings_ctxt[i].handle = i; settings_ctxt[i].conf = conf; settings_ctxt[i].meas = meas; + settings_ctxt[i].meas_ctxt = meas_ctxt; } } -void initBLE(configuration* conf, measurements* meas){ - generate_svc_defs(conf, meas); +void initBLE(configuration* conf, measurements* meas, measurements_ctxt* meas_ctxt){ + generate_svc_defs(conf, meas, meas_ctxt); nimble_port_init(); diff --git a/main/ble.h b/main/ble.h index e545e5e..9439f51 100644 --- a/main/ble.h +++ b/main/ble.h @@ -11,7 +11,8 @@ struct ble_context { uint16_t handle; configuration *conf; measurements *meas; + measurements_ctxt* meas_ctxt; }; -void initBLE(configuration* conf, measurements* meas); +void initBLE(configuration* conf, measurements* meas, measurements_ctxt* meas_ctxt); void notify_update(measurements* meas); \ No newline at end of file diff --git a/main/configuration.h b/main/configuration.h index 9b1b2b1..e048604 100644 --- a/main/configuration.h +++ b/main/configuration.h @@ -5,5 +5,6 @@ typedef struct { uint32_t refresh_delay; uint32_t* offsets; + uint16_t zero_cali_nsamp; int range; } configuration; diff --git a/main/gatt_svcs.c b/main/gatt_svcs.c index 077c25d..18d8a4c 100644 --- a/main/gatt_svcs.c +++ b/main/gatt_svcs.c @@ -38,6 +38,15 @@ static struct char_pres_format refrsh_rate_char_pres_format = { .descrL = (NSP_DESC_MAIN>>8) & 0xff, }; +static struct char_pres_format zero_cali_nsamp_char_pres_format = { + .format = FORMAT_UINT16, + .exponent = 0, + .unit = UNITLESS_UNIT_UUID, + .namespc = 1, + .descrH = NSP_DESC_MAIN & 0xff, + .descrL = (NSP_DESC_MAIN>>8) & 0xff, +}; + static int gatt_svr_chr_write(struct os_mbuf *om, uint16_t min_len, uint16_t max_len, void *dst, uint16_t *len) @@ -121,3 +130,37 @@ int gatt_char_access_sampling_rate(uint16_t conn_handle, uint16_t attr_handle, s return rc ? BLE_ATT_ERR_INSUFFICIENT_RES : 0; } + +int gatt_char_access_zeros_cali(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt, void* arg){ + int rc = 0; + + struct ble_context* c_ctxt = arg; + + switch(ctxt->op){ + case BLE_GATT_ACCESS_OP_WRITE_CHR: + { + switch (c_ctxt->handle){ + case ZEROS_CALI_ID: + start_zero_cali(c_ctxt->meas_ctxt, c_ctxt->conf->zero_cali_nsamp, c_ctxt->conf->offsets); + break; + case ZEROS_CALI_NSAMP_ID: + ; + uint16_t data; + rc = gatt_svr_chr_write(ctxt->om, sizeof(data), sizeof(data), &data, NULL); + c_ctxt->conf->zero_cali_nsamp = data; + break; + } + } + break; + case BLE_GATT_ACCESS_OP_READ_CHR: + ; + rc = os_mbuf_append(ctxt->om, &c_ctxt->conf->zero_cali_nsamp, sizeof(c_ctxt->conf->zero_cali_nsamp)); + break; + case BLE_GATT_ACCESS_OP_READ_DSC: + ; + rc = os_mbuf_append(ctxt->om, &zero_cali_nsamp_char_pres_format, CHAR_PRESENTATION_FORMAT_SIZE); + break; + } + + return rc ? BLE_ATT_ERR_INSUFFICIENT_RES : 0; +} diff --git a/main/gatt_svcs.h b/main/gatt_svcs.h index d4d29e9..b2d9904 100644 --- a/main/gatt_svcs.h +++ b/main/gatt_svcs.h @@ -3,7 +3,7 @@ #include "host/ble_gatt.h" enum ble_services {CS_SVC_ID, RVS_SVC_ID, SETTINGS_SVC_ID, SVCS_NUM}; -enum settings_chars {RFRSH_RATE_ID, SETTINGS_CHRS_NUM}; +enum settings_chars {RFRSH_RATE_ID, ZEROS_CALI_ID, ZEROS_CALI_NSAMP_ID, SETTINGS_CHRS_NUM}; #define CHAR_PRESENTATION_FORMAT_SIZE 7 @@ -18,4 +18,5 @@ struct char_pres_format { int gatt_char_access_cs(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt, void* arg); int gatt_char_access_ev(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt, void* arg); -int gatt_char_access_sampling_rate(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt, void* arg); \ No newline at end of file +int gatt_char_access_sampling_rate(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt, void* arg); +int gatt_char_access_zeros_cali(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt, void* arg); \ No newline at end of file diff --git a/main/measure.c b/main/measure.c index 06c24c2..c0a4549 100644 --- a/main/measure.c +++ b/main/measure.c @@ -88,23 +88,23 @@ void cali_get_one_chunk_avg(adc_continuous_handle_t handle, unsigned nb_samples, } } -void start_zero_cali(adc_continuous_handle_t handle, unsigned int nb_samples, measurement_input inputs[], int nb_inputs, uint32_t offsets[]){ - uint32_t meas[nb_inputs]; - uint32_t meas_nb[nb_inputs]; - for(int i = 0; i < nb_inputs; i++){ +void start_zero_cali(measurements_ctxt* ctxt, unsigned int nb_samples, uint32_t offsets[]){ + uint32_t meas[ctxt->nb_inputs]; + uint32_t meas_nb[ctxt->nb_inputs]; + for(int i = 0; i < ctxt->nb_inputs; i++){ meas[i] = 0; meas_nb[i] = 0; } for(int i = 0; i < nb_samples / ADC_STORE_BUFFER_SIZE; i++){ unsigned int nsamp = fmin(nb_samples - (i * ADC_STORE_BUFFER_SIZE), ADC_STORE_BUFFER_SIZE); - cali_get_one_chunk_avg(handle, nsamp, inputs, nb_inputs, meas, meas_nb); + cali_get_one_chunk_avg(ctxt->handle, nsamp, ctxt->inputs, ctxt->nb_inputs, meas, meas_nb); vTaskDelay(10 / portTICK_PERIOD_MS); } ESP_LOGI("ZERO cali", "%lu %lu %lu", meas[0]/meas_nb[0], meas[1]/meas_nb[1], meas[2]/meas_nb[2]); - for(int i = 0; i < nb_inputs; i++){ + for(int i = 0; i < ctxt->nb_inputs; i++){ offsets[i] = meas[i] / meas_nb[i]; } } diff --git a/main/measure.h b/main/measure.h index 1bbe4f1..f8b40ce 100644 --- a/main/measure.h +++ b/main/measure.h @@ -15,8 +15,14 @@ typedef struct { uint32_t *amperes; } measurements; +typedef struct { + adc_continuous_handle_t handle; + measurement_input* inputs; + int nb_inputs; +} measurements_ctxt; + #define ADC_STORE_BUFFER_SIZE 100 // in number of samples / nb of inputs adc_continuous_handle_t init_measurement_inputs(measurement_input inputs[], int inputs_num); void init_conv_driver(measurement_input inputs[], int inputs_num, adc_cali_handle_t* out); -void start_zero_cali(adc_continuous_handle_t handle, unsigned int nb_samples, measurement_input inputs[], int nb_inputs, uint32_t offsets[]); +void start_zero_cali(measurements_ctxt* ctxt, unsigned int nb_samples, uint32_t offsets[]); diff --git a/main/power_profiler.c b/main/power_profiler.c index 27cf643..c8b0e3c 100644 --- a/main/power_profiler.c +++ b/main/power_profiler.c @@ -126,6 +126,7 @@ void app_main(void){ .refresh_delay = 1000, .offsets = offsets, .range = R100, + .zero_cali_nsamp = 10000, }; uint32_t meas_volts[INPUTS_NUM]; @@ -134,8 +135,14 @@ void app_main(void){ .raw_volt = meas_volts, .amperes = meas_amp, }; + + measurements_ctxt meas_ctxt = { + .handle = adc_handle, + .inputs = inputs, + .nb_inputs = INPUTS_NUM, + }; - initBLE(&main_conf, &meas); + initBLE(&main_conf, &meas, &meas_ctxt); while(1){ uint32_t meas_res_buff[INPUTS_NUM];