• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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?
 
Сверху Снизу