v1.19 Release
Dependencies: nRF51822
Source/log.cpp@40:adabdb1c5abe, 2020-01-16 (annotated)
- Committer:
- fdelahan
- Date:
- Thu Jan 16 16:48:22 2020 +0000
- Revision:
- 40:adabdb1c5abe
- Parent:
- 27:bb7247a1704e
- Child:
- 60:6327aa30a10e
Added delay for read of ambient sensor bit. Added DEW snippets turning on/off of logging function.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sgetz7908 | 23:7ca590427f0e | 1 | #include "mbed.h" |
sgetz7908 | 23:7ca590427f0e | 2 | #include "ble/BLE.h" |
sgetz7908 | 23:7ca590427f0e | 3 | //#include "ble/services/UARTService.h" |
sgetz7908 | 23:7ca590427f0e | 4 | #include "BLE_Stuff.h" |
sgetz7908 | 23:7ca590427f0e | 5 | #include "hw.h" |
sgetz7908 | 23:7ca590427f0e | 6 | #include "log.h" |
sgetz7908 | 23:7ca590427f0e | 7 | #include "main.h" |
sgetz7908 | 23:7ca590427f0e | 8 | #include "mem.h" |
sgetz7908 | 23:7ca590427f0e | 9 | extern "C" { |
sgetz7908 | 23:7ca590427f0e | 10 | #include <nrf_nvmc.h> |
sgetz7908 | 23:7ca590427f0e | 11 | } |
sgetz7908 | 23:7ca590427f0e | 12 | |
sgetz7908 | 23:7ca590427f0e | 13 | #if LOG_SIZE * 8 > 1024 * PSTORAGE_NUM_OF_PAGES |
sgetz7908 | 23:7ca590427f0e | 14 | error, allocated flash not big enough for storing logs |
sgetz7908 | 23:7ca590427f0e | 15 | #endif |
sgetz7908 | 23:7ca590427f0e | 16 | |
fdelahan | 40:adabdb1c5abe | 17 | extern bool log_enable; // initialized in main.cpp – DEW |
fdelahan | 40:adabdb1c5abe | 18 | |
sgetz7908 | 23:7ca590427f0e | 19 | // Counts number of records with non-zero time field |
sgetz7908 | 23:7ca590427f0e | 20 | uint32_t log_get_num_records(void) |
sgetz7908 | 23:7ca590427f0e | 21 | { |
sgetz7908 | 23:7ca590427f0e | 22 | uint32_t cnt = 0; |
sgetz7908 | 23:7ca590427f0e | 23 | log_struct *rec = (log_struct *)PSTORAGE_DATA_START_ADDR; |
sgetz7908 | 23:7ca590427f0e | 24 | |
sgetz7908 | 23:7ca590427f0e | 25 | while(rec < (log_struct *)PSTORAGE_DATA_END_ADDR) |
sgetz7908 | 23:7ca590427f0e | 26 | { |
sgetz7908 | 23:7ca590427f0e | 27 | if(rec->time == 0xffffffff) return cnt; |
sgetz7908 | 23:7ca590427f0e | 28 | cnt++; |
sgetz7908 | 23:7ca590427f0e | 29 | rec++; |
sgetz7908 | 23:7ca590427f0e | 30 | } |
sgetz7908 | 27:bb7247a1704e | 31 | return cnt; |
sgetz7908 | 23:7ca590427f0e | 32 | } |
sgetz7908 | 23:7ca590427f0e | 33 | |
sgetz7908 | 23:7ca590427f0e | 34 | // returns the number of records with code type |
sgetz7908 | 23:7ca590427f0e | 35 | uint32_t log_code_count(event_t code) |
sgetz7908 | 23:7ca590427f0e | 36 | { |
sgetz7908 | 23:7ca590427f0e | 37 | uint32_t cnt = 0; |
sgetz7908 | 23:7ca590427f0e | 38 | log_struct *rec = (log_struct *)PSTORAGE_DATA_START_ADDR; |
sgetz7908 | 23:7ca590427f0e | 39 | |
sgetz7908 | 23:7ca590427f0e | 40 | while(rec < (log_struct *)PSTORAGE_DATA_END_ADDR) |
sgetz7908 | 23:7ca590427f0e | 41 | { |
sgetz7908 | 23:7ca590427f0e | 42 | if(rec->time == 0xffffffff) return cnt; |
sgetz7908 | 23:7ca590427f0e | 43 | if(rec->code == code) cnt++; |
sgetz7908 | 23:7ca590427f0e | 44 | rec++; |
sgetz7908 | 23:7ca590427f0e | 45 | } |
sgetz7908 | 27:bb7247a1704e | 46 | return cnt; |
sgetz7908 | 23:7ca590427f0e | 47 | } |
sgetz7908 | 23:7ca590427f0e | 48 | |
sgetz7908 | 23:7ca590427f0e | 49 | // returns address of 1st free record |
sgetz7908 | 23:7ca590427f0e | 50 | static log_struct * get_free_record(void) |
sgetz7908 | 23:7ca590427f0e | 51 | { |
sgetz7908 | 23:7ca590427f0e | 52 | log_struct *rec = (log_struct *)PSTORAGE_DATA_START_ADDR; |
sgetz7908 | 23:7ca590427f0e | 53 | |
sgetz7908 | 23:7ca590427f0e | 54 | while(rec < (log_struct *)PSTORAGE_DATA_END_ADDR) |
sgetz7908 | 23:7ca590427f0e | 55 | { |
sgetz7908 | 23:7ca590427f0e | 56 | if(rec->time == 0xffffffff) return rec; |
sgetz7908 | 23:7ca590427f0e | 57 | rec++; |
sgetz7908 | 23:7ca590427f0e | 58 | } |
sgetz7908 | 23:7ca590427f0e | 59 | return 0; |
sgetz7908 | 23:7ca590427f0e | 60 | } |
sgetz7908 | 23:7ca590427f0e | 61 | |
sgetz7908 | 23:7ca590427f0e | 62 | // can not be called while BLE is active |
sgetz7908 | 23:7ca590427f0e | 63 | void log_erase(void) |
sgetz7908 | 23:7ca590427f0e | 64 | { |
sgetz7908 | 23:7ca590427f0e | 65 | uint32_t addr = PSTORAGE_DATA_START_ADDR; |
sgetz7908 | 23:7ca590427f0e | 66 | |
sgetz7908 | 23:7ca590427f0e | 67 | //stop_radio_and_wait(); |
sgetz7908 | 23:7ca590427f0e | 68 | |
sgetz7908 | 23:7ca590427f0e | 69 | while(addr < PSTORAGE_DATA_END_ADDR) |
sgetz7908 | 23:7ca590427f0e | 70 | { |
sgetz7908 | 23:7ca590427f0e | 71 | nrf_nvmc_page_erase(addr); |
sgetz7908 | 23:7ca590427f0e | 72 | addr += PSTORAGE_FLASH_PAGE_SIZE; |
sgetz7908 | 23:7ca590427f0e | 73 | } |
sgetz7908 | 23:7ca590427f0e | 74 | } |
sgetz7908 | 23:7ca590427f0e | 75 | |
sgetz7908 | 23:7ca590427f0e | 76 | /// Puts the requested log record out on the BLE UART. |
sgetz7908 | 23:7ca590427f0e | 77 | void log_show(void) |
sgetz7908 | 23:7ca590427f0e | 78 | { |
sgetz7908 | 23:7ca590427f0e | 79 | int cnt = log_get_num_records(); |
sgetz7908 | 23:7ca590427f0e | 80 | log_struct * rec = (log_struct *)PSTORAGE_DATA_START_ADDR; |
sgetz7908 | 23:7ca590427f0e | 81 | |
sgetz7908 | 23:7ca590427f0e | 82 | BLE_UART_xmit("*Num Records="); |
sgetz7908 | 23:7ca590427f0e | 83 | BLE_UART_xmit(cnt); |
sgetz7908 | 23:7ca590427f0e | 84 | BLE_UART_xmit("\n"); |
sgetz7908 | 23:7ca590427f0e | 85 | |
sgetz7908 | 23:7ca590427f0e | 86 | while(rec < (log_struct *)PSTORAGE_DATA_END_ADDR) { |
sgetz7908 | 23:7ca590427f0e | 87 | // show record |
sgetz7908 | 23:7ca590427f0e | 88 | uint32_t offset = read_time_correction(); |
sgetz7908 | 23:7ca590427f0e | 89 | |
sgetz7908 | 23:7ca590427f0e | 90 | if(rec->time == 0xffffffff) break; |
sgetz7908 | 23:7ca590427f0e | 91 | |
sgetz7908 | 23:7ca590427f0e | 92 | // hex numbers |
sgetz7908 | 23:7ca590427f0e | 93 | BLE_UART_xmit("~"); |
sgetz7908 | 23:7ca590427f0e | 94 | BLE_UART_xmit(char2hex(rec->time + offset, 8)); |
sgetz7908 | 23:7ca590427f0e | 95 | BLE_UART_xmit(char2hex(rec->code)); |
sgetz7908 | 23:7ca590427f0e | 96 | BLE_UART_xmit(char2hex(rec->d0)); |
sgetz7908 | 23:7ca590427f0e | 97 | BLE_UART_xmit(char2hex(rec->d1)); |
sgetz7908 | 23:7ca590427f0e | 98 | BLE_UART_xmit(char2hex(rec->d2)); |
sgetz7908 | 23:7ca590427f0e | 99 | |
sgetz7908 | 23:7ca590427f0e | 100 | BLE_UART_xmit("\n"); |
sgetz7908 | 23:7ca590427f0e | 101 | rec++; |
sgetz7908 | 27:bb7247a1704e | 102 | |
sgetz7908 | 27:bb7247a1704e | 103 | BLE &ble = BLE::Instance(); |
sgetz7908 | 27:bb7247a1704e | 104 | ble.waitForEvent(); |
sgetz7908 | 27:bb7247a1704e | 105 | wait(0.100); |
sgetz7908 | 23:7ca590427f0e | 106 | } |
sgetz7908 | 23:7ca590427f0e | 107 | |
sgetz7908 | 23:7ca590427f0e | 108 | //BLE_UART_xmit("Done!\n"); |
sgetz7908 | 23:7ca590427f0e | 109 | } |
sgetz7908 | 23:7ca590427f0e | 110 | |
sgetz7908 | 23:7ca590427f0e | 111 | // add a new log entry |
sgetz7908 | 23:7ca590427f0e | 112 | // |
sgetz7908 | 23:7ca590427f0e | 113 | void log_add(event_t code, char d0, char d1, char d2) |
sgetz7908 | 23:7ca590427f0e | 114 | { |
sgetz7908 | 23:7ca590427f0e | 115 | uint32_t addr = (uint32_t)get_free_record(); |
sgetz7908 | 23:7ca590427f0e | 116 | log_struct rec; |
sgetz7908 | 23:7ca590427f0e | 117 | |
sgetz7908 | 23:7ca590427f0e | 118 | if(addr == 0) return; // error, out of record storage |
sgetz7908 | 23:7ca590427f0e | 119 | |
sgetz7908 | 23:7ca590427f0e | 120 | rec.time = read_clock(); |
sgetz7908 | 23:7ca590427f0e | 121 | rec.code = code; |
sgetz7908 | 23:7ca590427f0e | 122 | rec.d0 = d0; |
sgetz7908 | 23:7ca590427f0e | 123 | rec.d1 = d1; |
sgetz7908 | 23:7ca590427f0e | 124 | rec.d2 = d2; |
sgetz7908 | 23:7ca590427f0e | 125 | if(rec.time==0) rec.time++; // can't have a completely zero record. |
sgetz7908 | 23:7ca590427f0e | 126 | |
sgetz7908 | 24:761c30334cf4 | 127 | //#if UART_DEBUGGING==0 // only do write to flash if not debugging w/BLE |
fdelahan | 40:adabdb1c5abe | 128 | if(log_enable) // allow disabling of event logging through user command - DEW |
fdelahan | 40:adabdb1c5abe | 129 | { |
fdelahan | 40:adabdb1c5abe | 130 | set_radio(false); |
fdelahan | 40:adabdb1c5abe | 131 | wait(1.0); |
fdelahan | 40:adabdb1c5abe | 132 | nrf_nvmc_write_words(addr, (uint32_t *)(&rec), 2); |
fdelahan | 40:adabdb1c5abe | 133 | } |
sgetz7908 | 24:761c30334cf4 | 134 | //#endif |
sgetz7908 | 23:7ca590427f0e | 135 | } |
sgetz7908 | 23:7ca590427f0e | 136 | |
sgetz7908 | 23:7ca590427f0e | 137 | /// Clear Non-Volatile Flag |
sgetz7908 | 23:7ca590427f0e | 138 | void nv_clear(uint32_t addr) |
sgetz7908 | 23:7ca590427f0e | 139 | { |
sgetz7908 | 23:7ca590427f0e | 140 | uint32_t zero = 0; |
sgetz7908 | 23:7ca590427f0e | 141 | |
sgetz7908 | 24:761c30334cf4 | 142 | //#if UART_DEBUGGING==0 // only do write to flash if not debugging w/BLE |
sgetz7908 | 23:7ca590427f0e | 143 | set_radio(false); |
sgetz7908 | 23:7ca590427f0e | 144 | wait(1.0); |
sgetz7908 | 23:7ca590427f0e | 145 | nrf_nvmc_write_words(addr, (uint32_t *)(&zero), 1); |
sgetz7908 | 24:761c30334cf4 | 146 | //#endif |
sgetz7908 | 23:7ca590427f0e | 147 | } |