|
| 1 | +#include "event_logger.h" |
| 2 | +#include "mockup_flash/flash.h" |
| 3 | +#include "fits_in_bits.h" |
| 4 | + |
| 5 | +#include <stdio.h> |
| 6 | +#include <stdint.h> |
| 7 | +#include <assert.h> |
| 8 | +#include <string.h> |
| 9 | + |
| 10 | + |
| 11 | +struct LocalEventLogs local_event_logs = { |
| 12 | + .buffer_size = LOCAL_EVENT_LOG_BUFF_SIZE, |
| 13 | + .tail = 0, |
| 14 | + .buffer = {0} |
| 15 | +}; |
| 16 | + |
| 17 | +// TODO: log overflows |
| 18 | +void handle_event_overflow() { |
| 19 | + push_event_logs_to_flash(&local_event_logs); |
| 20 | +} |
| 21 | + |
| 22 | +uint8_t add_event_log( |
| 23 | + uint64_t event_log |
| 24 | +) { |
| 25 | + uint64_t current_log_index = local_event_logs.tail; |
| 26 | + |
| 27 | + local_event_logs.buffer[current_log_index] = event_log; |
| 28 | + |
| 29 | + current_log_index++; |
| 30 | + |
| 31 | + if (current_log_index >= local_event_logs.buffer_size) { |
| 32 | + printf("overflow\n"); |
| 33 | + local_event_logs.tail = 0; |
| 34 | + handle_event_overflow(); |
| 35 | + } else { |
| 36 | + local_event_logs.tail = current_log_index; |
| 37 | + } |
| 38 | + |
| 39 | + return 0; |
| 40 | +} |
| 41 | + |
| 42 | +uint8_t build_and_add_event_log( |
| 43 | + unsigned int rtc_datetime, // Date+Hr+Min+Sec |
| 44 | + unsigned int current_mode, |
| 45 | + unsigned int action, |
| 46 | + unsigned int details, |
| 47 | + unsigned int extra |
| 48 | +) { |
| 49 | + |
| 50 | + if ( !fits_in_bits(rtc_datetime, 22) |
| 51 | + || !fits_in_bits(current_mode, 4) |
| 52 | + || !fits_in_bits(action, 3) |
| 53 | + || !fits_in_bits(details, 24) |
| 54 | + || !fits_in_bits(extra, 11) |
| 55 | + ) { |
| 56 | + // Gave too large a value somewhere :( |
| 57 | + printf("Improper value\n"); |
| 58 | + return 1; |
| 59 | + } |
| 60 | + |
| 61 | + union EventLog event_log = {.as_struct = { |
| 62 | + .rtc_datetime = rtc_datetime, |
| 63 | + .current_mode = current_mode, |
| 64 | + .action = action, |
| 65 | + .details = details, |
| 66 | + .extra = extra |
| 67 | + }}; |
| 68 | + |
| 69 | + add_event_log(event_log.as_uint64); |
| 70 | + return 0; |
| 71 | +} |
| 72 | + |
| 73 | +/* |
| 74 | +int main() { |
| 75 | +
|
| 76 | + init_flash_header(); |
| 77 | + fetch_flash_header(); |
| 78 | +
|
| 79 | + for (int i = 0; i < 128; ++i) { |
| 80 | + build_and_add_event_log(i, 0, 0, 0, i); |
| 81 | + } |
| 82 | +
|
| 83 | + printf("Local Logs:\n"); |
| 84 | + union EventLog ev_log; |
| 85 | + for(uint32_t i = 0; i < local_event_logs.buffer_size; ++i) { |
| 86 | + ev_log = (union EventLog)local_event_logs.buffer[i]; |
| 87 | + printf("Local ev Log #%u - rtc_time: %u, extra: %u\n", i, ev_log.as_struct.rtc_datetime, ev_log.as_struct.extra ); |
| 88 | + } |
| 89 | + puts("A"); |
| 90 | +
|
| 91 | + uint64_t block_buff[32]; |
| 92 | + uint32_t block_addr; |
| 93 | +
|
| 94 | + enum LogType log_type = get_oldest_page(block_buff, &block_addr); |
| 95 | + assert(log_type == EVENT); |
| 96 | +
|
| 97 | + union EventLog ev_logs[sizeof(block_buff)/sizeof(union EventLog)]; |
| 98 | +
|
| 99 | + static_assert(sizeof(ev_logs) >= sizeof(block_buff), "Hmm"); |
| 100 | +
|
| 101 | + memcpy(ev_logs, block_buff, sizeof(ev_logs)); |
| 102 | +} |
| 103 | +*/ |
0 commit comments