~={green}Проект для тестирования стержней.=~ ~={yellow}Таймеры=~ - TIM_2 - вход в режиме ETR - TIM_3 - вход в режиме ETR - TIM_4 - вход в режиме ETR - TIM_6 - uptime - TIM_8 - вход в режиме ETR - TIM_12 - передача данных по USB - TIM_14 - статистика FreeRTOS ~={yellow}Остальное=~ - USART_3 - терминал - ### Опрос датчиков. Протокол обмена. Фиксация значений счетчиков и дискретных входов происходит с интервалом 1мс. В этот момент заполняется следующая структура данных: ```c typedef struct { uint32_t pack_counter; uint16_t vertical; uint16_t horizontal; uint32_t dpl_1; uint32_t dpl_2; uint8_t flag; } signals_t; /* pack_counter - увеличивается на 1 каждый раз при заполнении новой структуры vertical - вертикальный детектор (значения не накапливаются) horizontal - горизонтальный детектор (значения не накапливаются) dpl_1 - первый инкрементальный датчик (значения накапливаются) dpl_2 - второй инкрементальный датчик (значения накапливаются) flag - байт дискретных датчиков 0-ой бит - датчик начала измерения (НИ) 1-ый бит - датчик конца измерения (КИ) 2-ой бит - датчик Д1000 */ ``` Для передачи данных используется протокол Wake. Структуры упаковываются в пакеты. Пакет может содержать одну или более целых структур. Частично структуры не передаются. Пакет состоит из заголовка, полезных данных и контрольной суммы. Заголовок пакета: |------ Байт 1 ------|------ Байт 2 ------|------ Байт 3 ------|------ Байт 4 ------|------ Байт 5 ------| |--- WAKE_FEND ---|------- Адрес -----|-- Номер пакета--|------Размер данных в байтах--------| WAKE_FEND - признак начала пакета - 0x0C, Адрес - адрес устройства - 0x81 Байты 4 и 5 содержат длину только полезных данных без учета заголовка и контрольной суммы. Номер пакета увеличивается на 1 с каждым новым пакетом. Контрольная сумма располагается в конце пакета и занимает один байт. Контрольная сумма рассчитывается для всего пакета, включая заголовок и блок полезных данных. ```c uint8_t Wake::crc_8(uint8_t *data, int length) { uint8_t crc = 0x00; uint8_t extract; uint8_t sum; for (int i = 0; i < length; i++) { extract = *data; for (uint8_t tmp = 8; tmp; tmp--) { sum = (crc ^ extract) & 0x01; crc >>= 1; if (sum) crc ^= 0x8C; extract >>= 1; } data++; } return crc; } ``` Для передачи пакетов по USB используется буфер размером 512 байт. В буфер такого размера помещается порядка 29 структур, завернутых в пакет в один протокола Wake. Пример чтения данных из тестового скрипта: ```python def receiver_test(self): while True:     msg = self.serial.read(512)     if msg: self.recv_chank(msg) else: print("USB receive timeout") ``` Скрипт usb_receiver.py находится tools/