14#define CHECK(condition) \
17 fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, #condition); \
24#define BS EMMC_BLOCK_SIZE
42 memset(d, 0,
sizeof *d);
52 memset(d, 0,
sizeof *d);
84 uint32_t
count, uint32_t budget) {
99 for (uint32_t i = 0; i <
count && i < 32; ++i) {
101 memcpy(d->
blocks + (
size_t)(lba + i) *
BS,
102 (
const uint8_t*)buf + (
size_t)i *
BS,
BS);
151 uint32_t crc = 0xFFFFFFFFu;
152 for (
size_t i = 0; i <
n; ++i) {
154 for (
int k = 0; k < 8; ++k) {
155 crc = (crc >> 1) ^ (0xEDB88320u & (0u - (crc & 1u)));
161static uint32_t
rd32(
const uint8_t*
p) {
162 return (uint32_t)
p[0] | (uint32_t)
p[1] << 8 | (uint32_t)
p[2] << 16 |
163 (uint32_t)
p[3] << 24;
184 memset(&
img, 0,
sizeof img);
185 const uint8_t* s = d->
blocks;
197 uint16_t used = (uint16_t)(
b[18] |
b[19] << 8);
205 for (uint16_t
o = 0;
o < used;) {
206 const uint8_t*
r =
b + 20 +
o;
212 x->session =
rd32(
b + 12);
213 memcpy(x->data,
r + 6, x->len);
214 o = (uint16_t)(
o + 6 + x->len);
225 for (
int i = 0; i < 512; ++i) {
226 b[i] = (uint8_t)(i * 7 + 3);
241 for (uint32_t t = 0; t < 10000; t += 100) {
250 for (
unsigned j = 0; j < 32; ++j) {
251 p[j] = (uint8_t)(i + j);
261 for (
unsigned i = 0; i < 100; ++i) {
277 for (
unsigned i = 0; i < 100; ++i) {
281 CHECK(
r->type == 0x10 &&
r->len == 32 &&
r->t == 10 + i);
282 CHECK(memcmp(
r->data,
p, 32) == 0 &&
r->session == 1);
303 for (
int s = 0; s < 2; ++s) {
324 CHECK(
img.rec[0].session == 1 &&
img.rec[3].session == 2);
325 CHECK(
img.rec[6].session == 3 &&
img.rec[7].type == 0x11);
339 for (
unsigned i = 0; i < 4; ++i) {
388 uint8_t
p[200] = {0};
389 unsigned ok = 0, refused = 0;
390 for (
unsigned i = 0; i < 2000; ++i) {
541 for (
int i = 0; i < 3; ++i) {
555 for (
int i = 0; i < 3; ++i) {
604 puts(
"14 emmc log test groups passed");
@ FLIGHT_EV_LAUNCH_DETECTED
@ FLIGHT_EV_APOGEE_DETECTED
bool emmc_log_on_state(emmc_log_t *log, flight_state_t from, flight_state_t to, uint32_t now_ms)
uint32_t emmc_log_crc32(const void *data, uint32_t len)
emmc_status_t emmc_log_service(emmc_log_t *log, uint32_t now_ms)
emmc_status_t emmc_log_init(emmc_log_t *log, const emmc_port_t *port, void *context, const emmc_log_config_t *config, emmc_log_chunk_t *chunks, uint8_t chunk_count, uint8_t *scratch)
uint8_t emmc_log_backlog(const emmc_log_t *log)
bool emmc_log_append(emmc_log_t *log, uint8_t type, uint32_t t_ms, const void *data, uint8_t len)
void emmc_log_flush(emmc_log_t *log)
emmc_log_config_t emmc_log_default_config(void)
#define EMMC_LOG_MAX_CHUNKS
#define EMMC_REC_SESSION_END
#define EMMC_REC_SESSION_START
static const emmc_port_t port
std::vector< daq::SensorDataChunkCollection > chunks
static uint32_t rd32(const uint8_t *p)
flight_state_t flight_state_next(flight_state_t state, flight_event_t event)
*brief create JSON pointer *sa reference_tokens const string_t const string_t & b
size_type count(const key_type &key) const
*brief create JSON pointer *sa reference_tokens end()
*brief user defined string literal for JSON values *sa std::size_t n
emmc_status_t start_result
void(* unlock)(void *context)
static void test_session_roundtrip(void)
static void f_lock(void *ctx)
static void decode(const disk_t *d)
static void disk_power_cycle(disk_t *d)
static void test_invalid_init(void)
static emmc_status_t f_start(void *ctx, uint32_t *count)
static void test_sessions_and_remount(void)
static void fill_payload(uint8_t *p, unsigned i)
static emmc_log_config_t config(void)
static emmc_status_t f_read(void *ctx, uint32_t lba, void *buf, uint32_t count, uint32_t budget)
static void test_stale_epoch(void)
static void test_torn_write(void)
static void test_no_io_before_arm(void)
static emmc_status_t f_write(void *ctx, uint32_t lba, const void *buf, uint32_t count, uint32_t budget)
static uint32_t ref_crc(const uint8_t *p, size_t n)
static void test_write_retry(void)
static void test_flush_interval(void)
static void test_full(void)
static void f_unlock(void *ctx)
static uint32_t rd32(const uint8_t *p)
static void disk_new(disk_t *d, uint32_t capacity)
static void test_crc(void)
static void test_backpressure(void)
static void test_start_failure(void)
static uint8_t scratch[BS]
static void test_flight_keeps_recording(void)
static void test_torn_write_hole(void)
static void log_new(emmc_log_t *log, disk_t *d)
static void drain(emmc_log_t *log, uint32_t now)