54 lines
2.3 KiB
C
54 lines
2.3 KiB
C
/* One set of vectors checks static metadata against Climate's runtime encoder.
|
|
* This catches word order and ASCII order changes on the host, before MCU use. */
|
|
#include "firmware_identity.h"
|
|
#include "firmware_info.h"
|
|
#include "firmware_info_static.h"
|
|
#include "ump_protocol.h"
|
|
#include <assert.h>
|
|
|
|
static unsigned writes;
|
|
static uint16_t read_identity(void *context, uint16_t address)
|
|
{
|
|
(void)context;
|
|
return firmware_info_static_read(address - UMP_FIRMWARE_INFO);
|
|
}
|
|
static int write_identity(void *context, uint16_t address, uint16_t value)
|
|
{
|
|
(void)context; (void)address; (void)value;
|
|
writes++;
|
|
return 1;
|
|
}
|
|
int main(void)
|
|
{
|
|
firmware_info_t info;
|
|
uint16_t expected[12], reply[UMP_MAX_WORDS];
|
|
ump_octet frame[UMP_RTU_CAPACITY];
|
|
ump_backend backend = {0, read_identity, write_identity};
|
|
unsigned i, error;
|
|
info.major = FIRMWARE_VERSION_MAJOR; info.minor = FIRMWARE_VERSION_MINOR;
|
|
info.patch = FIRMWARE_VERSION_PATCH; info.year = FI_YEAR;
|
|
info.month = FI_MONTH; info.day = FI_DAY; info.hour = FI_HOUR;
|
|
info.minute = FI_MINUTE; info.second = FI_SECOND;
|
|
assert(firmware_info_set_build_id(&info, FIRMWARE_BUILD_ID) == FIRMWARE_INFO_OK);
|
|
assert(firmware_info_to_registers(&info, expected, 12) == FIRMWARE_INFO_OK);
|
|
for (i=0; i<12; ++i) assert(firmware_info_static_read(i) == expected[i]);
|
|
assert(firmware_info_static_read(12) == 0);
|
|
assert(ump_prepare(&backend, 3, UMP_FIRMWARE_INFO, 12, 1, reply, &error) == 12 && !error);
|
|
for (i=0; i<12; ++i) assert(reply[i] == expected[i]);
|
|
for (i=0; i<6; ++i) {
|
|
assert(ump_can_fragment(reply,12,i,42,0,frame) == 8);
|
|
assert(frame[0] == expected[2*i] >> 8 && frame[1] == (expected[2*i] & 255));
|
|
assert(frame[6] == 42 && frame[7] == 0);
|
|
}
|
|
assert(ump_rtu_response(&backend, 1, 3, UMP_FIRMWARE_INFO, 12, frame, sizeof(frame)/sizeof(frame[0])) == 29);
|
|
assert(frame[2] == 24 && ump_crc(frame,29) == 0);
|
|
assert(ump_validate(3, UMP_FIRMWARE_INFO+11, 1, 0) == 0);
|
|
assert(ump_validate(3, UMP_FIRMWARE_INFO+11, 2, 0) == 2);
|
|
assert(ump_validate(3, UMP_FIRMWARE_INFO, 0, 0) == 2);
|
|
assert(ump_validate(3, UMP_FIRMWARE_INFO, 0xffffU, 0) == 2);
|
|
assert(ump_validate(3, UMP_FIRMWARE_INFO+1, 11, 1) == 2);
|
|
ump_prepare(&backend,6,UMP_FIRMWARE_INFO,1,0,reply,&error);
|
|
assert(error == 2 && writes == 0);
|
|
return 0;
|
|
}
|