Уважаемые посетители сайта esp8266.ru!
Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram
Примерно... к ATC накапливались 3 года и тянуть всю совместимость нет смысла.
Данные уже все считываются и разбираются в логе. Хотя-бы команды "55"- конфиг BLE и "25" для сенсора.
Посмотрите код функции llProcessTxData0. Кажется, это то, что нужно. Она после обработки пакета вызывает HCI_NumOfCompletedPacketsEvent, который генерирует HCI_NUM_OF_COMPLETED_PACKETS_EVENT_CODE. И ещё есть переменные: 0x1fff091d D numComplPkts 0x1fff091e D numComplPktsLimit
Я не буду формировать, шифровать и т.д. сами пакеты с учетом всего на свете.
Пока используется штатная Notify и прочие стандартные...
Цепочка вложений примерно такая:
ATT_HandleValueNoti
attSendMsg
L2CAP_SendData
l2capEncapSendData
L2CAP_SendDataPkt or l2capSegmentBuffToLinkLayer or ...
далее только по первой ветке: osal_msg_send и это ушло в ROM.
Никаких калбаков и прочего по этому пути нет.... (иначе бы не спрашивал )
и далее все фрагменты разгребает LL_ProcessEvent task
while ( llWriteTxData() == OK) osal_bm_free(); HCI_NumOfCompletedPacketsEvent(, numCompletedPackets)
Т.е. при попытке отправки получаем SUCCESS, либо ошибку HCI_ERROR_CODE_MEM_CAP_EXCEEDED, значит ничего не отправлено, предыдущие сегменты ещё стоят в очереди.
А чтобы получить уведомление, о том что пакеты отправлены, нужно подменить функцию HCI_ProcessEvent() в jump_table,. В ней можно проверить l2capSegmentPkt[connHandle].fragment==TRUE и послать уведомление наверх, например, вызвать osal_msg_send(). Текущая функция в rom, типа такого, что тупо гасит все эвенты:
C:
uint16 HCI_ProcessEvent( uint8 taskId, uint16 events )
{
hciPacket_t* pMsg;
if ( events & SYS_EVENT_MSG )
{
while (pMsg = (hciPacket_t*) osal_msg_receive( hciTaskID ) )
{
if (pMsg != 0) {
if ((hdr.event == HCI_HOST_TO_CTRL_DATA_EVENT) ||
(hdr.event == HCI_CTRL_TO_HOST_EVENT)) {
osal_bm_free(pMsg->pData);
}
osal_msg_deallocate(pMsg);
}
// return unprocessed events
return (events ^ SYS_EVENT_MSG);
}
// If reach here, the events are unknown
// Discard or make more handlers
return 0;
}
Я это знаю.
Дело в другом.
Есть два варианта при отсылке.
1. Циклически проверяем пуст ли буфер передачи и если пуст - пихаем следующие данные
2. Пихаем данные, по clallback отправки следующие.
В SDK нет ни первого ни второго варианта, т.к. нет вызова пользовательской функции когда драйвер BLE не занят. Когда он не занят - чип переключается в сон.
А когда активен и завершил работу - нет вызова пользовательской функции.
Есть только таймер или osal_msg_send.
Но таймер пользовать = лишнее просыпание -> повышения потребления на значительные % ради опроса какой фигни.
В power менеджере есть установка своих функций просыпания и засыпания. Но они не годятся, т.к. не дают информации о работе других процедур и при их вызове не все инициализировано.
Вместо таймера желательно весь функционал синхронизовать с BLE таймингом, чтобы не пробуждать чип понапрасну.
Т.е. лучше использовать проверку времени назначенного события когда чип уже пробужден для работы с BLE таймингом.
Нужна некая функция, которая будет вызываться когда BLE события отработали и дальше процесс идет к засыпанию...
Пока не знаю - подойдет ли вариант в power менеджере вызова при засыпании, не вызовет ли он каких коллизий в функциях BLE.
И он тоже плох, т.к. приведет к пересчету времени до следующего просыпания. Лишняя обработка -> больше жручка питания.
Нету callback у Notify, и нету никакого подтверждения по передаче Notify в данном SDK.
Сделал как в примере ble_uart + мелочи.
Вышло чтение 4096 memo за 43 sec [блок memo = 13 bytes] -> 1238 bytes/s. Для 30 ms connection interval - нормально.
Работает в Windows и Android. В Linux даже пробовать не хочу...
Linux я использую только в терминале или в wsl для сборки чего в командной строке...
И надо исправить ошибки в HTML. Там дублируется что-то и каждое новое открытие файла добавляет функцию чтения файла и открывает 2,3,4,5,6... раз
И надо как-то убить кеш файла в эксплорере. Иначе новый, с прошлым именем файл не грузит. Считает это тем-же файлом и не обновляет.
При сканировании, если уже было подключение, кнопка отмена в списке BT не работает - соединяет с прошлым...
И надо всплывающее описание к настройкам, хотя оно не вылезает в Android. И единицы измерения. Внутри подписал...
Так-же проверить загрузку файла по url. По умолчанию должен работать, если впихнуть в строку открытия файла... Но там кто-то чего-то дописал и я не проверял.
Да извинят меня благородные доны за вмешательство в их приватный диалог))
Несколько раз смотрел посты этого сабжа и теперь вижу, что название констант и функций, что вы упоминаете очень похожи на то, что есть в TI sdk в исходниках CCS, точнее - это один в один TI.