zeros calibration

This commit is contained in:
leo 2023-06-15 13:54:57 +02:00
parent 3efc86edf4
commit 13e51f3943
Signed by: leo
GPG Key ID: 0DD993BFB2B307DB
9 changed files with 105 additions and 15 deletions

View File

@ -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

View File

@ -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], &current_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();

View File

@ -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);

View File

@ -5,5 +5,6 @@
typedef struct {
uint32_t refresh_delay;
uint32_t* offsets;
uint16_t zero_cali_nsamp;
int range;
} configuration;

View File

@ -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;
}

View File

@ -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);
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);

View File

@ -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];
}
}

View File

@ -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[]);

View File

@ -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];