holy smokes! thats a lot of BLE improvements!

This commit is contained in:
morgan 2026-08-15 11:37:27 -07:00
parent ef0c092c0e
commit 341b5eb020
3 changed files with 99 additions and 13 deletions

View file

@ -3,6 +3,18 @@
#include <stdbool.h> #include <stdbool.h>
#include "esp_event_base.h" #include "esp_event_base.h"
#include "host/ble_hs.h"
#ifdef MACSTR
#undef MACSTR
#define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x"
#endif
#ifdef MAC2STR
#undef MAC2STR
#define MAC2STR(a) (uint8_t)(a)[0], (uint8_t)(a)[1], (uint8_t)(a)[2], (uint8_t)(a)[3], (uint8_t)(a)[4], (uint8_t)(a)[5]
#endif
#define BAROS_NAME_MAX_LEN ( 32) #define BAROS_NAME_MAX_LEN ( 32)
#define BAROS_BLE_SERVICE_PUMP_ENABLED (0x4200) #define BAROS_BLE_SERVICE_PUMP_ENABLED (0x4200)
@ -32,11 +44,17 @@ typedef struct {
typedef struct { typedef struct {
char *name; char *name;
uint8_t name_len; uint8_t name_len;
uint8_t mac[6]; ble_addr_t addr;
baros_role_t role; baros_role_t role;
} baros_ble_discovery_t; } baros_ble_discovery_t;
uint8_t baros_ble_init(baros_ble_cfg_t *cfg); typedef void baros_ble_connect_callback_t(ble_addr_t addr, void *arg);
typedef struct {
ble_addr_t addr;
void *arg;
baros_ble_connect_callback_t *cb;
} baros_ble_connect_cfg_t;
typedef struct baros_list_node baros_list_node_t; typedef struct baros_list_node baros_list_node_t;
@ -48,10 +66,17 @@ struct baros_list_node {
void *element; void *element;
}; };
typedef bool baros_list_find_element_callback(void *element); uint8_t baros_ble_init(baros_ble_cfg_t *cfg);
void baros_ble_connect(baros_ble_connect_cfg_t *cfg);
void *baros_list_find_element(baros_list_node_t *list, baros_list_find_element_callback *cb); typedef bool baros_list_find_element_callback(void *element, void *arg);
void *baros_list_find_node(baros_list_node_t *list, baros_list_find_element_callback *cb);
void *baros_list_find_element(baros_list_node_t *list, baros_list_find_element_callback *cb, void *arg);
void *baros_list_find_node(baros_list_node_t *list, baros_list_find_element_callback *cb, void *arg);
void baros_list_free(baros_list_node_t *list);
baros_list_node_t *baros_list_find_all_nodes(baros_list_node_t *list, baros_list_find_element_callback *cb, void *arg);
baros_list_node_t *baros_list_add(baros_list_node_t *list, void *element); baros_list_node_t *baros_list_add(baros_list_node_t *list, void *element);
extern baros_list_node_t *peer_list;
#endif #endif

View file

@ -2,6 +2,9 @@
#include <stdlib.h> #include <stdlib.h>
#include "baros.h" #include "baros.h"
#include "baros_ble.h" #include "baros_ble.h"
#include "esp_log.h"
#define TAG "BAROS"
uint8_t baros_init(baros_cfg_t *cfg) { uint8_t baros_init(baros_cfg_t *cfg) {
baros_ble_cfg_t ble_cfg = { baros_ble_cfg_t ble_cfg = {
@ -16,17 +19,28 @@ uint8_t baros_init(baros_cfg_t *cfg) {
baros_list_node_t *baros_list_add(baros_list_node_t *list, void *element) { baros_list_node_t *baros_list_add(baros_list_node_t *list, void *element) {
baros_list_node_t *node = malloc(sizeof(baros_list_node_t)); baros_list_node_t *node = malloc(sizeof(baros_list_node_t));
if(!node) {
ESP_LOGE(TAG, "unable to allocate memory for new node");
return NULL;
}
bzero(node, sizeof(baros_list_node_t)); bzero(node, sizeof(baros_list_node_t));
node->element = element; node->element = element;
if(list == NULL) { if(list == NULL) {
ESP_LOGD(TAG, "Creating new list");
node->first = node; node->first = node;
node->last = node; node->last = node;
return node; return node;
} }
ESP_LOGD(TAG, "Adding new element");
baros_list_node_t *last = list->last; baros_list_node_t *last = list->last;
node->first = list->first; node->first = list->first;
@ -44,20 +58,52 @@ baros_list_node_t *baros_list_add(baros_list_node_t *list, void *element) {
return node; return node;
} }
void *baros_list_find_node(baros_list_node_t *list, baros_list_find_element_callback *cb) { void baros_list_free(baros_list_node_t *list) {
baros_list_node_t *last = list->last;
baros_list_node_t *prev;
while(last) {
prev = last->prev;
free(last);
last = prev;
}
}
baros_list_node_t *baros_list_find_all_nodes(baros_list_node_t *list, baros_list_find_element_callback *cb, void *arg) {
baros_list_node_t *ret = NULL;
baros_list_node_t *n = list->first; baros_list_node_t *n = list->first;
while(n) { while(n) {
if(cb(n->element)) { if(cb(n->element, arg)) {
if(ret == NULL) {
ret = baros_list_add(NULL, n->element);
} else {
baros_list_add(ret, n->element);
}
}
n = n->next;
}
return ret;
}
void *baros_list_find_node(baros_list_node_t *list, baros_list_find_element_callback *cb, void *arg) {
baros_list_node_t *n = list->first;
while(n) {
if(cb(n->element, arg)) {
return n; return n;
} }
n = n->next;
} }
return NULL; return NULL;
} }
void *baros_list_find_element(baros_list_node_t *list, baros_list_find_element_callback *cb) { void *baros_list_find_element(baros_list_node_t *list, baros_list_find_element_callback *cb, void *arg) {
baros_list_node_t *n = baros_list_find_node(list, cb); baros_list_node_t *n = baros_list_find_node(list, cb, arg);
if(n) { if(n) {
return n->element; return n->element;

View file

@ -42,6 +42,7 @@ static int svc_access_system(uint16_t conn_handle, uint16_t attr_handle, struct
static int barback_ble_char_access(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);
baros_list_node_t *peer_list = NULL; baros_list_node_t *peer_list = NULL;
baros_ble_connect_cfg_t *connect_attempt = NULL;
static const struct ble_gatt_svc_def service_defs[] = { static const struct ble_gatt_svc_def service_defs[] = {
{ {
@ -252,14 +253,14 @@ static int ble_gap_event(struct ble_gap_event *event, void *arg) {
baros_role_t role = fields.svc_data_uuid16[2]; baros_role_t role = fields.svc_data_uuid16[2];
ESP_LOGD(TAG, "Discovery: %s", name); ESP_LOGI(TAG, "Discovery [" MACSTR "]: %s", MAC2STR(event->disc.addr.val), name);
baros_ble_discovery_t *discovery = malloc(sizeof(baros_ble_discovery_t)); baros_ble_discovery_t *discovery = malloc(sizeof(baros_ble_discovery_t));
discovery->name_len = fields.name_len; discovery->name_len = fields.name_len;
discovery->name = name; discovery->name = name;
discovery->role = role; discovery->role = role;
memcpy(discovery->mac, &event->disc.addr.val, 6); discovery->addr = event->disc.addr;
if(peer_list == NULL) { if(peer_list == NULL) {
peer_list = baros_list_add(NULL, discovery); peer_list = baros_list_add(NULL, discovery);
@ -285,6 +286,11 @@ static int ble_gap_event(struct ble_gap_event *event, void *arg) {
// always keep advertising // always keep advertising
ble_advertise(); ble_advertise();
if(connect_attempt != NULL && connect_attempt->cb != NULL) {
ESP_LOGI(TAG, "addr: %p arg: %p", ((baros_ble_discovery_t*)connect_attempt->arg)->addr, connect_attempt->arg);
connect_attempt->cb(((baros_ble_discovery_t*)connect_attempt->arg)->addr, connect_attempt->arg);
}
break; break;
case BLE_GAP_EVENT_DISCONNECT: case BLE_GAP_EVENT_DISCONNECT:
@ -401,8 +407,17 @@ void nimble_host_task(void *param) {
nimble_port_run(); nimble_port_run();
} }
uint8_t baros_ble_scan(baros_role_t role) { void baros_ble_connect(baros_ble_connect_cfg_t *cfg) {
return 0; uint8_t addr_type;
connect_attempt = cfg;
ESP_LOGI(TAG, "Connect attempt to: " MACSTR, MAC2STR(cfg->addr.val));
ble_gap_disc_cancel();
ESP_ERROR_CHECK(ble_hs_id_infer_auto(0, &addr_type));
esp_err_t err = ble_gap_connect(addr_type, &cfg->addr, 30000, NULL, ble_gap_event, NULL);
ESP_LOGI(TAG, "err: 0x%x", err);
} }
uint8_t baros_ble_init(baros_ble_cfg_t *cfg) { uint8_t baros_ble_init(baros_ble_cfg_t *cfg) {