Пришло то, на что вы послали запрос.
Дык и я о чем. Если я все правильно понял, await-async нам никак не поможет определить адресата сообщения, так как ответ не дается немедленно как результат функции Write или Read. Он приходит "сильно потом", когда чип на шине обработает ваш запрос и сформирует ответное сообщение. Примерно такая-же фигня происходит в шлюзах платежных систем PayPal или Yandex. Тамошние ребята борются с ней формируя ID трансакции, возвращая его при вызове функции "Write" и затем включая его в тело "отложенного" ответа. Как я понял у нас в прошивке ничего подобного нет и поэтому определять адресата сообщения можно только косвенно по
ds ибо idx(который всегда равен
0x0C).
Как я понял, в первоначальной задумке стандарта ble устройство должно плодить сами
characteristic, следуя правилу одна характеристика == одна функция. Хочешь получать от чипа DateTime - сделай специальную характеристику, хочешь получать от него еще и температуру - сделай еще одну характеристику. И плевать что и чип и девайс один и тот-же.
Но мы то ведь похоже так не можем ибо:
JavaScript:
this.log('Service found, getting characteristic...');
return service.getCharacteristic(0xffe1);
Постоянное применение loop() тут и сказывается. Если вы так обречены на loop(), то стройте Машину Тьюринга.
loop (впрочем как и setup) вызывается из недр обработчика.
characteristic.addEventListener('characteristicvaluechanged', this);
То есть это просто название, сам код ваш, он просто по другому отформатирован
Вот так выглядит этот обработчик (если что блоки кода свернуты, чтобы все влезло в один скриншот, номера строк ble.js слева)
По приходу нового "characteristic value", библиотека сначала проверяет его на соответствие известных ей комбинаций idx и ds. Тех комбинаций, что отвечают за ошибки, инициализацию I2c шины, настройку ее скорости etc. Стандартные запросы она обрабатывает самостоятельно, для обработки ошибок вызывает сначал disconnect, а затем onerror. По приходу _ответа_ корректной инициализации i2с шины (idx==0x01, ds>=38) вызывает onsetup , во всех остальных случаях вызывается onloop. Правильнее было бы наверно вызывать его только при
idx==
0x0C, а все остальное отправлять в обработчик а-ла
onUnknownCmd() это так только сейчас в голову пришло...
ps: Упреждая ваш вопрос, если вам не хватает доступа к какому-либо фрагменту событий, никто не мешает в любом нужном вам месте обработчика воткнуть вызов некоего гипотетического
if(onMyEvent) onMyEvent(event);
прописать его в конструкторе Ble
JavaScript:
constructor(params) {
this._log = params.log;
this.onloop = params.onloop;
this.onerror = params.onerror;
this.onsetup = params.onsetup;
this.onMyEvent = params.onMyEvent;
}
и обработать его во внешнем коде.
JavaScript:
ble = new Ble({log,
onMyEvent: (event) =>{},
onerror: (e,info)=>{ ...