From f68623eba5fa02c9e3bfdda5b6f0f07493de6f39 Mon Sep 17 00:00:00 2001
From: Benjamin Koch <bbbsnowball@gmail.com>
Date: Fri, 9 Jun 2023 20:35:09 +0200
Subject: [PATCH] add page offset for flash read

The record number of Modbus is not enough to address 2 MB of flash
memory so we add an additional offset.
---
 firmware/rust1/src/bin/heizung.rs | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/firmware/rust1/src/bin/heizung.rs b/firmware/rust1/src/bin/heizung.rs
index 053e15b..af64a4f 100644
--- a/firmware/rust1/src/bin/heizung.rs
+++ b/firmware/rust1/src/bin/heizung.rs
@@ -335,6 +335,7 @@ struct ModBusRegs<'a> {
     adc_data: &'a AdcData,
     device_state: u16,
     scratch: u16,
+    page_offset_for_flash_read: u16,
     uf2updater: UF2UpdateHandler<FLASH_SIZE>,
 
     consistent_read_type: ReadType,
@@ -462,6 +463,7 @@ impl<'a> ModbusRegisters for ModBusRegs<'a> {
             0 => Ok(self.device_state),
             1 => Ok(42),
             2 => Ok(self.scratch),
+            3 => Ok(self.page_offset_for_flash_read),
             _ => Err(ModbusErrorCode::IllegalDataAddress),
         }
     }
@@ -507,6 +509,7 @@ impl<'a> ModbusRegisters for ModBusRegs<'a> {
                 }
             },
             2 => { self.scratch = value; Ok(value) },
+            3 => { self.page_offset_for_flash_read = value; Ok(value) },
             _ => Err(ModbusErrorCode::IllegalDataAddress),
         }
     }
@@ -528,7 +531,8 @@ impl<'a> ModbusRegisters for ModBusRegs<'a> {
             },
             (6, 1) => {
                 pusher.push_fn(record_length as usize * 2, |buf| {
-                    self.uf2updater.flash.read(record_number as u32 * 2, buf)
+                    let flash_addr = self.page_offset_for_flash_read as u32 * 512 + record_number as u32 * 2;
+                    self.uf2updater.flash.read(flash_addr, buf)
                         .map_err(|err| {
                             info!("Error reading flash: {:?}", err);
                             ModbusErrorCode::ServerDeviceFailure
@@ -631,6 +635,7 @@ async fn main2(spawner: Spawner) {
             adc_data: &ADC_DATA,
             device_state: DEVICE_STATE_RESET | DEVICE_STATE_RESPOND_DETECT,
             scratch: 0,
+            page_offset_for_flash_read: 0,
             uf2updater: UF2UpdateHandler::new(p.FLASH),
             consistent_read_type: ReadType::InputRegister,
             consistent_read_addr: u16::default(),
-- 
GitLab