Integrated version

Revision:
10:a8ec7391a066
Parent:
9:70b8f9935ef7
Child:
11:a2a51191ebe4
--- a/BaseMachineUIController.h	Mon Nov 21 05:12:38 2016 +0000
+++ b/BaseMachineUIController.h	Fri Nov 25 12:13:01 2016 +0000
@@ -4,6 +4,8 @@
  * 2016.11.06 created
  *
  */
+ 
+#define UART_TRACE_EEPROM   (0)
 
 #ifndef _UICONTROLLER_H_
 #define _UICONTROLLER_H_
@@ -14,6 +16,7 @@
 #include "BaseMachineCommon.h"
 
 #include "st7565LCD.h"
+#include "AT24C1024.h"
 #include "PinDetect.h"
 #include "RotaryEncoder.h"
 #include "AverageAnalogIn.h"
@@ -135,6 +138,9 @@
 
         ExioRotEnc1 = new ExioBufferedRotaryEncoder(ExioInBufferA, 6, 7);
         
+        I2c1 = new I2C(PB_9, PB_8);
+        At24c1024 = new AT24C1024(*I2c1);
+        
         //--------------------------------------------------------------------
         // Setup Devices
         //
@@ -246,6 +252,9 @@
         delete ExioInBufferB;
         delete Exio;
         delete Spi3;
+        
+        delete At24c1024;
+        delete I2c1;
     }
     
     void getSequences(Sequence (*pSequences)[SEQUENCE_N]) {
@@ -304,6 +313,19 @@
                 dumpToLCD02();
                 break;
         }
+        
+        switch (spareValue) {
+        case 1:
+            saveToEEPROM();
+            Thread::wait(100);
+            isDirty = true;
+            break;
+        case 2:
+            loadFromEEPROM();
+            Thread::wait(100);
+            isDirty = true;
+            break;
+        }
     }
 
 private:
@@ -316,6 +338,9 @@
     ExioBufferedDebounceIn* ExioInA[5];
     ExioBufferedDebounceIn* ExioIn[8];
     ExioBufferedRotaryEncoder* ExioRotEnc1;
+    
+    I2C* I2c1;
+    AT24C1024* At24c1024;
 
     AverageAnalogIn* AinPulseWidth;
     AverageAnalogIn* AinCutOff;
@@ -550,7 +575,7 @@
             RotEncPitch->setVal(sequences[sequencePattern][editingStep].getPitch());
             
             sequencerDisplay->setSequences(sequences[sequencePattern]);
-            sequencerDisplay->setSequencePattern(sequencePattern + 1);
+            sequencerDisplay->setSequencePattern(sequencePattern);
             isDirty = true;
         }
         
@@ -631,6 +656,124 @@
         
         gLCD->display();
     }
+    
+    void saveToEEPROM()
+    {
+        char buff[64];
+
+        gLCD->clear();
+
+        sprintf(buff, "Save to EEPROM");
+        gLCD->drawstring(0, 0, buff);
+        gLCD->display();
+        
+        #if (UART_TRACE_EEPROM)
+        printf("*** Save Sequences to EEPROM ***\r\n");
+        printf("sequencePattern: %d\r\n", sequencePattern);
+        for (int i = 0; i < SEQUENCE_N; i++) {
+            printf("%d %d %03d %d %d\r\n",
+                i,
+                sequences[sequencePattern][i].isNoteOn(),
+                sequences[sequencePattern][i].getPitch(),
+                sequences[sequencePattern][i].isTie(),
+                sequences[sequencePattern][i].isAccent()
+            );
+        }
+        #endif
+        
+        uint8_t eep_buff[258];
+        uint8_t cnt = 0;
+        for (int i = 0; i < SEQUENCE_N; i++) {
+            eep_buff[cnt++] = sequences[sequencePattern][i].isNoteOn();
+            eep_buff[cnt++] = ((sequences[sequencePattern][i].getPitch() & 0xff00) >> 8); // MSB
+            eep_buff[cnt++] = sequences[sequencePattern][i].getPitch() & 0xff;            // LSB
+            eep_buff[cnt++] = sequences[sequencePattern][i].isTie();
+            eep_buff[cnt++] = sequences[sequencePattern][i].isAccent();
+        }
+        #if (UART_TRACE_EEPROM)
+        printf("size: %d\r\n", cnt);
+        #endif
+        
+        /*
+        for (int i = 0; i < cnt; i++) {
+            printf("%d: %d\r\n", i, eep_buff[i]);
+        }
+        */
+        
+        AT24C_STATUS status = At24c1024->write_page(
+            0x00000, 
+            eep_buff,
+            sizeof(eep_buff)
+        );
+        #if (UART_TRACE_EEPROM)
+        printf("status: %d\r\n", status);
+        #endif
+
+        gLCD->drawstring(0, 1, " Done");
+        gLCD->display();    
+    }
+    
+    void loadFromEEPROM()
+    {
+        char buff[64];
+
+        gLCD->clear();
+
+        sprintf(buff, "Load From EEPROM");
+        gLCD->drawstring(0, 0, buff);
+        gLCD->display();
+        
+        #if (UART_TRACE_EEPROM)
+        printf("*** Load Sequences from EEPROM ***\r\n");
+        #endif
+        
+        uint8_t eep_buff[258];
+
+        AT24C_STATUS status = At24c1024->read_page(
+            0x00000, 
+            eep_buff,
+            sizeof(eep_buff)
+        );
+        
+        #if (UART_TRACE_EEPROM)
+        printf("status: %d\r\n", status);
+        #endif
+        
+        /*
+        for (int i = 0; i < 80; i++) {
+            printf("%d: %d\r\n", i, eep_buff[i]);
+        }
+        */
+        
+        uint8_t cnt = 0;
+        for (int i = 0; i < SEQUENCE_N; i++) {
+            sequences[sequencePattern][i].setNoteOn(eep_buff[cnt++]);
+            int pitch = eep_buff[cnt++] << 8;   // MSB
+            pitch |= eep_buff[cnt++];           // LSB
+            sequences[sequencePattern][i].setPitch(pitch);
+            sequences[sequencePattern][i].setTie(eep_buff[cnt++]);
+            sequences[sequencePattern][i].setAccent(eep_buff[cnt++]);
+        }
+        // syncronize sequence value & Rotary Encoder's value
+        RotEncPitch->setVal(sequences[sequencePattern][editingStep].getPitch());
+
+        #if (UART_TRACE_EEPROM)
+        printf("size: %d\r\n", cnt);
+        printf("sequencePattern: %d\r\n", sequencePattern);
+        for (int i = 0; i < SEQUENCE_N; i++) {
+            printf("%d %d %03d %d %d\r\n",
+                i,
+                sequences[sequencePattern][i].isNoteOn(),
+                sequences[sequencePattern][i].getPitch(),
+                sequences[sequencePattern][i].isTie(),
+                sequences[sequencePattern][i].isAccent()
+            );
+        }
+        #endif
+
+        gLCD->drawstring(0, 1, " Done");
+        gLCD->display();  
+    }
 };
 
 #endif //_UICONTROLLER_H_