several bugfixes

This commit is contained in:
Staars 2022-04-07 17:53:01 +02:00
parent a65e6ac0b0
commit 28010a0d73
1 changed files with 31 additions and 28 deletions

View File

@ -666,7 +666,7 @@ extern "C" {
MI32.conCtx->operation = operation%10; MI32.conCtx->operation = operation%10;
MI32.conCtx->response = response; MI32.conCtx->response = response;
AddLog(LOG_LEVEL_DEBUG,PSTR("M32: Berry connection op: %d, addrType: %d, oneOp: %u, response: %u"),MI32.conCtx->operation, MI32.conCtx->addrType, MI32.conCtx->oneOp, MI32.conCtx->response); AddLog(LOG_LEVEL_DEBUG,PSTR("M32: Berry connection op: %d, addrType: %d, oneOp: %u, response: %u"),MI32.conCtx->operation, MI32.conCtx->addrType, MI32.conCtx->oneOp, MI32.conCtx->response);
if(MI32.conCtx->oneOp || MI32.conCtx->operation == 5){ //...or disconnect is requested if(MI32.conCtx->oneOp){
MI32StartConnectionTask(); MI32StartConnectionTask();
} }
else{ else{
@ -1087,6 +1087,9 @@ void MI32ScanTask(void *pvParameters){
} }
bool MI32ConnectActiveSensor(){ // only use inside a task !! bool MI32ConnectActiveSensor(){ // only use inside a task !!
if(MI32.conCtx->operation == 5) {
return false;
}
NimBLEAddress _address = NimBLEAddress(MI32.conCtx->MAC, MI32.conCtx->addrType); NimBLEAddress _address = NimBLEAddress(MI32.conCtx->MAC, MI32.conCtx->addrType);
if(MI32Client != nullptr){ if(MI32Client != nullptr){
if(MI32Client->isConnected() && MI32.mode.connected == 1){ //we only accept a "clean" state without obvious packet losses if(MI32Client->isConnected() && MI32.mode.connected == 1){ //we only accept a "clean" state without obvious packet losses
@ -1114,7 +1117,6 @@ bool MI32ConnectActiveSensor(){ // only use inside a task !!
MI32Client->setClientCallbacks(&MI32SensorCB , false); MI32Client->setClientCallbacks(&MI32SensorCB , false);
} }
if (!MI32Client->connect(false)) { if (!MI32Client->connect(false)) {
MI32.mode.willConnect = 0;
NimBLEDevice::deleteClient(MI32Client); NimBLEDevice::deleteClient(MI32Client);
// AddLog(LOG_LEVEL_ERROR,PSTR("M32: did not connect client")); // AddLog(LOG_LEVEL_ERROR,PSTR("M32: did not connect client"));
return false; return false;
@ -1140,8 +1142,10 @@ bool MI32StartConnectionTask(){
} }
void MI32ConnectionTask(void *pvParameters){ void MI32ConnectionTask(void *pvParameters){
#if !defined(CONFIG_IDF_TARGET_ESP32C3) //needs more testing ...
NimBLEDevice::setOwnAddrType(BLE_OWN_ADDR_RANDOM,false); //seems to be important for i.e. xbox controller, hopefully not breaking other things NimBLEDevice::setOwnAddrType(BLE_OWN_ADDR_RANDOM,false); //seems to be important for i.e. xbox controller, hopefully not breaking other things
NimBLEDevice::setSecurityAuth(true, true, true); NimBLEDevice::setSecurityAuth(true, true, true);
#endif //CONFIG_IDF_TARGET_ESP32C3
MI32.conCtx->error = MI32_CONN_NO_ERROR; MI32.conCtx->error = MI32_CONN_NO_ERROR;
if (MI32ConnectActiveSensor()){ if (MI32ConnectActiveSensor()){
MI32.mode.readingDone = 0; MI32.mode.readingDone = 0;
@ -1176,9 +1180,13 @@ void MI32ConnectionTask(void *pvParameters){
} }
// AddLog(LOG_LEVEL_INFO,PSTR("M32: wait ...")); // AddLog(LOG_LEVEL_INFO,PSTR("M32: wait ..."));
} }
// AddLog(LOG_LEVEL_INFO,PSTR("M32: really start connection job now ..."));
MI32.mode.triggerNextConnJob = 0; MI32.mode.triggerNextConnJob = 0;
MI32.mode.readyForNextConnJob = 0; MI32.mode.readyForNextConnJob = 0;
if(MI32.conCtx->operation == 5){
MI32Client->disconnect();
break;
}
pSvc = MI32Client->getService(MI32.conCtx->serviceUUID); pSvc = MI32Client->getService(MI32.conCtx->serviceUUID);
if(pSvc) { if(pSvc) {
pChr = pSvc->getCharacteristic(MI32.conCtx->charUUID); pChr = pSvc->getCharacteristic(MI32.conCtx->charUUID);
@ -1199,9 +1207,9 @@ void MI32ConnectionTask(void *pvParameters){
} }
break; break;
case 2: case 2:
if(pChr->canWrite()) { if(pChr->canWrite() || pChr->canWriteNoResponse()) {
uint8_t len = MI32.conCtx->buffer[0]; uint8_t len = MI32.conCtx->buffer[0];
if(pChr->writeValue(MI32.conCtx->buffer + 1,len,MI32.conCtx->response)) { // true is important ! if(pChr->writeValue(MI32.conCtx->buffer + 1,len,MI32.conCtx->response & !pChr->canWriteNoResponse())) { // falls always back to "no response" if server provides both options
// AddLog(LOG_LEVEL_DEBUG,PSTR("M32: write op done")); // AddLog(LOG_LEVEL_DEBUG,PSTR("M32: write op done"));
} }
else{ else{
@ -1228,28 +1236,28 @@ void MI32ConnectionTask(void *pvParameters){
} }
} }
else{ else{
MI32.conCtx->error = MI32_CONN_NO_CHARACTERISTIC; MI32.conCtx->error = MI32_CONN_NO_CHARACTERISTIC;
} }
timer = 0; timer = 0;
while (timer<150){ if(MI32.conCtx->error == MI32_CONN_NO_ERROR){
if (MI32.mode.readingDone || !MI32.conCtx->oneOp){ while (timer<150){
break; if (MI32.mode.readingDone || !MI32.conCtx->oneOp){
} break;
else{ }
if (MI32.conCtx->operation==3 && MI32.conCtx->oneOp) { else if (timer>148){
MI32.conCtx->error = MI32_CONN_NOTIFY_TIMEOUT; //did not read on notify - timeout only for one-shot op if (MI32.conCtx->operation==3 && MI32.conCtx->oneOp) {
MI32.conCtx->error = MI32_CONN_NOTIFY_TIMEOUT; //did not read on notify - timeout only for one-shot op
}
}
timer++;
vTaskDelay(100/ portTICK_PERIOD_MS);
} }
} }
timer++;
vTaskDelay(100/ portTICK_PERIOD_MS);
}
MI32.mode.readingDone = 0; MI32.mode.readingDone = 0;
if(MI32.conCtx->oneOp){ if(MI32.conCtx->oneOp){
MI32Client->disconnect(); MI32Client->disconnect();
MI32.mode.connected = 0;
keepConnectionAlive = false; keepConnectionAlive = false;
MI32StartTask(MI32_TASK_SCAN);
} }
else{ else{
MI32.mode.readyForNextConnJob = 1; MI32.mode.readyForNextConnJob = 1;
@ -1258,15 +1266,10 @@ void MI32ConnectionTask(void *pvParameters){
} }
} }
else{ else{
if(MI32.conCtx->operation==5){ MI32.mode.willConnect = 0;
MI32.conCtx->error = MI32_CONN_DID_DISCCONNECT; // did succesfully disconnect MI32.conCtx->error = MI32_CONN_NO_CONNECT; // could not connect (including op:5 in not connected state)
}
else{
MI32.conCtx->error = MI32_CONN_NO_CONNECT; // could not connect
}
MI32.mode.connected = 0;
MI32StartTask(MI32_TASK_SCAN);
} }
MI32.mode.connected = 0;
MI32.mode.triggerBerryConnCB = 1; MI32.mode.triggerBerryConnCB = 1;
MI32StartTask(MI32_TASK_SCAN); MI32StartTask(MI32_TASK_SCAN);
vTaskDelete( NULL ); vTaskDelete( NULL );
@ -1660,9 +1663,9 @@ void MI32Every50mSecond(){
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];
GetTextIndexed(_message, sizeof(_message), MI32.conCtx->error, kMI32_ConnErrorMsg); GetTextIndexed(_message, sizeof(_message), MI32.conCtx->error, kMI32_ConnErrorMsg);
AddLog(LOG_LEVEL_DEBUG,PSTR("M32: %s"),_message); AddLog(LOG_LEVEL_DEBUG,PSTR("M32: BryCbMsg: %s"),_message);
func_ptr(MI32.conCtx->error, MI32.conCtx->operation , MI32.conCtx->returnCharUUID); func_ptr(MI32.conCtx->error, MI32.conCtx->operation , MI32.conCtx->returnCharUUID);
} }
MI32.mode.triggerBerryConnCB = 0; MI32.mode.triggerBerryConnCB = 0;
} }
if(MI32.infoMsg > 0){ if(MI32.infoMsg > 0){