fused currend

This commit is contained in:
leo 2023-06-17 17:17:51 +02:00
parent 1c0ce2d750
commit 5f0a29ac35
Signed by: leo
GPG Key ID: 0DD993BFB2B307DB
5 changed files with 82 additions and 1 deletions

View File

@ -35,15 +35,18 @@ static struct ble_gap_adv_params adv_params = {
static uint16_t conn_handle;
static uint16_t csf_handle;
static uint16_t cs_handle[INPUTS_NUM];
static uint16_t ev_handle[INPUTS_NUM];
static uint16_t settings_handle[SETTINGS_CHRS_NUM];
static uint16_t range_handle[RANGE_CHRS_NUM];
static uint8_t csf_notify_state;
static uint8_t cs_notify_state[INPUTS_NUM];
static uint8_t ev_notify_state[INPUTS_NUM];
static uint8_t range_notify_state;
static struct ble_context csf_ctxt;
static struct ble_context ev_ctxt[INPUTS_NUM];
static struct ble_context cs_ctxt[INPUTS_NUM];
static struct ble_context settings_ctxt[SETTINGS_CHRS_NUM];
@ -104,6 +107,29 @@ static struct ble_gatt_dsc_def rvs_descr_array[INPUTS_NUM + 1][3];
static struct ble_gatt_svc_def gatt_svr_svcs[] = {
[CSF_SVC_ID] = {
.type = BLE_GATT_SVC_TYPE_PRIMARY,
.uuid = BLE_UUID16_DECLARE(METROLOGY_SERVICE),
.characteristics = (struct ble_gatt_chr_def[]){
[0] = {
.uuid = BLE_UUID16_DECLARE(ELECTRIC_CURRENT_CHAR),
.access_cb = gatt_char_access_csf,
.flags = BLE_GATT_CHR_F_READ | BLE_GATT_CHR_F_NOTIFY,
.min_key_size = 0,
.val_handle = &csf_handle,
.arg = &csf_ctxt,
.descriptors = (struct ble_gatt_dsc_def[]){
[0] = {
.uuid = BLE_UUID16_DECLARE(CHAR_PRES_FORMAT),
.access_cb = gatt_char_access_csf,
.att_flags = BLE_ATT_F_READ,
},
{ 0 },
},
},
{0},
},
},
[CS_SVC_ID] = {
.type = BLE_GATT_SVC_TYPE_PRIMARY,
.uuid = BLE_UUID16_DECLARE(METROLOGY_SERVICE),
@ -257,6 +283,8 @@ static int ble_gap_event(struct ble_gap_event *event, void* arg){
case BLE_GAP_EVENT_SUBSCRIBE:
ESP_LOGI(TAG, "Subscribe %d", event->subscribe.attr_handle);
if(event->subscribe.attr_handle == csf_handle)
csf_notify_state = event->subscribe.cur_notify;
for(int i = 0; i < INPUTS_NUM; i++){
if(event->subscribe.attr_handle == cs_handle[i])
cs_notify_state[i] = event->subscribe.cur_notify;
@ -319,6 +347,11 @@ static void generate_svc_defs(configuration* conf, measurements* meas, measureme
range_ctxt[i].meas = meas;
range_ctxt[i].meas_ctxt = meas_ctxt;
}
csf_ctxt.handle = 0;
csf_ctxt.conf = conf;
csf_ctxt.meas = meas;
csf_ctxt.meas_ctxt = meas_ctxt;
}
void initBLE(configuration* conf, measurements* meas, measurements_ctxt* meas_ctxt){
@ -335,6 +368,12 @@ void initBLE(configuration* conf, measurements* meas, measurements_ctxt* meas_ct
}
void notify_update(measurements* meas){
if(csf_notify_state){
ESP_LOGI(TAG, "notify current fused");
uint32_t data = meas->amperes_f;
struct os_mbuf* om = ble_hs_mbuf_from_flat(&data, sizeof(data));
ESP_ERROR_CHECK(ble_gattc_notify_custom(conn_handle, csf_handle, om));
}
for(int i = 0; i < INPUTS_NUM; i++){
if(cs_notify_state[i]){
ESP_LOGI(TAG, "notify current %d", i);

View File

@ -269,3 +269,24 @@ int gatt_char_access_range(uint16_t conn_handle, uint16_t attr_handle, struct bl
return rc ? BLE_ATT_ERR_INSUFFICIENT_RES : 0;
}
int gatt_char_access_csf(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt, void* arg){
int rc = 0;
switch(ctxt->op){
case BLE_GATT_ACCESS_OP_READ_CHR:
;
struct ble_context *c_ctxt = arg;
uint32_t data = c_ctxt->meas->amperes_f;
rc = os_mbuf_append(ctxt->om, &data, sizeof(data));
break;
case BLE_GATT_ACCESS_OP_READ_DSC:
;
rc = os_mbuf_append(ctxt->om, &current_char_pres_format, CHAR_PRESENTATION_FORMAT_SIZE);
break;
}
return rc ? BLE_ATT_ERR_INSUFFICIENT_RES : 0;
}

View File

@ -2,7 +2,7 @@
#include "host/ble_gatt.h"
enum ble_services {CS_SVC_ID, RVS_SVC_ID, RANGE_SVC_ID, SETTINGS_SVC_ID, SVCS_NUM};
enum ble_services {CSF_SVC_ID, CS_SVC_ID, RVS_SVC_ID, RANGE_SVC_ID, SETTINGS_SVC_ID, SVCS_NUM};
enum settings_chars {RFRSH_RATE_ID, ZEROS_CALI_ID, ZEROS_CALI_RESET, ZEROS_CALI_NSAMP_ID, SETTINGS_CHRS_NUM};
enum range_characteristics {AUTO_RANGE_ID, CURRENT_RANGE_ID, RANGE_CHRS_NUM};
@ -17,6 +17,7 @@ struct char_pres_format {
uint8_t descrL;
};
int gatt_char_access_csf(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_sampling_rate(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt, void* arg);

View File

@ -14,6 +14,7 @@ typedef struct {
typedef struct {
uint32_t *raw_volt;
uint32_t *amperes;
uint32_t amperes_f;
} measurements;
typedef struct {

View File

@ -31,6 +31,18 @@
// number of consecutive times the input has to be below the threshold before switching
#define UNDERRANGE_NUM 3
// default source for the fused current measure
#define DEFAULT_SRC X10
// valeur pour laquelle on passe a la source de haute precision (mV)
#define DEFAULT_SRC_SW_MIN 10
// source de plus haute precision
#define HIGH_PRECISION_SRC X100
// valeur pour laquelle on passe a la source de plus basse precision (mV)
#define DEFAULT_SRC_SW_MAX 700
// source de plus haute precision
#define LOW_PRECISION_SRC X1
resistor_range ranges[] = {
[R1] = {
.pin = GPIO_NUM_6,
@ -187,6 +199,13 @@ void app_main(void){
meas_amp[i] = buff;
}
if(meas_volts[DEFAULT_SRC] < DEFAULT_SRC_SW_MIN)
meas.amperes_f = meas_amp[HIGH_PRECISION_SRC];
else if(meas_volts[DEFAULT_SRC] > DEFAULT_SRC_SW_MAX)
meas.amperes_f = meas_amp[LOW_PRECISION_SRC];
else
meas.amperes_f = meas_amp[DEFAULT_SRC];
if(meas_volts[UNDERRANGE_SRC] < UNDERRANGE_MV){
underrange_counter++;
if(underrange_counter > UNDERRANGE_NUM && main_conf.auto_range){