Merge pull request #15779 from Staars/mi32

Mi32 legacy: Use notification queue for Berry
This commit is contained in:
s-hadinger 2022-06-09 22:21:43 +02:00 committed by GitHub
commit 8f60d464f3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 41 additions and 16 deletions

View File

@ -157,6 +157,11 @@ struct MI32connectionContextBerry_t{
bool response; bool response;
}; };
struct MI32notificationBuffer_t{
uint8_t buffer[256];
uint16_t returnCharUUID;
};
struct { struct {
// uint32_t period; // set manually in addition to TELE-period, is set to TELE-period after start // uint32_t period; // set manually in addition to TELE-period, is set to TELE-period after start
TaskHandle_t ScanTask = nullptr; TaskHandle_t ScanTask = nullptr;
@ -185,6 +190,7 @@ struct {
uint32_t triggerBerryConnCB:1; uint32_t triggerBerryConnCB:1;
uint32_t triggerNextConnJob:1; uint32_t triggerNextConnJob:1;
uint32_t readyForNextConnJob:1; uint32_t readyForNextConnJob:1;
uint32_t discoverAttributes:1;
}; };
uint32_t all = 0; uint32_t all = 0;
} mode; } mode;

View File

@ -119,7 +119,7 @@ extern "C" {
extern void MI32setBerryAdvCB(void* function, uint8_t *buffer); extern void MI32setBerryAdvCB(void* function, uint8_t *buffer);
extern void MI32setBerryConnCB(void* function, uint8_t *buffer); extern void MI32setBerryConnCB(void* function, uint8_t *buffer);
extern bool MI32runBerryConnection(uint8_t operation, bool response); extern bool MI32runBerryConnection(uint8_t operation, bool response);
extern bool MI32setBerryCtxSvc(const char *Svc); extern bool MI32setBerryCtxSvc(const char *Svc, bool discoverAttributes);
extern bool MI32setBerryCtxChr(const char *Chr); extern bool MI32setBerryCtxChr(const char *Chr);
extern bool MI32setBerryCtxMAC(uint8_t *MAC, uint8_t type); extern bool MI32setBerryCtxMAC(uint8_t *MAC, uint8_t type);
extern bool MI32addMACtoBlockList(uint8_t *MAC, uint8_t type); extern bool MI32addMACtoBlockList(uint8_t *MAC, uint8_t type);
@ -175,8 +175,12 @@ extern "C" {
int be_BLE_set_service(bvm *vm); int be_BLE_set_service(bvm *vm);
int be_BLE_set_service(bvm *vm){ int be_BLE_set_service(bvm *vm){
int32_t argc = be_top(vm); // Get the number of arguments int32_t argc = be_top(vm); // Get the number of arguments
if (argc == 2 && be_isstring(vm, 2)) { if (argc > 1 && be_isstring(vm, 2)) {
if (MI32setBerryCtxSvc(be_tostring(vm, 2))) be_return(vm); bool discoverAttributes = false;
if(argc == 3 && be_isint(vm, 3)){
discoverAttributes = be_toint(vm,3)>0;
}
if (MI32setBerryCtxSvc(be_tostring(vm, 2),discoverAttributes)) be_return(vm);
} }
be_raise(vm, kTypeError, nullptr); be_raise(vm, kTypeError, nullptr);
} }

View File

@ -60,6 +60,7 @@
#include <NimBLEDevice.h> #include <NimBLEDevice.h>
#include <vector> #include <vector>
#include <queue>
#include <t_bearssl.h> #include <t_bearssl.h>
@ -164,6 +165,7 @@ class MI32AdvCallbacks: public NimBLEAdvertisedDeviceCallbacks {
static MI32AdvCallbacks MI32ScanCallbacks; static MI32AdvCallbacks MI32ScanCallbacks;
static MI32SensorCallback MI32SensorCB; static MI32SensorCallback MI32SensorCB;
static NimBLEClient* MI32Client; static NimBLEClient* MI32Client;
static std::queue<MI32notificationBuffer_t> MI32NotificationQueue;
/*********************************************************************************************\ /*********************************************************************************************\
* BLE callback functions * BLE callback functions
@ -175,16 +177,17 @@ void MI32scanEndedCB(NimBLEScanResults results){
} }
void MI32notifyCB(NimBLERemoteCharacteristic* pRemoteCharacteristic, uint8_t* pData, size_t length, bool isNotify){ void MI32notifyCB(NimBLERemoteCharacteristic* pRemoteCharacteristic, uint8_t* pData, size_t length, bool isNotify){
if(MI32.mode.triggerBerryConnCB) return; //discard data, if we did not pass the old to Berry yet if(isNotify){
if(isNotify){ MI32notificationBuffer_t _buf;
MI32.infoMsg = MI32_GOT_NOTIFICATION; _buf.buffer[0] = (uint8_t)length;
MI32.conCtx->buffer[0] = (uint8_t)length; memcpy(_buf.buffer+1, pData, length);
memcpy(MI32.conCtx->buffer + 1, pData, length); _buf.returnCharUUID = pRemoteCharacteristic->getUUID().getNative()->u16.value;
MI32.conCtx->returnCharUUID = pRemoteCharacteristic->getUUID().getNative()->u16.value; MI32NotificationQueue.push(_buf);
MI32.conCtx->operation = 103; MI32.mode.readingDone = 1;
MI32.mode.triggerBerryConnCB = 1; MI32.mode.triggerBerryConnCB = 1;
MI32.mode.readingDone = 1; MI32.infoMsg = MI32_GOT_NOTIFICATION;
} return; // do not discard data
}
} }
/*********************************************************************************************\ /*********************************************************************************************\
* Helper functions * Helper functions
@ -699,10 +702,11 @@ extern "C" {
AddLog(LOG_LEVEL_INFO,PSTR("M32: Connection Ctx created")); AddLog(LOG_LEVEL_INFO,PSTR("M32: Connection Ctx created"));
} }
bool MI32setBerryCtxSvc(const char *Svc){ bool MI32setBerryCtxSvc(const char *Svc, bool discoverAttributes){
if(MI32.conCtx != nullptr){ if(MI32.conCtx != nullptr){
MI32.conCtx->serviceUUID = NimBLEUUID(Svc); MI32.conCtx->serviceUUID = NimBLEUUID(Svc);
AddLog(LOG_LEVEL_DEBUG,PSTR("M32: SVC: %s"),MI32.conCtx->serviceUUID.toString().c_str()); AddLog(LOG_LEVEL_DEBUG,PSTR("M32: SVC: %s"),MI32.conCtx->serviceUUID.toString().c_str());
MI32.mode.discoverAttributes = discoverAttributes;
return true; return true;
} }
return false; return false;
@ -1141,6 +1145,7 @@ bool MI32ConnectActiveSensor(){ // only use inside a task !!
bool MI32StartConnectionTask(){ bool MI32StartConnectionTask(){
if(MI32.conCtx == nullptr) return false; if(MI32.conCtx == nullptr) return false;
if(MI32.conCtx->buffer == nullptr) return false; if(MI32.conCtx->buffer == nullptr) return false;
MI32NotificationQueue = {};
MI32.mode.willConnect = 1; MI32.mode.willConnect = 1;
MI32Scan->stop(); MI32Scan->stop();
MI32suspendScanTask(); MI32suspendScanTask();
@ -1178,7 +1183,9 @@ void MI32ConnectionTask(void *pvParameters){
timer++; timer++;
vTaskDelay(10/ portTICK_PERIOD_MS); vTaskDelay(10/ portTICK_PERIOD_MS);
} }
MI32Client->discoverAttributes(); // solves connection problems on i.e. yeelight dimmer if(MI32.mode.discoverAttributes){
MI32Client->discoverAttributes(); // solves connection problems on i.e. yeelight dimmer
}
NimBLERemoteService* pSvc = nullptr; NimBLERemoteService* pSvc = nullptr;
NimBLERemoteCharacteristic* pChr = nullptr; NimBLERemoteCharacteristic* pChr = nullptr;
@ -1672,7 +1679,15 @@ void MI32Every50mSecond(){
} }
MI32.mode.triggerBerryAdvCB = 0; MI32.mode.triggerBerryAdvCB = 0;
} }
if(MI32.mode.triggerBerryConnCB == 1){ if(MI32.mode.triggerBerryConnCB || !MI32NotificationQueue.empty()){
if(!MI32NotificationQueue.empty()){
MI32notificationBuffer_t _buf = MI32NotificationQueue.front();
MI32NotificationQueue.pop();
memcpy(MI32.conCtx->buffer,_buf.buffer,_buf.buffer[0]+1);
MI32.conCtx->returnCharUUID = _buf.returnCharUUID;
MI32.conCtx->operation = 103;
MI32.conCtx->error = 0;
}
if(MI32.beConnCB != nullptr){ if(MI32.beConnCB != nullptr){
void (*func_ptr)(int, int, int) = (void (*)(int, int, int))MI32.beConnCB; void (*func_ptr)(int, int, int) = (void (*)(int, int, int))MI32.beConnCB;
char _message[32]; char _message[32];