Simple counter class, non-volatile between resets and power on/off.
Simple Counter class, used to store count array in non-volatile flash memory between resets and power on/off.
Counter.cpp@2:f02ac448ecd3, 2018-11-12 (annotated)
- Committer:
- kpan
- Date:
- Mon Nov 12 19:08:35 2018 +0000
- Revision:
- 2:f02ac448ecd3
- Parent:
- 1:e8eeddee2959
- Child:
- 3:c15c22484205
Changed some varnames
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kpan | 0:693f2f97c8c1 | 1 | #include "Counter.h" |
kpan | 0:693f2f97c8c1 | 2 | |
kpan | 2:f02ac448ecd3 | 3 | //#define COUNTER_DEBUG |
kpan | 2:f02ac448ecd3 | 4 | |
kpan | 0:693f2f97c8c1 | 5 | #ifdef COUNTER_DEBUG |
kpan | 0:693f2f97c8c1 | 6 | Serial debug_out(USBTX, USBRX); |
kpan | 0:693f2f97c8c1 | 7 | #endif |
kpan | 0:693f2f97c8c1 | 8 | Counter::Counter() |
kpan | 0:693f2f97c8c1 | 9 | { |
kpan | 2:f02ac448ecd3 | 10 | is_new_count = flash_size() - SECTOR_SIZE; |
kpan | 0:693f2f97c8c1 | 11 | address = (int)((int*)(flash_size() - SECTOR_SIZE) + 1); |
kpan | 0:693f2f97c8c1 | 12 | #ifdef COUNTER_DEBUG |
kpan | 0:693f2f97c8c1 | 13 | debug_out.printf("Constructing Object...\r\n"); |
kpan | 0:693f2f97c8c1 | 14 | #endif |
kpan | 1:e8eeddee2959 | 15 | for(int i=0; i<MAX_LEN; i++) |
kpan | 1:e8eeddee2959 | 16 | count[i] = 0; |
kpan | 0:693f2f97c8c1 | 17 | this->init(); |
kpan | 0:693f2f97c8c1 | 18 | } |
kpan | 0:693f2f97c8c1 | 19 | |
kpan | 0:693f2f97c8c1 | 20 | #ifdef COUNTER_DEBUG |
kpan | 0:693f2f97c8c1 | 21 | void Counter::print_memory() |
kpan | 0:693f2f97c8c1 | 22 | { |
kpan | 0:693f2f97c8c1 | 23 | int *ptr = (int*) address; |
kpan | 0:693f2f97c8c1 | 24 | debug_out.printf("PartyID\tVoteCt\tMemCt\tAddress\r\n"); |
kpan | 1:e8eeddee2959 | 25 | for(int i=0; i<MAX_LEN; i++) { |
kpan | 1:e8eeddee2959 | 26 | debug_out.printf("%dID\t%d\t%d\t%p\r\n", i, count[i], ptr[i], (ptr+i)); |
kpan | 0:693f2f97c8c1 | 27 | } |
kpan | 0:693f2f97c8c1 | 28 | } |
kpan | 0:693f2f97c8c1 | 29 | #endif |
kpan | 0:693f2f97c8c1 | 30 | |
kpan | 0:693f2f97c8c1 | 31 | void Counter::init() |
kpan | 0:693f2f97c8c1 | 32 | { |
kpan | 0:693f2f97c8c1 | 33 | #ifdef COUNTER_DEBUG |
kpan | 0:693f2f97c8c1 | 34 | debug_out.printf("Initializing...\r\n"); |
kpan | 0:693f2f97c8c1 | 35 | #endif |
kpan | 2:f02ac448ecd3 | 36 | if(*((int*)is_new_count) == -1) { // then we know it hasn't been initialized yet |
kpan | 2:f02ac448ecd3 | 37 | erase_sector(is_new_count); |
kpan | 0:693f2f97c8c1 | 38 | int zero = 0; |
kpan | 2:f02ac448ecd3 | 39 | program_flash(is_new_count, (char*)&zero, sizeof(int)); |
kpan | 1:e8eeddee2959 | 40 | memwrite(); |
kpan | 0:693f2f97c8c1 | 41 | } else { |
kpan | 1:e8eeddee2959 | 42 | memread(); |
kpan | 0:693f2f97c8c1 | 43 | } |
kpan | 0:693f2f97c8c1 | 44 | #ifdef COUNTER_DEBUG |
kpan | 0:693f2f97c8c1 | 45 | print_memory(); |
kpan | 0:693f2f97c8c1 | 46 | #endif |
kpan | 0:693f2f97c8c1 | 47 | } |
kpan | 0:693f2f97c8c1 | 48 | |
kpan | 1:e8eeddee2959 | 49 | void Counter::memwrite() |
kpan | 0:693f2f97c8c1 | 50 | { |
kpan | 0:693f2f97c8c1 | 51 | #ifdef COUNTER_DEBUG |
kpan | 0:693f2f97c8c1 | 52 | debug_out.printf("Writing to Flash\r\n"); |
kpan | 0:693f2f97c8c1 | 53 | #endif |
kpan | 0:693f2f97c8c1 | 54 | erase_sector(address); |
kpan | 0:693f2f97c8c1 | 55 | int zero = 0; |
kpan | 2:f02ac448ecd3 | 56 | program_flash(is_new_count, (char*)&zero, sizeof(int)); |
kpan | 1:e8eeddee2959 | 57 | program_flash(address, (char*)&count, sizeof(int) * MAX_LEN); |
kpan | 0:693f2f97c8c1 | 58 | #ifdef COUNTER_DEBUG |
kpan | 0:693f2f97c8c1 | 59 | print_memory(); |
kpan | 0:693f2f97c8c1 | 60 | #endif |
kpan | 0:693f2f97c8c1 | 61 | } |
kpan | 0:693f2f97c8c1 | 62 | |
kpan | 1:e8eeddee2959 | 63 | void Counter::memread() |
kpan | 0:693f2f97c8c1 | 64 | { |
kpan | 0:693f2f97c8c1 | 65 | #ifdef COUNTER_DEBUG |
kpan | 0:693f2f97c8c1 | 66 | debug_out.printf("Reading from Flash\r\n"); |
kpan | 0:693f2f97c8c1 | 67 | #endif |
kpan | 1:e8eeddee2959 | 68 | for(int i=0; i<MAX_LEN; i++) { |
kpan | 1:e8eeddee2959 | 69 | count[i] = *((int*)address+i); |
kpan | 0:693f2f97c8c1 | 70 | } |
kpan | 0:693f2f97c8c1 | 71 | } |
kpan | 0:693f2f97c8c1 | 72 | |
kpan | 0:693f2f97c8c1 | 73 | void Counter::increment(int party_id) |
kpan | 0:693f2f97c8c1 | 74 | { |
kpan | 0:693f2f97c8c1 | 75 | #ifdef COUNTER_DEBUG |
kpan | 0:693f2f97c8c1 | 76 | debug_out.printf("Incrementing %d\r\n", party_id); |
kpan | 0:693f2f97c8c1 | 77 | #endif |
kpan | 1:e8eeddee2959 | 78 | count[party_id]++; |
kpan | 1:e8eeddee2959 | 79 | memwrite(); |
kpan | 0:693f2f97c8c1 | 80 | } |