Barback BLE DRY
This commit is contained in:
parent
bd9feea036
commit
a4253787a4
4 changed files with 52 additions and 69 deletions
14
include/barback.h
Normal file
14
include/barback.h
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
#ifndef __BARBACK_H__
|
||||||
|
#define __BARBACK_H__
|
||||||
|
|
||||||
|
typedef uint8_t (*barback_ble_access_read_t)(uint8_t idx);
|
||||||
|
typedef uint8_t (*barback_ble_access_write_t)(uint8_t idx, uint8_t value);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint16_t base_uuid;
|
||||||
|
|
||||||
|
barback_ble_access_read_t read;
|
||||||
|
barback_ble_access_write_t write;
|
||||||
|
} barback_ble_access_t;
|
||||||
|
|
||||||
|
#endif
|
|
@ -13,8 +13,8 @@ void pumps_run();
|
||||||
void pumps_stop();
|
void pumps_stop();
|
||||||
uint8_t pumps_init();
|
uint8_t pumps_init();
|
||||||
|
|
||||||
uint8_t pumps_set_time(uint8_t idx, uint8_t time);
|
uint8_t pumps_set_duration(uint8_t idx, uint8_t time);
|
||||||
uint8_t pumps_get_time(uint8_t idx);
|
uint8_t pumps_get_duration(uint8_t idx);
|
||||||
|
|
||||||
uint8_t pumps_set_enabled(uint8_t idx, uint8_t value);
|
uint8_t pumps_set_enabled(uint8_t idx, uint8_t value);
|
||||||
uint8_t pumps_get_enabled(uint8_t idx);
|
uint8_t pumps_get_enabled(uint8_t idx);
|
||||||
|
|
99
main/ble.c
99
main/ble.c
|
@ -15,6 +15,7 @@
|
||||||
#include "services/bas/ble_svc_bas.h"
|
#include "services/bas/ble_svc_bas.h"
|
||||||
#include "driver/gpio.h"
|
#include "driver/gpio.h"
|
||||||
|
|
||||||
|
#include "barback.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "ble.h"
|
#include "ble.h"
|
||||||
#include "pumps.h"
|
#include "pumps.h"
|
||||||
|
@ -44,10 +45,8 @@ static event_callback_handle_t callback_handlers[CONFIG_CACO_MAX_SERVICES] = { 0
|
||||||
|
|
||||||
static int ble_gap_event(struct ble_gap_event *event, void *arg);
|
static int ble_gap_event(struct ble_gap_event *event, void *arg);
|
||||||
static int ble_svc_access(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg);
|
static int ble_svc_access(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg);
|
||||||
static int svc_access_pump_state(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg);
|
|
||||||
static int svc_access_pump_enabled(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg);
|
static int barback_ble_char_access(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg);
|
||||||
static int svc_access_pump_duration(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg);
|
|
||||||
static int svc_access_system(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg);
|
|
||||||
|
|
||||||
#define BLE_SERVICE_PUMP_ENABLED (0x4200)
|
#define BLE_SERVICE_PUMP_ENABLED (0x4200)
|
||||||
#define BLE_SERVICE_PUMP_STATE (0x4300)
|
#define BLE_SERVICE_PUMP_STATE (0x4300)
|
||||||
|
@ -57,23 +56,40 @@ static int svc_access_system(uint16_t conn_handle, uint16_t attr_handle, struct
|
||||||
#define CHAR_POUR (BLE_SERVICE_BARBACK + 1)
|
#define CHAR_POUR (BLE_SERVICE_BARBACK + 1)
|
||||||
#define CHAR_BUTTON (BLE_SERVICE_BARBACK + 2)
|
#define CHAR_BUTTON (BLE_SERVICE_BARBACK + 2)
|
||||||
|
|
||||||
|
static barback_ble_access_t barback_ble_pump_access_enabled = {
|
||||||
|
.read = pumps_get_enabled,
|
||||||
|
.write = pumps_set_enabled
|
||||||
|
};
|
||||||
|
|
||||||
#define BLE_CHAR_PUMP_ENABLED(idx) {\
|
#define BLE_CHAR_PUMP_ENABLED(idx) {\
|
||||||
.uuid = BLE_UUID16_DECLARE(BLE_SERVICE_PUMP_ENABLED + idx),\
|
.uuid = BLE_UUID16_DECLARE(BLE_SERVICE_PUMP_ENABLED + idx),\
|
||||||
.access_cb = svc_access_pump_enabled,\
|
.access_cb = barback_ble_char_access,\
|
||||||
|
.arg = &barback_ble_pump_access_enabled,\
|
||||||
.val_handle = &ble_svc_handle,\
|
.val_handle = &ble_svc_handle,\
|
||||||
.flags = BLE_GATT_CHR_F_NOTIFY | BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ\
|
.flags = BLE_GATT_CHR_F_NOTIFY | BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ\
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static barback_ble_access_t barback_ble_pump_access_state = {
|
||||||
|
.read = pumps_get_state,
|
||||||
|
};
|
||||||
|
|
||||||
#define BLE_CHAR_PUMP_STATE(idx) {\
|
#define BLE_CHAR_PUMP_STATE(idx) {\
|
||||||
.uuid = BLE_UUID16_DECLARE(BLE_SERVICE_PUMP_STATE + idx),\
|
.uuid = BLE_UUID16_DECLARE(BLE_SERVICE_PUMP_STATE + idx),\
|
||||||
.access_cb = svc_access_pump_state,\
|
.access_cb = barback_ble_char_access,\
|
||||||
|
.arg = &barback_ble_pump_access_state,\
|
||||||
.val_handle = &ble_svc_handle,\
|
.val_handle = &ble_svc_handle,\
|
||||||
.flags = BLE_GATT_CHR_F_NOTIFY | BLE_GATT_CHR_F_READ\
|
.flags = BLE_GATT_CHR_F_NOTIFY | BLE_GATT_CHR_F_READ\
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static barback_ble_access_t barback_ble_pump_access_duration = {
|
||||||
|
.read = pumps_get_duration,
|
||||||
|
.write = pumps_set_duration
|
||||||
|
};
|
||||||
|
|
||||||
#define BLE_CHAR_PUMP_DURATION(idx) {\
|
#define BLE_CHAR_PUMP_DURATION(idx) {\
|
||||||
.uuid = BLE_UUID16_DECLARE(BLE_SERVICE_PUMP_DURATION + idx),\
|
.uuid = BLE_UUID16_DECLARE(BLE_SERVICE_PUMP_DURATION + idx),\
|
||||||
.access_cb = svc_access_pump_duration,\
|
.access_cb = barback_ble_char_access,\
|
||||||
|
.arg = &barback_ble_pump_access_duration,\
|
||||||
.val_handle = &pump_duration_svc_val_handles[idx - 1],\
|
.val_handle = &pump_duration_svc_val_handles[idx - 1],\
|
||||||
.flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_NOTIFY | BLE_GATT_CHR_F_READ\
|
.flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_NOTIFY | BLE_GATT_CHR_F_READ\
|
||||||
}
|
}
|
||||||
|
@ -182,14 +198,15 @@ static int svc_access_system(uint16_t conn_handle, uint16_t attr_handle, struct
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int svc_access_pump_enabled(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg) {
|
static int barback_ble_char_access(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg) {
|
||||||
uint16_t uuid16 = ble_uuid_u16(ctxt->chr->uuid);
|
uint16_t uuid16 = ble_uuid_u16(ctxt->chr->uuid);
|
||||||
uint8_t idx = uuid16 - (BLE_SERVICE_PUMP_ENABLED + 1);
|
uint8_t idx = uuid16 - (BLE_SERVICE_PUMP_ENABLED + 1);
|
||||||
uint8_t value = 0;
|
uint8_t value = 0;
|
||||||
|
|
||||||
|
barback_ble_access_t *access = (barback_ble_access_t *)arg;
|
||||||
|
|
||||||
ESP_LOGI(TAG, "conn_handle: %d attr_handle: %d char: 0x%02X op: %s", conn_handle, attr_handle, uuid16, (ctxt->op == 0 ? "read" : ctxt->op == 1 ? "write" : "unknown"));
|
ESP_LOGI(TAG, "conn_handle: %d attr_handle: %d char: 0x%02X op: %s", conn_handle, attr_handle, uuid16, (ctxt->op == 0 ? "read" : ctxt->op == 1 ? "write" : "unknown"));
|
||||||
|
|
||||||
|
|
||||||
if(ctxt->op == BLE_GATT_ACCESS_OP_WRITE_CHR) {
|
if(ctxt->op == BLE_GATT_ACCESS_OP_WRITE_CHR) {
|
||||||
gatt_svr_chr_write(
|
gatt_svr_chr_write(
|
||||||
ctxt->om,
|
ctxt->om,
|
||||||
|
@ -206,9 +223,15 @@ static int svc_access_pump_enabled(uint16_t conn_handle, uint16_t attr_handle, s
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pumps_set_enabled(idx, value);
|
if(access->write != NULL)
|
||||||
|
access->write(idx, value);
|
||||||
} else if(ctxt->op == BLE_GATT_ACCESS_OP_READ_CHR) {
|
} else if(ctxt->op == BLE_GATT_ACCESS_OP_READ_CHR) {
|
||||||
uint8_t enabled = pumps_get_enabled(idx);
|
if(access->read != NULL) {
|
||||||
|
ESP_LOGW(TAG, "Attempted read without defining access.read");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t enabled = access->read(idx);
|
||||||
|
|
||||||
ESP_LOGI(TAG, "pumps_enabled[%d] = %d", idx, enabled);
|
ESP_LOGI(TAG, "pumps_enabled[%d] = %d", idx, enabled);
|
||||||
os_mbuf_append(ctxt->om, &enabled, sizeof enabled);
|
os_mbuf_append(ctxt->om, &enabled, sizeof enabled);
|
||||||
|
@ -217,60 +240,6 @@ static int svc_access_pump_enabled(uint16_t conn_handle, uint16_t attr_handle, s
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int svc_access_pump_duration(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg) {
|
|
||||||
uint16_t uuid16 = ble_uuid_u16(ctxt->chr->uuid);
|
|
||||||
uint8_t idx = uuid16 - (BLE_SERVICE_PUMP_DURATION + 1);
|
|
||||||
uint8_t value = 0;
|
|
||||||
|
|
||||||
ESP_LOGI(TAG, "pump_duration: conn_handle: %d attr_handle: %d char: 0x%02X op: %s", conn_handle, attr_handle, uuid16, (ctxt->op == 0 ? "read" : ctxt->op == 1 ? "write" : "unknown"));
|
|
||||||
|
|
||||||
if(ctxt->op == BLE_GATT_ACCESS_OP_WRITE_CHR) {
|
|
||||||
gatt_svr_chr_write(
|
|
||||||
ctxt->om,
|
|
||||||
sizeof value,
|
|
||||||
sizeof value,
|
|
||||||
&value, NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
struct ble_gap_conn_desc notifiee;
|
|
||||||
|
|
||||||
for (uint16_t i = 0; i < CONFIG_NIMBLE_MAX_CONNECTIONS; i++) {
|
|
||||||
if(ble_gap_conn_find(i, ¬ifiee) == ESP_OK) {
|
|
||||||
ble_gattc_notify_custom(i, attr_handle, ctxt->om);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pumps_set_time(idx, value);
|
|
||||||
} else if(ctxt->op == BLE_GATT_ACCESS_OP_READ_CHR) {
|
|
||||||
uint8_t duration = pumps_get_time(idx);
|
|
||||||
|
|
||||||
ESP_LOGI(TAG, "pumps_duration[%d] = %d", idx, duration);
|
|
||||||
os_mbuf_append(ctxt->om, &duration, sizeof duration);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int svc_access_pump_state(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg) {
|
|
||||||
uint16_t uuid16 = ble_uuid_u16(ctxt->chr->uuid);
|
|
||||||
uint8_t idx = uuid16 - (BLE_SERVICE_PUMP_ENABLED + 1);
|
|
||||||
|
|
||||||
ESP_LOGI(TAG, "pump_state: conn_handle: %d attr_handle: %d char: 0x%02X op: %s", conn_handle, attr_handle, uuid16, (ctxt->op == 0 ? "read" : ctxt->op == 1 ? "write" : "unknown"));
|
|
||||||
|
|
||||||
if(ctxt->op == BLE_GATT_ACCESS_OP_WRITE_CHR) {
|
|
||||||
ESP_LOGW(TAG, "attempting non-read op on read only characteristics");
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
} else if(ctxt->op == BLE_GATT_ACCESS_OP_READ_CHR) {
|
|
||||||
uint8_t state = pumps_get_state(idx);
|
|
||||||
|
|
||||||
ESP_LOGI(TAG, "pumps_state[%d] = %d", idx, state);
|
|
||||||
os_mbuf_append(ctxt->om, &state, sizeof state);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ble_advertise(void) {
|
static void ble_advertise(void) {
|
||||||
// check if already adverting
|
// check if already adverting
|
||||||
if(ble_gap_adv_active()) return;
|
if(ble_gap_adv_active()) return;
|
||||||
|
|
|
@ -17,7 +17,7 @@ static uint8_t pumps_enabled[PUMPS] = {0};
|
||||||
static uint8_t pumps_state[PUMPS] = {0};
|
static uint8_t pumps_state[PUMPS] = {0};
|
||||||
static uint8_t safety = 1;
|
static uint8_t safety = 1;
|
||||||
|
|
||||||
uint8_t pumps_set_time(uint8_t idx, uint8_t time) {
|
uint8_t pumps_set_duration(uint8_t idx, uint8_t time) {
|
||||||
if(idx > PUMPS) return PUMPS_ERR_OUT_IDX;
|
if(idx > PUMPS) return PUMPS_ERR_OUT_IDX;
|
||||||
|
|
||||||
ESP_LOGI(TAG, "duration update: %d = %d", idx, time);
|
ESP_LOGI(TAG, "duration update: %d = %d", idx, time);
|
||||||
|
@ -44,7 +44,7 @@ uint8_t pumps_get_enabled(uint8_t idx) {
|
||||||
return pumps_enabled[idx] ? 1 : 0;
|
return pumps_enabled[idx] ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t pumps_get_time(uint8_t idx) {
|
uint8_t pumps_get_duration(uint8_t idx) {
|
||||||
return pumps_duration[idx];
|
return pumps_duration[idx];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue