From ec643130d0c49ee4b510f9a909da75d9fdb5454b Mon Sep 17 00:00:00 2001
From: Damien <damien.p.george@gmail.com>
Date: Wed, 11 Dec 2013 00:38:40 +0000
Subject: [PATCH] stm: add timer to storage cache so it can be flushed.

---
 stm/storage.c | 9 +++++++++
 stm/storage.h | 1 +
 2 files changed, 10 insertions(+)

diff --git a/stm/storage.c b/stm/storage.c
index 769abde69..ac0458d13 100644
--- a/stm/storage.c
+++ b/stm/storage.c
@@ -2,6 +2,7 @@
 #include "std.h"
 
 #include "misc.h"
+#include "systick.h"
 #include "led.h"
 #include "flash.h"
 #include "storage.h"
@@ -17,6 +18,7 @@ static uint32_t cache_flash_sector_id;
 static uint32_t cache_flash_sector_start;
 static uint32_t cache_flash_sector_size;
 static bool cache_dirty;
+static uint32_t sys_tick_counter_last_write;
 
 static void cache_flush(void) {
     if (cache_dirty) {
@@ -50,6 +52,7 @@ void storage_init(void) {
         cache_flash_sector_id = 0;
         cache_dirty = false;
         is_initialised = true;
+        sys_tick_counter_last_write = 0;
     }
 }
 
@@ -61,6 +64,11 @@ uint32_t storage_get_block_count(void) {
     return FLASH_PART1_START_BLOCK + FLASH_PART1_NUM_BLOCKS;
 }
 
+bool storage_needs_flush(void) {
+    // wait 2 seconds after last write to flush
+    return cache_dirty && sys_tick_has_passed(sys_tick_counter_last_write, 2000);
+}
+
 void storage_flush(void) {
     cache_flush();
 }
@@ -143,6 +151,7 @@ bool storage_write_block(const uint8_t *src, uint32_t block) {
         uint32_t flash_addr = FLASH_MEM_START_ADDR + (block - FLASH_PART1_START_BLOCK) * BLOCK_SIZE;
         uint8_t *dest = cache_get_addr_for_write(flash_addr);
         memcpy(dest, src, BLOCK_SIZE);
+        sys_tick_counter_last_write = sys_tick_counter;
         return true;
 
     } else {
diff --git a/stm/storage.h b/stm/storage.h
index 8a8459c9e..fe37e8b27 100644
--- a/stm/storage.h
+++ b/stm/storage.h
@@ -1,6 +1,7 @@
 void storage_init(void);
 uint32_t storage_get_block_size(void);
 uint32_t storage_get_block_count(void);
+bool storage_needs_flush(void);
 void storage_flush(void);
 bool storage_read_block(uint8_t *dest, uint32_t block);
 bool storage_write_block(const uint8_t *src, uint32_t block);
-- 
GitLab