Feed

Задачки в очереди

мобильный layout в мемексе
двухколоночный flexbox-layout в мемексе
nav-tree в мемексе
Навигация в мемексе
telegram-bot-cpp-asio
LED card shop
POE AP
Remote Controller
Mobile ORB-SLAM2

2022/01/10 00:13 · m

Дневничок

В формате таймшитов. Чтобы у меня не создавалось ощущения, что ни хера не делаю.

Sun, Jan 23, 2022

Начал делать telegram-bot-cpp-boost. Сразу возник вопрос, как завершить приложение по сигналу. Можно использовать встроенный в asio обработчик сигналов. В этом случае asio принимает сигнал на себя, а потом уже в пуле потоков вызвает пользовательский обработчик сигналов, и в нем можно вызвать io_service::stop. Но что делать, если я хочу дать пользователям возможность использовать бота как встраиваемую библиотеку? Я не хочу перехватывать их сигналы, а хочу дать им возможность остановить работу бота через вызов Bot::Stop. Интересный нюанс при этом, как избежать искуственной задержки между получением сигнала и выходом. Задержка возникает, если, например, есть busy loop, в котором проверяется, выставил ли обработчик сигнала флаг, и если да, то вызывается Stop. Чтобы цикл не ел 100% cpu, ставится искусственная задержка, скажем this_thread::sleep(200ms). Один из способов есть в примере к бусту, boost_asio/example/http/server/posix_main.cpp. Но тут целый поток тратится на что, чтобы сделать sigwait. Смотрю исходники буста, хочу понять, как сделать ф-ю Stop async-signal-safe согласно posix.

Код обработчика сигналов в asio в случае posix:

void boost_asio_signal_handler(int signal_number)
{
  int saved_errno = errno;
  signal_state* state = get_signal_state();
  signed_size_type result = ::write(state->write_descriptor_,
      &signal_number, sizeof(signal_number));
  (void)result;
  errno = saved_errno;
}

Mon, Jan 17, 2022

Начал читать `Anthony Williams, C++ Concurrency in Action`. Хочется уложиться в две недели.

Сайты libgen.*** это не зеркала одной и той же базы. На форумах можно найти историю того, как создавался проект и как распадался, какие базы поглощались. Сейчас это независимые базы данных с независимыми движками, имеющими общее прошлое. Если книги нет на одном из сайтов, поищите в гугле другие активные домены, на них книга, вероятно, будет.

Sun, Jan 16, 2022

Ближе к концу `Torjo, Boost.Asio` есть пример того, как выносить свои кастомные задачи в отдельный поток так, чтобы коллбеки приходили в общий пул потоков io_service. Так можно реализовать вычислительное ядро с асинхронной доставкой результата (при этом эти задачи могут быть не связаны с вводом-выводом). Еще есть параграф про корутины, но тут это скорее просто для красоты, я не буду использовать.

В мемексе теперь нормально открываются разделы в левой панели. Похожая навигация есть в readthedocs и на docs.oracle.com.

Sat, Jan 15, 2022

Сходили на скалодром. Все бывшие коллеги по лидарной команде, программисты и схемотехники. Надо бы потом конструкторов тоже подключить. Подсказали мне по поводу датчиков ближнего действия, я про них знал и даже в руках держал, но сейчас сам бы не догадался их использовать. Дочитал книжку про boost::asio.

Wed, Jan 12 - Fri, Jan 14, 2022

Езжу на м.Нагатинская, собираем роботов на гусеничном шасси. Добираться значительно удобнее, чем в гараж беспилотников. NDA не подписывал, но подробности рассказывать не буду. Пока все знакомо, вычислитель, 16-ти лучевой лидар, софт. Где-то надо будет сделать приватный раздел вики и в нем описывать подводные камни используемых готовых компонентов (дублировать то, что я пишу в корпоративной вики).

Tue, Jan 11, 2022

Сходил в робототехнический стартап. Тут нет менеджеров и есть большие роботы. Приглашают без лишних вопросов, но даунгрейд по зарплате 80 тысяч. Согласился.

Я рассчитывал, что будут спрашивать по ROS (который Robot, а не Router), поэтому заранее немного прикинул, какие есть интересные вопросы именно про ros (ros1, про ros2 я не знаю). Вот они.

1/ В ros есть механизм получения и отправки сообощений. Сообщения приходят в виде асинхронных вызовов коллбек-функций. Но таким способом приходят только сообщения от других рос-нод. Если же надо получить сетевой пакет, например от лидара, или других датчиков, которые не имеют отношения к ros инфраструктуре, то нужно использовать либо POSIX вызовы, либо какие-то библиотеки вроде boost::asio. Вопрос, как правильно совместить эти системы. Например, как лучше встроить асинхронные вызовы ros функций в очередь коллбеков asio::io_context.

2.1/ В ros есть инструмент инструмент запуска процессов, roslaunch. Это кусок кода на питоне. Расскажите, как работает запуск и остановка процессов. Если завершить процессы через roslaunch, почему некоторые процессы могут остаться запущенными, и чем это грозит (если мы запускаем на одной машине или сразу на нескольких). Ответ такой, что там в питоне в цикле перебирается список процессов и последовательно им посылаются сигналы SIGINT, потом с задержкой SIGKILL. Если каке-то процессы перехватывают SIGINT в пользовательском коде и не выходят в ответ, то они зависнут до получения SIGKILL. Если roslaunch остановить раньше этого, то процессы останутся в памяти. Еще может потеряться связь с удаленным хостом и на нем процессы не завершатся. Еще были какие-то проблемы, но я уже не помню. Чтобы такие процессы не оставались в памяти нужно использовать механизмы, которые используются в докере и systemd, это cgroups и namespaces. (Надо про них кстати прочитать подробнее).

2.2/ Как в ros1 через roslaunch запустить ноды в определенном порядке и остановить их в обратном порядке? Возможно ли это для любых нод или только для определенной группы? Ответ такой, что только для нод из группы roscore есть гарантия, что они запустятся раньше обычных нод и остановятся позже них.

Mon, Jan 10, 2022

Читаю `John Torjo, Boost.Asio C++ Network Programming`. Не знал про существование в asio ф-й обработки POSIX сигналов. Не знал про рекомендацию использовать несколько io_service на общем endpoint при нагрузке от 1000 одновременных клиентов.

Sun, Jan 9, 2022

Почитал статьи и stackoverflow про возможные ошибки при декодировании h264 в chrome. Очень помогла статья про отладку программы srtplite (см раздел webrtc). Сохранил трафик с камер hikvision и xiaofang, перехватывал через tcpdump и wireshark на сервере (до попадания в janus gateway) и на компьютере. Смотрел в wireshark. Для распознавания RTP трафика в wireshark нужно включить подвиды этого протокола в меню analyze→enabled protocols. Пакеты от камер xiaofang отличались тем, что были больше 1520 байт и отображались как Fragmented. Еще увидел, что marked bit не устанавливается в конце последнего пакета keyframe, хотя метка времени меняется. Еще метка времени и метка последовательности не совпадают до janus и после него. Написал временный код в плагине janus, который проставляет marked bit. Нашел мои старые исходники rtsp_streamer для xiaofang(snx) и ограничил в live555 длину udp пакета до 1200 байт. Видео с камер стало отображаться, правда, с камеры agv оно довольно часто теряется или иногда все еще не отображается вовсе. По списку пакетов отличие в том, что я не могу визуально выделить большие наборы пакетов без marked bit. В потоке с другой камеры они есть, и это так выглядят пакеты keyframe. Но с этой камеры поток разбит на примерно одинаковые блоки пакетов между пакетами с marked bit. Попробовал поотключать переопределение меток времени и последовательности в janus, иногда становится лучше и видео не пропадает, иногда нет. Кажется, что дело именно в аккуратной последовательности этих меток. Нужно будет переписать rtsp_streamer, внимательно прочитав перед этим RFC про RTP. Ветка gozhev/f/support-snx-source.

Sat, Jan 8, 2022

Разобрался с fullscreen api, flex layout, css media query в браузере. Получилось сделать панельку управления видео, которая подстраивается под ориентацию окна браузера. Посморел janus api для плагина streaming, посмотрел пример переключения потоков, идущий в комплекте с janus. Сделал запрос списка и переключение потоков в интерфейсе панельки управления видео.

Камеры hikvision показывают нормально, камеры xiaomi показывают только первый keyframe и несколько секун после, потом изображение пропадает. chrome://webrtc-internals показывает, что кадры не декодируются.

2022/01/09 23:53 · m

Typesetting

2021/11/16 07:25 · m

Electronics

2021/11/08 21:40 · m

Fang Reverse Engineering (2018)

I describe here some facts about a SN986 chip and an accompanying firmware that I have learned during development of my own board support package for the Xiaofang WiFi camera.

I'm very grateful to the fang-hacks community for giving me the first knowledge about this camera and for pointers of how to hack it.

My work however is not related to the fang-hacks project. My aim is to develop a full-stack custom firmware that could be flashed to the internal SPI flash memory replacing the stock firmware. On the other hand the aim of the fang-hacks project is to provide an application-layer overlay for an existing firmware with an ability to enable or disable stock features at any time.

There is another reason for this wiki. There are a lot of useful information about a sn986-based camera in the fang-hacks community. Details are spread across dozens of GitHub issues and comments and are highly unstructured. It seems to be very useful to put together all that info in one place and provide a table of contents and an ability to search.

2021/10/30 07:25 · m

Electrical Wiring

Распределительный щит

Заземление

2021/10/30 06:50 · m

Mikrotik

Sms

Receive sms:

/tool sms receive-enabled yes
/tool sms inbox print

Configure a Firewall

Lock to Specific Base Station

https://wiki.mikrotik.com/wiki/Manual:Interface/LTE#Using_Cell_lock

For R11e-LTE6 modem cell lock information will not be lost after reboot or modem reset.

Lock

/interface lte at-chat lte1 input="AT*Cell=2,3,,1300,384"

Descriprion

AT*Cell=<mode>,<NetworkMode>,<band>,<EARFCN>,<PCI>

where

<mode> :
0 – Cell/Frequency disabled
1 – Frequency lock enabled
2 – Cell lock enabled

<NetworkMode>
0 – GSM
1 – UMTS_TD
2 – UMTS_WB
3 – LTE

<band>
Not in use, leave this blank

<EARFCN>
earfcn from lte info

<PCI>
phy-cellid from lte info

Unlock

/interface lte at-chat lte1 input="AT*Cell=0"
2021/10/29 06:18 · m

C/C++

https://www.agner.org/optimize/ (!)

https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines
Ох уж этот std::make_shared…
Read-Write mutex with shared_mutex
Модель памяти C++ в примерах
Модели памяти C++ и CLR
Глубина кроличьей норы или собеседование по C++ в компании PVS-Studio
https://herbsutter.com/2013/02/11/atomic-weapons-the-c-memory-model-and-modern-hardware/
http://gcc.gnu.org/wiki/Atomic/GCCMM/AtomicSync

https://preshing.com/20120930/weak-vs-strong-memory-models/
https://preshing.com/20130618/atomic-vs-non-atomic-operations/
https://preshing.com/20130922/acquire-and-release-fences/

https://www.arangodb.com/2021/02/cpp-memory-model-migrating-from-x86-to-arm/

https://herbsutter.com/2013/05/29/gotw-89-solution-smart-pointers/

Code Complete: A Practical Handbook of Software Construction, by Steve McConnell

https://www.modernescpp.com/images/blog/Cpp17/Overview/timeline.png

Anthony Williams. C++ Concurrency in Action.
https://www.youtube.com/watch?v=14ntPfyNaKE

https://www.youtube.com/watch?v=VJ6ZvDRYzNE
https://cppinsights.io/


https://www.cppstories.com/2019/02/lambdas-story-part1/
http://scottmeyers.blogspot.com/2012/11/on-superfluousness-of-stdmove.html
http://scottmeyers.blogspot.com/2013/05/c14-lambdas-and-perfect-forwarding.html

https://stackoverflow.com/questions/2190090/how-to-prevent-writer-starvation-in-a-read-write-lock-in-pthreads
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3427.html
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2406.html

https://habr.com/ru/users/AlexeyAB/posts/

https://www.stroustrup.com/bs_faq2.html

Embedded C/C++

2021/10/29 06:18 · m

iSC5 Camera PCB wiring

Table of Contents

  • Sensor Board and GPIO_MS1[6]
  • Powering the Speaker
  • Powering the WiFi Module

Sensor Board and GPIO_MS1[6]

In the stock firmware there is the following code in the '/etc/init.d/rcS' file:

#power on sensor
/bin/gpio_ms1 -n 6 -m 1 -v 1

'gpio_ms1' binary when compiled with '-DSN9866X' flag maps gpio_ms1[7]…gpio_ms1[3] on aud[4]…aud[0]. In other words for each call with '-n X' flag where X is a number from 3 to 7 it internally calls 'gpio_aud' binary with argument 'Y' where Y is X minus 3. So that the line above means that aud[3] is set to high.

aud[3] line of the SOC is going to pin24 on the camera board connector. The line from the pin goes to the seat for a resistor which is left unsoldered. There are may be other vias under the socket however but the fact that even without setting aud[3] high the sensor works well.

Powering the Speaker

The speaker is driven by the SGM4895 power amp. The shutdown controlling line “nSHDN” of the speaker is connected to aud[4] line of the SoC. So that you need to set aud[4] gpio to high in order to play sound.

Powering the WiFi Module

The 3V3 bus of the wifi module is sourced from the p-channel MOSFET WP3401 (sot23, mark WP1J). The gate of the transistor is pulled down by a resistor and connected to the line gpio[6] of the SoC. If you need to hard-reset the wifi module then you should kill all networking software, unload the driver and set gpio[6] to high for a few seconds.

2021/10/29 06:18

Notes on SD Card

The camera fails to work with some SD cards. I tried to use two identical micro SD cards by Transcend and in both cases U-Boot failed to properly load my kernel to the RAM. U-Boot complained that the CRC sum of uImage did not match in 90 percent of attempts. Well, there were a few successful tries actually but they were very rare.

Here is what a boot log looks like on a failed attempt:

U-Boot 2011.09 (Sep 21 2018 - 10:14:17)

DRAM:  64 MiB
MMC:   MMC: 0
SPI FLASH: 16 MB
In:    serial
Out:   serial
Err:   serial
GPIO[2] is high
Hit any key to stop autoboot:  0 
reading uImage

2986304 bytes read
reading initramfs.cpio.gz

533651 bytes read
## Booting kernel from Legacy Image at 01000000 ...
   Image Name:   Linux-2.6.35.12
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    2986240 Bytes = 2.8 MiB
   Load Address: 00008000
   Entry Point:  00008040
   Verifying Checksum ... Bad Data CRC
ERROR: can't get kernel image!
loadkernel 0x00007FFC 0x1;bootm 0x00008000
Wrong Image Format for bootm command
ERROR: can't get kernel image!
firmware backup support fail....
#

The card that I tried to use was a 16GB microSDHC I, C10, U1 class card, Transcend TS16GUSD300S.

However an older 8GB Transcend card with only C6 capability worked perfectly. Also 16GB Kingston C10 cards work as well.

2021/10/29 06:18