Убедительная просьба для всех. Загружайте пожалуйста фотографии в нашу фотогалерею по адресу http://rhbz.pw У кого нет учетной записи - отпишитесь в этой теме ЗДЕСЬ либо в ЛС к BON'у
Maniak003
Отправлено: 22 Ноября, 2021 - 17:55:37
Прописавшийся на форуме
Off-line
Сообщений всего: 339
Дата рег-ции: Янв. 2021 Откуда: СПб, Россия
Репутация: 20
Nikita71 пишет:
а вы раньше не работали с этой программой ?
С этой нет, не работал. Использую Serial bluetooth terminal, он показывает все доступные сервисы и характеристики и позволяет обмениваться с устройством, выбрав то, что нужно.
Я правда так и не понял: Вам удалось передать данные из приложения на esp32 ?
Пока сделал только передачу 1-го порога мощности и самой дозы. По хорошему надо еще сделать передачу данных о состоянии ползунка звука и вибро, ну и кнопку сброс дозы не плохо было бы сделать ... но я так и не раздуплился как это сделать )
Maniak003
Отправлено: 24 Ноября, 2021 - 10:10:49
Прописавшийся на форуме
Off-line
Сообщений всего: 339
Дата рег-ции: Янв. 2021 Откуда: СПб, Россия
Репутация: 20
[перфекционизм]
CODE:
union {
float val[2];
uint8_t b[8];
} float_bytes_u;
Тогда в float_bytes_u.val[0], будет DoseThreshold / 100, а в float_bytes_u.val[1] -- RadThreshold / 100.
Т.е. отдельную функцию создавать не нужно, а просто использовать публичные переменные float_bytes_u.val[{0,1}], вместо DoseThreshold и RadThreshold.
Идея в том, что работа со стеком - это самые дорогие операции и нужно стараться избегать использовать подпрограмм если есть возможность. Ну, это так, мысли в слух...
[/перфекционизм]
Nikita71
Отправлено: 24 Ноября, 2021 - 10:43:24
Частый гость
Off-line
Сообщений всего: 95
Дата рег-ции: Сент. 2020 Откуда: Україна Київ
Репутация: 2
Maniak003 пишет:
избегать использовать подпрограмм если есть возможность
а какая причина ? просто достаточно удобно использовать тот костыль))
Maniak003
Отправлено: 24 Ноября, 2021 - 11:02:46
Прописавшийся на форуме
Off-line
Сообщений всего: 339
Дата рег-ции: Янв. 2021 Откуда: СПб, Россия
Репутация: 20
Nikita71 пишет:
а какая причина ?
union -- обозначает использование одной области памяти для нескольких типов переменных, фактически -- это объявление переменной. По этому нет необходимости дублировать эту переменную. Вы можете в этой области хранить конечные значения и не перегружать их в другие переменные. Цикл с передачей значений так же не нужен, поскольку в union могут хранится массивы и в этом случае мы сразу получим ieee754 преобразование для всех float значений массива, перегрузив лиш один указатель на uint32_t.
Я хочу сказать, что нет предела совершенству, то как Вы сделали, отлично будет работать. Просто решил поделиться, как можно немного упростить код выполняемый на контроллере.
(добавил)
Ой, ошбся, в случае с массивом из двух float, речь конечно же идет о uint64_t
CODE:
union {
uint64_t word;
uint8_t bytes[8];
float flt[2];
} var;
Off-line
Сообщений всего: 339
Дата рег-ции: Янв. 2021 Откуда: СПб, Россия
Репутация: 20
Например так:
CODE:
union {
float val[2];
uint8_t b[8];
} float_bytes_u;
class MyCallbacks: public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *SettingsCharacteristics) {
std::string rxValue = SettingsCharacteristics->getValue();
uint8_t pData [10];
for (int i = 0; i < 8; i++) {
float_bytes_u.b[i] = rxValue[i];
}
ReturnData = 1;
/* Окончательные значения */
float_bytes_u.val[0] = float_bytes_u.val[0] * 100;
float_bytes_u.val[1] = float_bytes_u.val[1] * 100;
}
};
С uint64_t, думаю уже догадались как сделать.
SuperCellSky
Отправлено: 26 Ноября, 2021 - 16:06:17
Super Member
Off-line
Сообщений всего: 592
Дата рег-ции: Март 2020 Откуда: Улан-Удэ, Россия
Репутация: 8
Никогда не понимал зачем вообще нужен union: какого типа данные в него записали - не определить, а функционал выше спокойно реализуется преобразованием типа указателя.
Maniak003
Отправлено: 26 Ноября, 2021 - 16:47:27
Прописавшийся на форуме
Off-line
Сообщений всего: 339
Дата рег-ции: Янв. 2021 Откуда: СПб, Россия
Репутация: 20
SuperCellSky пишет:
спокойно реализуется преобразованием типа указателя.
А в чем выигрываем ?
CODE:
int main() {
union {
float flt;
uint8_t bytes[4];
} var;
Добавлена обработка нажатий кнопки сброса дозы. Если будет время и вдохновение постараюсь наконец-то зделать обрабатку нажатий всех кнопок, благо проблема устаревшей документации решена ...
За помощь огромное спасибо Maniak003 и Madmax.
Maniak003
Отправлено: 24 Января, 2022 - 16:29:56
Прописавшийся на форуме
Off-line
Сообщений всего: 339
Дата рег-ции: Янв. 2021 Откуда: СПб, Россия
Репутация: 20
Nikita71 пишет:
void loop() {
<skip>
delay(1000);
}
Старайтесь, по возможности, не использовать задержки.
Nikita71
Отправлено: 24 Января, 2022 - 17:07:14
Частый гость
Off-line
Сообщений всего: 95
Дата рег-ции: Сент. 2020 Откуда: Україна Київ
Репутация: 2
Maniak003 пишет:
Старайтесь, по возможности, не использовать задержки.
Таа... это больше для чистоты восприятия.. В финале чувствую будет еще тот взрыв на макаронной фабрике ...
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
Похожие темы: ProtonBridge2(ESP32) или используем приложение AtomSwift в самодельном дозиметре на esp32