Примерно... к 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.