Включение сбора статистики (COMMAND_DEVICE_STAT 0xA)¶
Сбор статистики по загрузке устройства, утилизации внутренних буферов позволяет определить, что является причиной потери данных при приёме/передачи данных. Для этого выводится загрузка процессора, приблизительный процент утилизации CAN-шин (не учитываются служебные биты), а также утилизация буфера приёма данных по USB, утилизация буферов на отправку в CAN-шины и буфер обработки данных.
Управление включением и выключением сбора статистики происходит с использованием выставления флага команде:
enum DEVICE_STAT {
DEVICE_STAT_OFF = 0x00,
EDVICE_STAT_ON = 0x01
};
После отправки команды на сбор статистики от устройства с интервалами раз в 1 секунду будет приходить статистика в виде набора структур. Данный набор и его последовательность зависят от используемого устройства. Первая структура будет CommandHeader, у которой в поле command будет значение 0x0A (COMMAND_DEVICE_STAT), sequence порядковый номер посылки, dSize будет содержать длину всех передаваемых данных. Ниже представлены возможные структуры, которые будет передавать устройство:
enum DEVICE_STAT_TYPE {
DEVICE_STAT_CPU_IDLE = 0x01,
DEVICE_STAT_PROCESSING_BUFFER = 0x02,
DEVICE_STAT_CAN_BUFFER = 0x04,
DEVICE_STAT_CAN1_LOAD_N = 0x11,
DEVICE_STAT_CAN1_LOAD_D = 0x21,
DEVICE_STAT_CAN1_MSG_COUNTER = 0x51,
DEVICE_STAT_CAN2_LOAD_N = 0x12,
DEVICE_STAT_CAN2_LOAD_D = 0x22,
DEVICE_STAT_CAN2_MSG_COUNTER = 0x52
};
typedef struct { // Загрузка процессора = (1 - Value / MaxValue) * 100
uint32_t DataType; // DEVICE_STAT_CPU_IDLE
uint32_t MaxValue; // Максимальное значение IDLE
uint32_t Value; // Текущее значение IDLE
} __attribute__((packed)) StatIdle;
typedef struct { // Утилизация буферов
uint32_t DataType; // DEVICE_STAT_PROCESSING_BUFFER, DEVICE_STAT_CAN_BUFFER
uint32_t QueueSize; // Общий размер буфера в записях
uint32_t Utilization; // Сколько записей в буфере
uint32_t Lost; // Сколько записей не было помещено в буфер из-за его переполнения
} __attribute__((packed)) StatBufferLoad;
typedef struct { // Сколько бит передано в шину, без учёта служебных битов, с момента последней передачи статистики
uint32_t DataType; // DEVICE_STAT_CAN1_LOAD_N, DEVICE_STAT_CAN1_LOAD_D, DEVICE_STAT_CAN2_LOAD_N, DEVICE_STAT_CAN2_LOAD_D
uint32_t Value;
} __attribute__((packed)) StatChannelLoad;
typedef struct { // Статистика по количеству принятых, отправленных сообщений. Количеству сообщений, которые так и не попали в шину.
uint32_t DataType; // DEVICE_STAT_CAN1_MSG_COUNTER, DEVICE_STAT_CAN2_MSG_COUNTER
uint32_t Received; // Количество приняты сообщений
uint32_t ReceiveLost; // Количество принятых сообщений но не обработанных из-за переполнения буферов
uint32_t Transmitted; // Количество отправленных сообщений
uint32_t TransmitALS; // Количество сообщений проигравших арбитраж
uint32_t TransmitRetry; // Количество попыток перепослать сообщения
uint32_t TransmitFailed; // Количество сообщений, которые не были отправлены
} __attribute__((packed)) StatChannelCounter;
Запрос
Поле | Значение |
command | 0x0A |
sequence | порядковый номер запроса |
flags | Значение из DEVICE_STAT |
dSize | 0x00 |
Ответ
Поле | Значение |
command | 0x8A |
sequence | порядковый номер запроса |
flags | 0x00 |
dSize | 0x00 |
Пример
Включение сбора статистики
⇒ 0A xx 01 00
⇐ 8A xx 00 00
Пример статистики, отправляемой CH-P.FDL2
⇐ 0A xx 00 6C 01 00 00 00 00 F4 01 00 CA 85 01 00 02 00 00 00 08 00 00 00 01 00 00 00 00 00 00 00 04 00 00 00 80 00 00 00 02 00 00 00 00 00 00 00 11 00 00 00 5E CD 02 00 21 00 00 00 00 00 00 00 12 00 00 00 5E CD 02 00 22 00 00 00 00 00 00 00
Здесь:- StatIdle ( DataType = DEVICE_STAT_CPU_IDLE, MaxValue = 0x0001F400, Value = 0x000185CA ) = Load: 22
- StatBufferLoad ( DataType = DEVICE_STAT_PROCESSING_BUFFER, QueueSize = 8, Utilization = 1, Lost = 0 )
- StatBufferLoad ( DataType = DEVICE_STAT_CAN_BUFFER, QueueSize = 128, Utilization = 2, Lost = 0 )
- StatChannelLoad ( DataType = DEVICE_STAT_CAN1_LOAD_N, Value = 0x0002CD5E )
- StatChannelLoad ( DataType = DEVICE_STAT_CAN1_LOAD_D, Value = 0 )
- StatChannelLoad ( DataType = DEVICE_STAT_CAN2_LOAD_N, Value = 0x0002CD5E )
- StatChannelLoad ( DataType = DEVICE_STAT_CAN2_LOAD_D, Value = 0 )