Integrated version
Diff: BaseMachineUIController.h
- 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_