zeros calibration
This commit is contained in:
parent
3efc86edf4
commit
13e51f3943
@ -6,6 +6,8 @@
|
|||||||
#define ELECTRIC_CURRENT_CHAR 0x2AEE
|
#define ELECTRIC_CURRENT_CHAR 0x2AEE
|
||||||
#define VOLTAGE_CHAR 0x2B18
|
#define VOLTAGE_CHAR 0x2B18
|
||||||
#define SAMPLING_RATE_CHAR 0x2C12
|
#define SAMPLING_RATE_CHAR 0x2C12
|
||||||
|
#define ZERO_CALI_CHAR 0x2C13
|
||||||
|
#define ZERO_CALI_NSAMP 0x2C14
|
||||||
|
|
||||||
#define CHAR_PRES_FORMAT 0x2904
|
#define CHAR_PRES_FORMAT 0x2904
|
||||||
|
|
||||||
@ -17,6 +19,7 @@
|
|||||||
#define VOLTS_UNIT_UUID 0x2728
|
#define VOLTS_UNIT_UUID 0x2728
|
||||||
#define HERTZ_UNIT_UUID 0x2722
|
#define HERTZ_UNIT_UUID 0x2722
|
||||||
#define SECONDS_UNIT_UUID 0x2703
|
#define SECONDS_UNIT_UUID 0x2703
|
||||||
|
#define UNITLESS_UNIT_UUID 0x2700
|
||||||
|
|
||||||
#define NSP_DESC_MAIN 0x0106
|
#define NSP_DESC_MAIN 0x0106
|
||||||
#define NSP_DESC_INSIDE 0x010B
|
#define NSP_DESC_INSIDE 0x010B
|
||||||
|
36
main/ble.c
36
main/ble.c
@ -105,7 +105,7 @@ static struct ble_gatt_svc_def gatt_svr_svcs[] = {
|
|||||||
.access_cb = gatt_char_access_sampling_rate,
|
.access_cb = gatt_char_access_sampling_rate,
|
||||||
.flags = BLE_GATT_CHR_F_READ | BLE_GATT_CHR_F_WRITE,
|
.flags = BLE_GATT_CHR_F_READ | BLE_GATT_CHR_F_WRITE,
|
||||||
.min_key_size = 0,
|
.min_key_size = 0,
|
||||||
.val_handle = settings_handle,
|
.val_handle = &settings_handle[RFRSH_RATE_ID],
|
||||||
.arg = &settings_ctxt[RFRSH_RATE_ID],
|
.arg = &settings_ctxt[RFRSH_RATE_ID],
|
||||||
.descriptors = (struct ble_gatt_dsc_def[]){
|
.descriptors = (struct ble_gatt_dsc_def[]){
|
||||||
[0] = {
|
[0] = {
|
||||||
@ -116,6 +116,30 @@ static struct ble_gatt_svc_def gatt_svr_svcs[] = {
|
|||||||
{ 0 },
|
{ 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 },
|
{ 0 },
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -172,13 +196,15 @@ static int ble_gap_event(struct ble_gap_event *event, void* arg){
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Generate a characteristic for each inputs
|
// 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++){
|
for(int i = 0; i < INPUTS_NUM; i++){
|
||||||
ev_ctxt[i].conf = conf;
|
ev_ctxt[i].conf = conf;
|
||||||
ev_ctxt[i].meas = meas;
|
ev_ctxt[i].meas = meas;
|
||||||
|
ev_ctxt[i].meas_ctxt = meas_ctxt;
|
||||||
|
|
||||||
cs_ctxt[i].conf = conf;
|
cs_ctxt[i].conf = conf;
|
||||||
cs_ctxt[i].meas = meas;
|
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(&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));
|
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++){
|
for(int i = 0; i < SETTINGS_CHRS_NUM; i++){
|
||||||
|
settings_ctxt[i].handle = i;
|
||||||
settings_ctxt[i].conf = conf;
|
settings_ctxt[i].conf = conf;
|
||||||
settings_ctxt[i].meas = meas;
|
settings_ctxt[i].meas = meas;
|
||||||
|
settings_ctxt[i].meas_ctxt = meas_ctxt;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void initBLE(configuration* conf, measurements* meas){
|
void initBLE(configuration* conf, measurements* meas, measurements_ctxt* meas_ctxt){
|
||||||
generate_svc_defs(conf, meas);
|
generate_svc_defs(conf, meas, meas_ctxt);
|
||||||
|
|
||||||
nimble_port_init();
|
nimble_port_init();
|
||||||
|
|
||||||
|
@ -11,7 +11,8 @@ struct ble_context {
|
|||||||
uint16_t handle;
|
uint16_t handle;
|
||||||
configuration *conf;
|
configuration *conf;
|
||||||
measurements *meas;
|
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);
|
void notify_update(measurements* meas);
|
@ -5,5 +5,6 @@
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
uint32_t refresh_delay;
|
uint32_t refresh_delay;
|
||||||
uint32_t* offsets;
|
uint32_t* offsets;
|
||||||
|
uint16_t zero_cali_nsamp;
|
||||||
int range;
|
int range;
|
||||||
} configuration;
|
} configuration;
|
||||||
|
@ -38,6 +38,15 @@ static struct char_pres_format refrsh_rate_char_pres_format = {
|
|||||||
.descrL = (NSP_DESC_MAIN>>8) & 0xff,
|
.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
|
static int
|
||||||
gatt_svr_chr_write(struct os_mbuf *om, uint16_t min_len, uint16_t max_len,
|
gatt_svr_chr_write(struct os_mbuf *om, uint16_t min_len, uint16_t max_len,
|
||||||
void *dst, uint16_t *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;
|
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;
|
||||||
|
}
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#include "host/ble_gatt.h"
|
#include "host/ble_gatt.h"
|
||||||
|
|
||||||
enum ble_services {CS_SVC_ID, RVS_SVC_ID, SETTINGS_SVC_ID, SVCS_NUM};
|
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
|
#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_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_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);
|
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);
|
@ -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[]){
|
void start_zero_cali(measurements_ctxt* ctxt, unsigned int nb_samples, uint32_t offsets[]){
|
||||||
uint32_t meas[nb_inputs];
|
uint32_t meas[ctxt->nb_inputs];
|
||||||
uint32_t meas_nb[nb_inputs];
|
uint32_t meas_nb[ctxt->nb_inputs];
|
||||||
for(int i = 0; i < nb_inputs; i++){
|
for(int i = 0; i < ctxt->nb_inputs; i++){
|
||||||
meas[i] = 0;
|
meas[i] = 0;
|
||||||
meas_nb[i] = 0;
|
meas_nb[i] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int i = 0; i < nb_samples / ADC_STORE_BUFFER_SIZE; i++){
|
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);
|
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);
|
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]);
|
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];
|
offsets[i] = meas[i] / meas_nb[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,8 +15,14 @@ typedef struct {
|
|||||||
uint32_t *amperes;
|
uint32_t *amperes;
|
||||||
} measurements;
|
} 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
|
#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);
|
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 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[]);
|
||||||
|
@ -126,6 +126,7 @@ void app_main(void){
|
|||||||
.refresh_delay = 1000,
|
.refresh_delay = 1000,
|
||||||
.offsets = offsets,
|
.offsets = offsets,
|
||||||
.range = R100,
|
.range = R100,
|
||||||
|
.zero_cali_nsamp = 10000,
|
||||||
};
|
};
|
||||||
|
|
||||||
uint32_t meas_volts[INPUTS_NUM];
|
uint32_t meas_volts[INPUTS_NUM];
|
||||||
@ -134,8 +135,14 @@ void app_main(void){
|
|||||||
.raw_volt = meas_volts,
|
.raw_volt = meas_volts,
|
||||||
.amperes = meas_amp,
|
.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){
|
while(1){
|
||||||
uint32_t meas_res_buff[INPUTS_NUM];
|
uint32_t meas_res_buff[INPUTS_NUM];
|
||||||
|
Loading…
x
Reference in New Issue
Block a user