diff --git a/include/barback.h b/include/barback.h new file mode 100644 index 0000000..d245583 --- /dev/null +++ b/include/barback.h @@ -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 diff --git a/include/pumps.h b/include/pumps.h index 63c6b83..6786624 100644 --- a/include/pumps.h +++ b/include/pumps.h @@ -13,8 +13,8 @@ void pumps_run(); void pumps_stop(); uint8_t pumps_init(); -uint8_t pumps_set_time(uint8_t idx, uint8_t time); -uint8_t pumps_get_time(uint8_t idx); +uint8_t pumps_set_duration(uint8_t idx, uint8_t time); +uint8_t pumps_get_duration(uint8_t idx); uint8_t pumps_set_enabled(uint8_t idx, uint8_t value); uint8_t pumps_get_enabled(uint8_t idx); diff --git a/main/ble.c b/main/ble.c index 6cb2f7d..b079241 100644 --- a/main/ble.c +++ b/main/ble.c @@ -15,6 +15,7 @@ #include "services/bas/ble_svc_bas.h" #include "driver/gpio.h" +#include "barback.h" #include "main.h" #include "ble.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_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 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); + +static int barback_ble_char_access(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_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_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) {\ .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,\ .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) {\ .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,\ .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) {\ .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],\ .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; } -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); uint8_t idx = uuid16 - (BLE_SERVICE_PUMP_ENABLED + 1); 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")); - if(ctxt->op == BLE_GATT_ACCESS_OP_WRITE_CHR) { gatt_svr_chr_write( 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) { - 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); 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; } -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) { // check if already adverting if(ble_gap_adv_active()) return; diff --git a/main/pumps.c b/main/pumps.c index 650d082..ade3045 100644 --- a/main/pumps.c +++ b/main/pumps.c @@ -17,7 +17,7 @@ static uint8_t pumps_enabled[PUMPS] = {0}; static uint8_t pumps_state[PUMPS] = {0}; 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; 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; } -uint8_t pumps_get_time(uint8_t idx) { +uint8_t pumps_get_duration(uint8_t idx) { return pumps_duration[idx]; }