• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

BLE SoC PHY6202

pvvx

Активный участник сообщества
Примерно... к ATC накапливались 3 года и тянуть всю совместимость нет смысла.
Данные уже все считываются и разбираются в логе. Хотя-бы команды "55"- конфиг BLE и "25" для сенсора.
 

pvvx

Активный участник сообщества
Посмотрите код функции 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.
Никаких калбаков и прочего по этому пути нет.... (иначе бы не спрашивал :) )
 

pvvx

Активный участник сообщества
Итак уже пару уровней китай-кода-наслоений скинул...
 

cool2000

Member
L2CAP_SendDataPkt or l2capSegmentBuffToLinkLayer or ...
Итак уже пару уровней китай-кода-наслоений скинул...
А дальше цепочка разворачивается так:
  • l2capEncapSendData() => L2CAP_SendDataPkt() / l2capPktToSegmentBuff()
  • L2CAP_SendDataPkt() вызывается для loopback, можно дальше не смотреть ...
  • l2capSegmentPkt[connHandle].fragment==FALSE ? l2capPktToSegmentBuff(); l2capSegmentBuffToLinkLayer() : HCI_ERROR_CODE_MEM_CAP_EXCEEDED
  • l2capSegmentBuffToLinkLayer() => L2CAP_Fragment_SendDataPkt() => HCI_SendDataPkt() => LL_TxData()
  • LL_TxData() => llEnqueueDataQ(); llProcessTxData() => llWriteTxData()
  • и далее все фрагменты разгребает 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;
}
pvvx написал(а):
osal_msg_send и это ушло в ROM.
osal_msg_send() это разновидность callback-а в заданную задачу.
 

pvvx

Активный участник сообщества
osal_msg_send() это разновидность callback-а в заданную задачу.
Я это знаю.
Дело в другом.
Есть два варианта при отсылке.
1. Циклически проверяем пуст ли буфер передачи и если пуст - пихаем следующие данные
2. Пихаем данные, по clallback отправки следующие.

В SDK нет ни первого ни второго варианта, т.к. нет вызова пользовательской функции когда драйвер BLE не занят. Когда он не занят - чип переключается в сон.
А когда активен и завершил работу - нет вызова пользовательской функции.
Есть только таймер или osal_msg_send.
Но таймер пользовать = лишнее просыпание -> повышения потребления на значительные % ради опроса какой фигни.
 

pvvx

Активный участник сообщества
В power менеджере есть установка своих функций просыпания и засыпания. Но они не годятся, т.к. не дают информации о работе других процедур и при их вызове не все инициализировано.
Вместо таймера желательно весь функционал синхронизовать с BLE таймингом, чтобы не пробуждать чип понапрасну.
Т.е. лучше использовать проверку времени назначенного события когда чип уже пробужден для работы с BLE таймингом.
Нужна некая функция, которая будет вызываться когда BLE события отработали и дальше процесс идет к засыпанию...
Пока не знаю - подойдет ли вариант в power менеджере вызова при засыпании, не вызовет ли он каких коллизий в функциях BLE.
И он тоже плох, т.к. приведет к пересчету времени до следующего просыпания. Лишняя обработка -> больше жручка питания.
 

pvvx

Активный участник сообщества
Нету callback у Notify, и нету никакого подтверждения по передаче Notify в данном SDK.
Сделал как в примере ble_uart + мелочи.
Вышло чтение 4096 memo за 43 sec [блок memo = 13 bytes] -> 1238 bytes/s. Для 30 ms connection interval - нормально.
 

pvvx

Активный участник сообщества
1706365403729.png
В Boot-OTA не будет истории. Только в версии OTA (или поставить флаг сервиса SERVICE_HISTORY в конфигурацию для Boot).
 

pvvx

Активный участник сообщества
Чтобы в Android автономно работал при копировании *.html, тогда в файл *.thml надо запихнуть всё - *.css и *.js
 

cool2000

Member
Чтобы в Android автономно работал при копировании *.html, тогда в файл *.thml надо запихнуть всё - *.css и *.js
BLE API работает с html из localhost? Мне пришлось ставить самоподписанный сертификат, чтобы заработало с сервера в локальной сети.
 

pvvx

Активный участник сообщества
BLE API работает с html из localhost? Мне пришлось ставить самоподписанный сертификат, чтобы заработало с сервера в локальной сети.
Работает в Windows и Android. В Linux даже пробовать не хочу...
Linux я использую только в терминале или в wsl для сборки чего в командной строке...

И надо исправить ошибки в HTML. Там дублируется что-то и каждое новое открытие файла добавляет функцию чтения файла и открывает 2,3,4,5,6... раз :)
И надо как-то убить кеш файла в эксплорере. Иначе новый, с прошлым именем файл не грузит. Считает это тем-же файлом и не обновляет.
При сканировании, если уже было подключение, кнопка отмена в списке BT не работает - соединяет с прошлым...
 

pvvx

Активный участник сообщества
И надо всплывающее описание к настройкам, хотя оно не вылезает в Android. И единицы измерения. Внутри подписал...
Так-же проверить загрузку файла по url. По умолчанию должен работать, если впихнуть в строку открытия файла... Но там кто-то чего-то дописал и я не проверял.
 

pvvx

Активный участник сообщества
Время встроенного RC 32768 Гц спешит на 11 секунд за 20 минут...
 

sL0n1k

Member
Да извинят меня благородные доны за вмешательство в их приватный диалог))

Несколько раз смотрел посты этого сабжа и теперь вижу, что название констант и функций, что вы упоминаете очень похожи на то, что есть в TI sdk в исходниках CCS, точнее - это один в один TI.

Это что какой-то клон TI?
 
Сверху Снизу