zeros calibration
This commit is contained in:
parent
3efc86edf4
commit
13e51f3943
@ -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
|
||||
|
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,
|
||||
.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();
|
||||
|
||||
|
@ -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);
|
@ -5,5 +5,6 @@
|
||||
typedef struct {
|
||||
uint32_t refresh_delay;
|
||||
uint32_t* offsets;
|
||||
uint16_t zero_cali_nsamp;
|
||||
int range;
|
||||
} configuration;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
@ -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];
|
||||
}
|
||||
}
|
||||
|
@ -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[]);
|
||||
|
@ -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];
|
||||
|
Loading…
x
Reference in New Issue
Block a user