fused currend
This commit is contained in:
parent
1c0ce2d750
commit
5f0a29ac35
39
main/ble.c
39
main/ble.c
@ -35,15 +35,18 @@ static struct ble_gap_adv_params adv_params = {
|
|||||||
|
|
||||||
static uint16_t conn_handle;
|
static uint16_t conn_handle;
|
||||||
|
|
||||||
|
static uint16_t csf_handle;
|
||||||
static uint16_t cs_handle[INPUTS_NUM];
|
static uint16_t cs_handle[INPUTS_NUM];
|
||||||
static uint16_t ev_handle[INPUTS_NUM];
|
static uint16_t ev_handle[INPUTS_NUM];
|
||||||
static uint16_t settings_handle[SETTINGS_CHRS_NUM];
|
static uint16_t settings_handle[SETTINGS_CHRS_NUM];
|
||||||
static uint16_t range_handle[RANGE_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 cs_notify_state[INPUTS_NUM];
|
||||||
static uint8_t ev_notify_state[INPUTS_NUM];
|
static uint8_t ev_notify_state[INPUTS_NUM];
|
||||||
static uint8_t range_notify_state;
|
static uint8_t range_notify_state;
|
||||||
|
|
||||||
|
static struct ble_context csf_ctxt;
|
||||||
static struct ble_context ev_ctxt[INPUTS_NUM];
|
static struct ble_context ev_ctxt[INPUTS_NUM];
|
||||||
static struct ble_context cs_ctxt[INPUTS_NUM];
|
static struct ble_context cs_ctxt[INPUTS_NUM];
|
||||||
static struct ble_context settings_ctxt[SETTINGS_CHRS_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[] = {
|
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] = {
|
[CS_SVC_ID] = {
|
||||||
.type = BLE_GATT_SVC_TYPE_PRIMARY,
|
.type = BLE_GATT_SVC_TYPE_PRIMARY,
|
||||||
.uuid = BLE_UUID16_DECLARE(METROLOGY_SERVICE),
|
.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:
|
case BLE_GAP_EVENT_SUBSCRIBE:
|
||||||
ESP_LOGI(TAG, "Subscribe %d", event->subscribe.attr_handle);
|
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++){
|
for(int i = 0; i < INPUTS_NUM; i++){
|
||||||
if(event->subscribe.attr_handle == cs_handle[i])
|
if(event->subscribe.attr_handle == cs_handle[i])
|
||||||
cs_notify_state[i] = event->subscribe.cur_notify;
|
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 = meas;
|
||||||
range_ctxt[i].meas_ctxt = meas_ctxt;
|
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){
|
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){
|
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++){
|
for(int i = 0; i < INPUTS_NUM; i++){
|
||||||
if(cs_notify_state[i]){
|
if(cs_notify_state[i]){
|
||||||
ESP_LOGI(TAG, "notify current %d", i);
|
ESP_LOGI(TAG, "notify current %d", i);
|
||||||
|
@ -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;
|
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, ¤t_char_pres_format, CHAR_PRESENTATION_FORMAT_SIZE);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc ? BLE_ATT_ERR_INSUFFICIENT_RES : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
#include "host/ble_gatt.h"
|
#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 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};
|
enum range_characteristics {AUTO_RANGE_ID, CURRENT_RANGE_ID, RANGE_CHRS_NUM};
|
||||||
|
|
||||||
@ -17,6 +17,7 @@ struct char_pres_format {
|
|||||||
uint8_t descrL;
|
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_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);
|
||||||
|
@ -14,6 +14,7 @@ typedef struct {
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
uint32_t *raw_volt;
|
uint32_t *raw_volt;
|
||||||
uint32_t *amperes;
|
uint32_t *amperes;
|
||||||
|
uint32_t amperes_f;
|
||||||
} measurements;
|
} measurements;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -31,6 +31,18 @@
|
|||||||
// number of consecutive times the input has to be below the threshold before switching
|
// number of consecutive times the input has to be below the threshold before switching
|
||||||
#define UNDERRANGE_NUM 3
|
#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[] = {
|
resistor_range ranges[] = {
|
||||||
[R1] = {
|
[R1] = {
|
||||||
.pin = GPIO_NUM_6,
|
.pin = GPIO_NUM_6,
|
||||||
@ -187,6 +199,13 @@ void app_main(void){
|
|||||||
meas_amp[i] = buff;
|
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){
|
if(meas_volts[UNDERRANGE_SRC] < UNDERRANGE_MV){
|
||||||
underrange_counter++;
|
underrange_counter++;
|
||||||
if(underrange_counter > UNDERRANGE_NUM && main_conf.auto_range){
|
if(underrange_counter > UNDERRANGE_NUM && main_conf.auto_range){
|
||||||
|
Loading…
x
Reference in New Issue
Block a user