Сократить запись логгера УМП до 12 слов формата v4
This commit is contained in:
@@ -13,37 +13,76 @@ unsigned int adc_table_lem[4];
|
||||
__declspec(dllexport) int run_tests(void)
|
||||
{
|
||||
unsigned int i, generation, archived, reply[UMP_CAN_MAX_WORDS], error, length;
|
||||
/* Индексы перебирают все поля десяти записей онлайн-окна, проверяя отсутствие сдвига на старые 40 слов. */
|
||||
unsigned int record_index, word_index, block_words;
|
||||
unsigned long sequence;
|
||||
READY = 100;
|
||||
CHECK(!ump_log_write(UMP_LOG_BASE, 1));
|
||||
READY = 0;
|
||||
/* Явная инициализация кэша гарантирует нулевые ЗПТ до первого принятого измерения. */
|
||||
CHECK(ump_pm67_voltage[0] == 0 && ump_pm67_voltage[1] == 0);
|
||||
/* Регистр 306 ПМ67 передаётся нулевым CAN-индексом 305 в первой позиции кадра. */
|
||||
ump_log_can(0x8000U | 305U, 321, 0, 0);
|
||||
/* Регистр 9 ПМ67 находится во второй позиции кадра с начальным индексом 7 и маской 0x4000. */
|
||||
ump_log_can(0x4000U | 7U, 0, 456, 0);
|
||||
/* Напряжения должны обновляться ещё до включения регистратора, чтобы первый снимок уже содержал измерения. */
|
||||
CHECK(ump_pm67_voltage[0] == 321 && ump_pm67_voltage[1] == 456 && ump_count == 0);
|
||||
/* Нулевая маска не разрешает первое слово и не должна подменять сохранённое напряжение. */
|
||||
ump_log_can(305U, 999, 0, 0);
|
||||
/* Индекс 306 не является индексом регистра 306: прошивка принимает именно нулевую нумерацию CAN. */
|
||||
ump_log_can(0x8000U | 306U, 999, 0, 0);
|
||||
/* Оба неверных заголовка обязаны оставить последнее корректное ЗПТ1 без изменения. */
|
||||
CHECK(ump_pm67_voltage[0] == 321);
|
||||
/* Третья позиция соответствует индексу 305 даже при пропущенных первых двух словах кадра. */
|
||||
ump_log_can(0x2000U | 303U, 0, 0, 123);
|
||||
/* Аналогично проверяет третью позицию для нулевого индекса 8 второго напряжения. */
|
||||
ump_log_can(0x2000U | 6U, 0, 0, 789);
|
||||
/* Последний принятый набор должен совпадать с ожидаемыми ЗПТ1/ЗПТ2 в вольтах. */
|
||||
CHECK(ump_pm67_voltage[0] == 123 && ump_pm67_voltage[1] == 789);
|
||||
adc_table_lem[0] = 2048; adc_table_lem[3] = 4095;
|
||||
CHECK(!ump_log_write(UMP_LOG_BASE+1, 0));
|
||||
CHECK(!ump_log_write(UMP_LOG_BASE+1, 1001));
|
||||
CHECK(ump_log_write(UMP_LOG_BASE+1, 1));
|
||||
modbus[127] = 0x80;
|
||||
/* Дополнительные биты полного слова команд не должны попадать в компактное поле пуска/сброса v4. */
|
||||
modbus[127] = 0xAB80;
|
||||
/* Unrelated registers must not determine the fixed 166 ramp. */
|
||||
modbus[0x50] = 99; modbus[0x51] = 123;
|
||||
modbus[0x64] = 88; modbus[0x65] = 111;
|
||||
modbus[0x7B] = 1234; modbus[0x1C] = 160;
|
||||
/* Сторожевое значение во втором слоте обнаружит случайную запись старых полей за 12-словную границу. */
|
||||
logs_block[UMP_LOG_WORDS] = 0xA55A;
|
||||
/* Второй банк не должен затрагиваться заполнением и оборотом кольца первого банка. */
|
||||
logs_block[UMP_LOG_CAPACITY * UMP_LOG_WORDS] = 0x5AA5;
|
||||
CHECK(ump_log_write(UMP_LOG_BASE, 1));
|
||||
/* Число слов и чётная длина совпадают с компактным форматом исполнения 167. */
|
||||
CHECK(UMP_LOG_WORDS == 12 && 2UL * UMP_LOG_CAPACITY * UMP_LOG_WORDS <= LOG_PAGE_LEN);
|
||||
/* Первый снимок обязан содержать напряжения, принятые до запуска записи. */
|
||||
CHECK(ump_word(0, 0, 9) == 123 && ump_word(0, 0, 10) == 789);
|
||||
/* Нулевой резерв необходим для парной упаковки CAN и не должен содержать старый код ЦАП. */
|
||||
CHECK(ump_word(0, 0, 11) == 0 && logs_block[UMP_LOG_WORDS] == 0xA55A);
|
||||
/* В начале доступен один снимок, а оставшаяся часть 124-словного онлайн-окна заполнена нулями. */
|
||||
CHECK(ump_log_read(UMP_LOG_LIVE+2) == 1 && ump_log_read(UMP_LOG_LIVE+4+UMP_LOG_WORDS) == 0);
|
||||
CHECK(!ump_log_write(UMP_LOG_BASE, 1));
|
||||
CHECK(!ump_log_write(UMP_LOG_BASE+1, 20));
|
||||
for (i=0; i<900; i++) ump_log_tick();
|
||||
CHECK(ump_count == UMP_LOG_CAPACITY);
|
||||
CHECK(ump_word(0, 0, 0) == 101);
|
||||
CHECK(ump_word(0, UMP_LOG_CAPACITY-1, 0) == 900);
|
||||
CHECK(ump_word(0, 0, 8) == 1234);
|
||||
CHECK(ump_word(0, 0, 24) == 6);
|
||||
CHECK(ump_word(0, 0, 25) == 16);
|
||||
CHECK(ump_word(0, 0, 36) == 2048);
|
||||
CHECK(ump_word(0, 0, 39) == 4095);
|
||||
/* После оборота кольца поле команд содержит только биты пуска и сброса, несмотря на посторонние биты 0xAB80. */
|
||||
CHECK(ump_word(0, 0, 3) == 0x80);
|
||||
/* Расчётное задание тока переместилось в слово 6 и сохраняет масштаб 0,1 мА. */
|
||||
CHECK(ump_word(0, 0, 6) == 160);
|
||||
/* Уставки исполнения 166 остаются фиксированными 6/16 мА независимо от технологических регистров 167. */
|
||||
CHECK(ump_word(0, 0, 7) == 6 && ump_word(0, 0, 8) == 16);
|
||||
/* При обороте кольца не теряются оба напряжения и не изменяется сторожевое значение следующего банка. */
|
||||
CHECK(ump_word(0, 0, 9) == 123 && ump_word(0, 0, 10) == 789 && logs_block[UMP_LOG_CAPACITY * UMP_LOG_WORDS] == 0x5AA5);
|
||||
/* Короткая CAN-команда должна остаться отдельным событием. */
|
||||
modbus[127] = 0x40;
|
||||
ump_log_can(0x807F, 0x40, 0, 0);
|
||||
CHECK(ump_post == 1000);
|
||||
CHECK(ump_word(0, ump_count-1, 2) == 0x102);
|
||||
CHECK(ump_word(0, ump_count-1, 18) == 0x807F);
|
||||
/* Событие CAN хранит выбранные команды в слове 3 вместо удалённого сырого заголовка в прежнем слове 18. */
|
||||
CHECK(ump_word(0, ump_count-1, 3) == 0x40);
|
||||
for (i=0; i<999; i++) ump_log_tick();
|
||||
CHECK(ump_generation == 0);
|
||||
ump_log_tick();
|
||||
@@ -59,8 +98,16 @@ __declspec(dllexport) int run_tests(void)
|
||||
CHECK(ump_word(1, UMP_LOG_CAPACITY-1, 0) == archived);
|
||||
CHECK(ump_generation == generation);
|
||||
CHECK(ump_sequence == sequence + 200);
|
||||
CHECK(ump_log_read(UMP_LOG_LIVE+2) == 3);
|
||||
CHECK(ump_log_read(UMP_LOG_LIVE+4) == ump_time-2);
|
||||
/* Уменьшение записи увеличивает глубину онлайн-окна с трёх до десяти полных снимков. */
|
||||
CHECK(ump_log_read(UMP_LOG_LIVE+2) == UMP_LOG_LIVE_RECORDS && UMP_LOG_LIVE_RECORDS == 10);
|
||||
/* Первое онлайн-время относится к самому старому из десяти переданных снимков. */
|
||||
CHECK(ump_log_read(UMP_LOG_LIVE+4) == ump_time-UMP_LOG_LIVE_RECORDS+1);
|
||||
/* Сопоставляет каждую запись онлайн-окна с хронологическим чтением кольцевого банка. */
|
||||
for (record_index = 0; record_index < UMP_LOG_LIVE_RECORDS; record_index++)
|
||||
/* Проверяет все 12 слов, включая время, выбранные сигналы и нулевой резерв. */
|
||||
for (word_index = 0; word_index < UMP_LOG_WORDS; word_index++)
|
||||
/* Смещения должны заполнять ровно 120 полезных слов после четырёх служебных слов. */
|
||||
CHECK(ump_log_read(UMP_LOG_LIVE+4+record_index*UMP_LOG_WORDS+word_index) == ump_word(0, ump_count-UMP_LOG_LIVE_RECORDS+record_index, word_index));
|
||||
CHECK(ump_log_write(UMP_LOG_BASE+3, 1));
|
||||
CHECK(ump_log_write(UMP_LOG_BASE+2, UMP_LOG_CAPACITY-1));
|
||||
CHECK(ump_log_read(UMP_LOG_DATA) == archived);
|
||||
@@ -81,7 +128,27 @@ __declspec(dllexport) int run_tests(void)
|
||||
/* CAN читает те же регистры и формирует цельный снимок из 124 слов.
|
||||
* Запись по старым технологическим адресам через сервис запрещена. */
|
||||
length = ump_can_prepare(3, UMP_LOG_BASE, 16, reply, &error);
|
||||
CHECK(!error && length == 16 && reply[0] == 0x554D && reply[1] == 2);
|
||||
/* Служебный ответ должен объявлять версию v4, длину 12 слов и сохранённую ёмкость банка исполнения 166. */
|
||||
CHECK(!error && length == 16 && reply[0] == 0x554D && reply[1] == 4 && reply[4] == 12 && reply[5] == UMP_LOG_CAPACITY);
|
||||
/* Проверяет каждое разрешённое число целых компактных записей в архивном CAN-окне. */
|
||||
for (block_words = UMP_LOG_WORDS; block_words <= 120; block_words += UMP_LOG_WORDS) {
|
||||
/* Запрашивает от одной до десяти записей, не превышая полезную длину 120 слов. */
|
||||
length = ump_can_prepare(3, UMP_LOG_DATA, block_words, reply, &error);
|
||||
/* Все кратные длине записи запросы должны проходить без исключения Modbus. */
|
||||
CHECK(!error && length == block_words);
|
||||
} /* Завершает проверку допустимых размеров окна компактного архива. */
|
||||
/* Прежний блок v2 из 40 слов теперь обрывает запись v4 и должен отклоняться CAN-протоколом. */
|
||||
ump_can_prepare(3, UMP_LOG_DATA, 40, reply, &error);
|
||||
/* Исключение 2 сообщает о недопустимом диапазоне регистров. */
|
||||
CHECK(error == 2);
|
||||
/* Отклоняет пустой архивный запрос вместо его трактовки как успешного чтения. */
|
||||
ump_can_prepare(3, UMP_LOG_DATA, 0, reply, &error);
|
||||
/* Нулевая длина не содержит ни одной целой записи v4. */
|
||||
CHECK(error == 2);
|
||||
/* Блок из 11 записей уже превышает разрешённые 120 слов полезного окна. */
|
||||
ump_can_prepare(3, UMP_LOG_DATA, 132, reply, &error);
|
||||
/* Ограничение защищает буфер ответа от записи за его границами. */
|
||||
CHECK(error == 2);
|
||||
length = ump_can_prepare(3, UMP_LOG_LIVE, 124, reply, &error);
|
||||
CHECK(!error && length == 124);
|
||||
ump_can_prepare(3, UMP_LOG_LIVE, 126, reply, &error);
|
||||
|
||||
Reference in New Issue
Block a user