Added battery type setting and detailed battery info in ABOUT menu (support for NiMH and LiPo batteries). Added lip sensor activated harmonic series, with settings for range and series type. Added NuRAD overview drawing. Changes to CC lables (from 1 & 2 to A & B).

This commit is contained in:
Johan Berglund 2020-04-27 11:19:08 +02:00
parent 85028a3627
commit 9a2e6b002f
18 changed files with 228 additions and 23 deletions

0
NuEVI/FilterOnePole.cpp Normal file → Executable file
View file

0
NuEVI/FilterOnePole.h Normal file → Executable file
View file

View file

@ -90,6 +90,9 @@ unsigned short levelCC; // 0-127
unsigned short levelVal; // 0-127
unsigned short fingering; // 0-4 EWI,EWX,SAX,EVI,EVR
unsigned short lpinky3; // 0-25 (OFF, -12 - MOD - +12)
unsigned short batteryType; // 0-2 ALK,NIM,LIP
unsigned short harmSetting; // 0-7
unsigned short harmSelect; // 0-4
unsigned short vibSens = 2; // vibrato sensitivity
unsigned short vibRetn = 2; // vibrato return speed
@ -128,6 +131,10 @@ int calOffsetRH[12] = {-88,-68,-31,13,4,120,121,-68,-85,-34,23,87};
int calOffsetLH[12] = {90,-13,-33,-93,-82,115,118,2,4,-40,-75,-94};
#endif
int battMeasured[50];
int battAvg = 0;
byte battCheckPos = 0;
// the following variables are unsigned longs because the time, measured in
// milliseconds, will quickly become a bigger number than can be stored in an int.
@ -194,6 +201,8 @@ byte extracIsOn=0;
int oldextrac=0;
int oldextrac2=0;
int harmonics = 0;
int pitchBend=8192;
int oldpb=8192;
int vibSignal=0;
@ -255,6 +264,12 @@ const byte saxFingerMatch[17][11] =
{0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2}, // C# (-0 semis)
};
const int harmonicResult[5][7] = {{ 0, 7, 12, 16, 19, 22, 24 }, //HRM
{ 0, 7, 12, 19, 24, 31, 36 }, //5TH
{ 0, 12, 24, 36, 48, 60, 72 }, //OCT
{ 0, -5, -12, -17, -24, -29, -36 }, //5DN
{ 0, -12, -24, -36, -48, -60, -72 }}; //ODN
const int saxFingerResult[17] = {-14, -13, -12, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -3, -2, -1, 0};
byte saxFinger[11];
@ -472,7 +487,7 @@ void setup() {
showVersion();
delay(1500);
delay(1400);
}
mainState = NOTE_OFF; // initialize main state machine
@ -486,6 +501,10 @@ void setup() {
midiSendControlChange(levelCC, levelVal);
}
for (int i=0; i<50; i++){
battMeasured[i] = analogRead(vMeterPin);
delay(1);
}
activeMIDIchannel = MIDIchannel;
midiInitialize(MIDIchannel);
@ -941,6 +960,7 @@ void loop() {
#else
if (gateOpenEnable || gateOpen) doorKnobCheck();
#endif
battCheck();
if (((pinkySetting == LVL) || (pinkySetting == LVLP) || (pinkySetting == GLD)) && pinkyKey && (mainState == NOTE_OFF)){
// show LVL indication
} else updateSensorLEDs();
@ -1225,6 +1245,17 @@ void doorKnobCheck() {
//***********************************************************
void battCheck(){
battMeasured[battCheckPos] = analogRead(vMeterPin);
battAvg = 0;
for (int i=0; i<50; i++){
battAvg += battMeasured[i];
}
battAvg /= 50;
battCheckPos++;
if (battCheckPos == 50) battCheckPos = 0;
}
void extraController() {
bool CC2sw = false;
bool CC1sw = false;
@ -1254,11 +1285,28 @@ void extraController() {
CC2sw = false;
CC1sw = true;
}
} else if (pinkySetting == ECH){
if (pinkyKey){
//extra controller harmonics only
CC2sw = false;
CC1sw = false;
} else {
//send extra controller primary CC only
CC2sw = false;
CC1sw = true;
}
} else {
//send both primary CC and CC2
CC2sw = true;
CC1sw = true;
}
if ((harmSetting && (pinkySetting != ECH)) || ((pinkySetting == ECH) && pinkyKey)){
harmonics = map(constrain(exSensor, extracThrVal, extracMaxVal), extracThrVal, extracMaxVal, 0, harmSetting);
} else if ((pinkySetting == ECH) && !pinkyKey) {
harmonics = 0;
}
if ((extraCT || extraCT2) && (exSensor >= extracThrVal)) { // if we are enabled and over the threshold, send data
if (!extracIsOn) {
extracIsOn = 1;
@ -1544,7 +1592,7 @@ void readSwitches() {
+ (6-octaveR)*12; //Octave rollers, reversed
}
int fingeredNoteRead = fingeredNoteUntransposed + transpose - 12 + qTransp;
int fingeredNoteRead = fingeredNoteUntransposed + transpose - 12 + qTransp + harmonicResult[harmSelect][harmonics]; //lip sensor harmonics
if (pinkyKey) pitchlatch = fingeredNoteUntransposed; //use pitchlatch to make settings based on note fingered
@ -1603,7 +1651,7 @@ void readSwitches() {
if (4 == trill3_interval) fingeredNoteUntransposed+=2; else fingeredNoteUntransposed+=4;
}
int fingeredNoteRead = fingeredNoteUntransposed + (octave - 3) * 12 + transpose - 12 + qTransp;
int fingeredNoteRead = fingeredNoteUntransposed + (octave - 3) * 12 + transpose - 12 + qTransp + harmonicResult[harmSelect][harmonics]; //lip sensor harmonics
pcCombo1 = (K1 && K5 && !K2 && !K3);
pcCombo2 = (K2 && K6 && !K1 && !K3);

0
NuEVI/adjustmenu.cpp Normal file → Executable file
View file

View file

@ -5,7 +5,7 @@
// Compile options, comment/uncomment to change
#define FIRMWARE_VERSION "1.4.5" // FIRMWARE VERSION NUMBER HERE <<<<<<<<<<<<<<<<<<<<<<<
#define FIRMWARE_VERSION "1.4.6" // FIRMWARE VERSION NUMBER HERE <<<<<<<<<<<<<<<<<<<<<<<
#define ON_Delay 20 // Set Delay after ON threshold before velocity is checked (wait for tounging peak)
#define CCN_Port 5 // Controller number for portamento level
@ -38,6 +38,15 @@
#define MIN_LED_BRIGHTNESS 5 // lowest PWM value that still is visible
#define BREATH_LED_BRIGHTNESS 500 // up to 4095, PWM
#define PORTAM_LED_BRIGHTNESS 500 // up to 4095, PWM
#define EXTCON_LED_BRIGHTNESS 500 // up to 4095, PWM
#define SPCKEY_LED_BRIGHTNESS 500 // up to 4095, PWM
#define ALK_BAT_FULL 2800 // about 4.6V
#define NMH_BAT_FULL 2350 // about 3.8V
#define LIP_BAT_FULL 2550 // about 4.2V
#define ALK_BAT_LOW 2300 // about 3.8V
#define NMH_BAT_LOW 2200 // about 3.6V
#define LIP_BAT_LOW 2250 // about 3.7V
#endif

View file

@ -25,6 +25,7 @@
#define LVL 27
#define LVLP 28
#define GLD 29
#define ECH 30
#define MOD 13
@ -85,6 +86,9 @@ extern unsigned short levelCC; // 0-127
extern unsigned short levelVal; // 0-127
extern unsigned short fingering; // 0-4 EWI,EWX,SAX,EVI,EVR
extern unsigned short lpinky3; // 0-25 (OFF, -12 - MOD - +12)
extern unsigned short batteryType; // 0-2 ALK,NIM,LIP
extern unsigned short harmSetting; // 0-7
extern unsigned short harmSelect; // 0-4
extern uint16_t gateOpenEnable;
extern uint16_t specialKeyEnable;
extern byte rotatorOn;
@ -134,6 +138,8 @@ extern int vibZeroBite;
extern int vibThrBite;
extern int vibThrBiteLo;
extern int battAvg;
extern int breathLevel;
extern byte portIsOn;
extern int oldport;

View file

@ -2,7 +2,7 @@
#define __HARDWARE_H
#define REVB
#define NURAD
//#define NURAD
#if defined(NURAD) //NuRAD <<<<<<<<<<<<<<<<<<<<<<<

0
NuEVI/led.cpp Normal file → Executable file
View file

0
NuEVI/led.h Normal file → Executable file
View file

View file

@ -202,6 +202,31 @@ extern const MenuPage mainMenuPage; // Forward declaration.
#define OLED_RESET 4
Adafruit_SSD1306 display(128, 64, &Wire, OLED_RESET);
int drawBatt(int x,int y){
display.drawRect(x+1,y,3,3,WHITE);
display.drawRect(x,y+2,5,12,WHITE);
int bar=0;
int vMeterReading = battAvg;
switch (batteryType){
case 0:
bar = constrain((10 *(vMeterReading - ALK_BAT_LOW)) / (ALK_BAT_FULL - ALK_BAT_LOW),0,10);
break;
case 1:
bar = constrain((10 * (vMeterReading - NMH_BAT_LOW)) / (NMH_BAT_FULL - NMH_BAT_LOW),0,10);
break;
case 2:
bar = constrain((10 *(vMeterReading - LIP_BAT_LOW)) / (LIP_BAT_FULL - LIP_BAT_LOW),0,10);
}
display.fillRect(x+1,y+13-bar,3,constrain(bar,0,10),WHITE);
return bar;
}
void drawFlash(int x, int y){
display.drawLine(x+5,y,x,y+6,WHITE);
display.drawLine(x,y+6,x+5,y+6,WHITE);
display.drawLine(x,y+12,x+5,y+6,WHITE);
}
void initDisplay() {
// by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
@ -375,12 +400,23 @@ static void mainTitleGetStr(char* out) {
char* splice1 = menuTitle + 13;
char* splice2 = menuTitle + 17;
int vMeterReading = analogRead(vMeterPin);
memcpy(splice1, (vMeterReading > 3000) ? "USB" : "BAT", 3);
if (vMeterReading < 2294) {
int vMeterReading = battAvg;
memcpy(splice1, (vMeterReading > 3020) ? "USB" : "BAT", 3);
int vLowLimit;
switch (batteryType){
case 0:
vLowLimit = ALK_BAT_LOW;
break;
case 1:
vLowLimit = NMH_BAT_LOW;
break;
case 2:
vLowLimit = LIP_BAT_LOW;
}
if (vMeterReading < vLowLimit) { //2300 alkaline, 2250 lipo, 2200 nimh
memcpy(splice2, "LOW ", 4);
} else {
int voltage = map(vMeterReading,0,3030,0,50);
int voltage = map(vMeterReading,2200,3060,36,50);
splice2[0] = (voltage/10)+'0';
splice2[2] = (voltage%10)+'0';
}
@ -705,12 +741,28 @@ const MenuEntrySub wlChannelMenu = {
, nullptr
};
// Battery type menu
const MenuEntrySub batteryTypeMenu = {
MenuType::ESub, "BAT TYPE", "BAT TYPE", &batteryType, 0, 2, MenuEntryFlags::EMenuEntryWrap,
[](SubMenuRef __unused, char* out, const char** __unused unit) {
const char* breathCCMenuLabels[] = { "ALK", "NMH", "LIP" };
strncpy(out, breathCCMenuLabels[batteryType], 4);
},
[](const MenuEntrySub & __unused sub){
if (readSetting(BATTYPE_ADDR) != batteryType) {
writeSetting(BATTYPE_ADDR,batteryType);
}
}
, nullptr
};
#if defined(NURAD)
const MenuEntry* extrasMenuEntries[] = {
(MenuEntry*)&legacyPBMenu,
(MenuEntry*)&legacyBRMenu,
(MenuEntry*)&specialKeyMenu,
(MenuEntry*)&dacModeMenu,
(MenuEntry*)&batteryTypeMenu,
(MenuEntry*)&fastBootMenu,
(MenuEntry*)&wlPowerMenu,
(MenuEntry*)&wlChannelMenu,
@ -724,6 +776,7 @@ const MenuEntry* extrasMenuEntries[] = {
(MenuEntry*)&trill3Menu,
(MenuEntry*)&bcasModeMenu,
(MenuEntry*)&dacModeMenu,
(MenuEntry*)&batteryTypeMenu,
(MenuEntry*)&fastBootMenu,
(MenuEntry*)&wlPowerMenu,
(MenuEntry*)&wlChannelMenu,
@ -786,7 +839,7 @@ const MenuPage mainMenuPage = {
// Breath menu
const MenuEntrySub breathCCMenu = {
MenuType::ESub, "BRTH CC1", "BRTH CC1", &breathCC, 0, 10, MenuEntryFlags::EMenuEntryWrap,
MenuType::ESub, "BRTH CC A", "BRTH CC A", &breathCC, 0, 10, MenuEntryFlags::EMenuEntryWrap,
[](SubMenuRef __unused, char* out, const char** __unused unit) {
const char* breathCCMenuLabels[] = { "OFF", "MW", "BR", "VL", "EX", "MW+",
"BR+", "VL+", "EX+", "CF", "UNO" };
@ -802,7 +855,7 @@ const MenuEntrySub breathCCMenu = {
};
const MenuEntrySub breathCC2Menu = {
MenuType::ESub, "BRTH CC2", "BRTH CC2", &breathCC2, 0, 127, MenuEntryFlags::EMenuEntryWrap,
MenuType::ESub, "BRTH CC B", "BRTH CC B", &breathCC2, 0, 127, MenuEntryFlags::EMenuEntryWrap,
[](SubMenuRef __unused, char* out, const char** __unused unit) {
if(breathCC2) numToString(breathCC2, out);
else strncpy(out, "OFF", 4);
@ -817,7 +870,7 @@ const MenuEntrySub breathCC2Menu = {
};
const MenuEntrySub breathCC2RiseMenu = {
MenuType::ESub, "CC2 RISE", "CC2 RISE", &breathCC2Rise, 1, 10, MenuEntryFlags::EMenuEntryWrap,
MenuType::ESub, "CC B RISE", "CC B RISE", &breathCC2Rise, 1, 10, MenuEntryFlags::EMenuEntryWrap,
[](SubMenuRef __unused, char *out, const char** label) {
numToString(breathCC2Rise, out);
*label = "X";
@ -940,7 +993,7 @@ const MenuEntrySub pitchBendMenu = {
};
const MenuEntrySub extraMenu = {
MenuType::ESub, "EXTRA CTR", "EXTRA CTR", &extraCT, 0,4, MenuEntryFlags::EMenuEntryWrap,
MenuType::ESub, "EXCT CC A", "EXCT CC A", &extraCT, 0,4, MenuEntryFlags::EMenuEntryWrap,
[](SubMenuRef __unused,char* out, const char** __unused unit) {
const char* extraMenuLabels[] = { "OFF", "MW", "FP", "CF", "SP" };
strncpy(out, extraMenuLabels[extraCT], 12);
@ -950,7 +1003,7 @@ const MenuEntrySub extraMenu = {
};
const MenuEntrySub extraCC2Menu = {
MenuType::ESub, "EXCTR CC2", "EXCTR CC2", &extraCT2, 0, 127, MenuEntryFlags::EMenuEntryWrap,
MenuType::ESub, "EXCT CC B", "EXCT CC B", &extraCT2, 0, 127, MenuEntryFlags::EMenuEntryWrap,
[](SubMenuRef __unused, char* out, const char** __unused unit) {
if(extraCT2) numToString(extraCT2, out);
else strncpy(out, "OFF", 4);
@ -959,6 +1012,30 @@ const MenuEntrySub extraCC2Menu = {
, nullptr
};
const MenuEntrySub harmonicsMenu = {
MenuType::ESub, "EXCT HARM", "HARM RANGE", &harmSetting, 0, 6, MenuEntryFlags::EMenuEntryWrap,
[](SubMenuRef __unused, char* out, const char** __unused unit) {
if(harmSetting) numToString(harmSetting, out);
else strncpy(out, "OFF", 4);
},
[](const MenuEntrySub & __unused sub) { writeSetting(HARMSET_ADDR,harmSetting); }
, nullptr
};
const MenuEntrySub harmSelectMenu = {
MenuType::ESub, "HARM SEL", "SERIES", &harmSelect, 0, 4, MenuEntryFlags::EMenuEntryWrap,
[](SubMenuRef __unused, char* out, const char** __unused unit) {
const char* harmSelectMenuLabels[] = { "HMS", "5TH", "OCT", "5DN", "ODN" };
strncpy(out, harmSelectMenuLabels[harmSelect], 4);
},
[](const MenuEntrySub & __unused sub){
if (readSetting(HARMSEL_ADDR) != harmSelect) {
writeSetting(HARMSEL_ADDR,harmSelect);
}
}
, nullptr
};
const MenuEntryStateCh vibratoSubMenu = { MenuType::EStateChange, "VIBRATO", VIBRATO_MENU };
const MenuEntrySub deglitchMenu = {
@ -976,25 +1053,27 @@ const MenuEntrySub deglitchMenu = {
#if defined(NURAD)
const MenuEntrySub pinkyMenu = {
MenuType::ESub, "MOD KEY", "MOD KEY", &pinkySetting, 0, 29, MenuEntryFlags::ENone,
MenuType::ESub, "MOD KEY", "MOD KEY", &pinkySetting, 0, 30, MenuEntryFlags::ENone,
[](SubMenuRef __unused,char* textBuffer, const char** __unused unit) {
#else
const MenuEntrySub pinkyMenu = {
MenuType::ESub, "PINKY KEY", "PINKY KEY", &pinkySetting, 0, 29, MenuEntryFlags::ENone,
MenuType::ESub, "PINKY KEY", "PINKY KEY", &pinkySetting, 0, 30, MenuEntryFlags::ENone,
[](SubMenuRef __unused,char* textBuffer, const char** __unused unit) {
#endif
if (pinkySetting == PBD)
strncpy(textBuffer, "PBD", 4);
else if (pinkySetting == EC2)
strncpy(textBuffer, "EC2", 4);
strncpy(textBuffer, "ECB", 4);
else if (pinkySetting == ECSW)
strncpy(textBuffer, "ECS", 4);
else if (pinkySetting == LVL)
strncpy(textBuffer, "LVL", 4);
else if (pinkySetting == LVLP)
strncpy(textBuffer, "LVP", 4);
else if (pinkySetting == GLD)
else if (pinkySetting == GLD)
strncpy(textBuffer, "GLD", 4);
else if (pinkySetting == ECH)
strncpy(textBuffer, "ECH", 4);
else
numToString(pinkySetting-12, textBuffer, true);
},
@ -1040,6 +1119,8 @@ const MenuEntry* controlMenuEntries[] = {
(MenuEntry*)&portMenu,
(MenuEntry*)&extraMenu,
(MenuEntry*)&extraCC2Menu,
(MenuEntry*)&harmonicsMenu,
(MenuEntry*)&harmSelectMenu,
(MenuEntry*)&vibratoSubMenu,
(MenuEntry*)&deglitchMenu,
(MenuEntry*)&pinkyMenu,
@ -1053,6 +1134,8 @@ const MenuEntry* controlMenuEntries[] = {
(MenuEntry*)&portMenu,
(MenuEntry*)&extraMenu,
(MenuEntry*)&extraCC2Menu,
(MenuEntry*)&harmonicsMenu,
(MenuEntry*)&harmSelectMenu,
(MenuEntry*)&vibratoSubMenu,
(MenuEntry*)&deglitchMenu,
(MenuEntry*)&pinkyMenu,
@ -1193,7 +1276,7 @@ const MenuPageCustom aboutMenuPage = { nullptr, EMenuPageCustom,
static uint32_t timer = 0;
if(stateFirstRun) {
display.clearDisplay();
timer = timeNow + 3000;
timer = timeNow + 3500;
stateFirstRun = 0;
display.setCursor(49,0);
display.setTextColor(WHITE);
@ -1206,6 +1289,49 @@ const MenuPageCustom aboutMenuPage = { nullptr, EMenuPageCustom,
display.setCursor(16,12);
display.print("firmware v.");
display.println(FIRMWARE_VERSION);
int vMeterReading = battAvg;
int voltage = map(vMeterReading,2200,3060,36,50);
display.setCursor(16,32);
if (vMeterReading > 3020){
drawFlash(4,34);
display.print("USB power");
display.setCursor(16,42);
display.print(voltage/10);
display.print(".");
display.print(voltage%10);
display.print("v");
} else {
int bar = drawBatt(4,34);
if (0 == batteryType) {
display.println("Alkaline battery");
display.setCursor(16,42);
display.print(bar);
display.print("0 % at ");
display.print(voltage/10);
display.print(".");
display.print(voltage%10);
display.print("v");
} else if (1 == batteryType) {
display.println("NiMH battery");
display.setCursor(16,42);
display.print(bar);
display.print("0 % at ");
display.print(voltage/10);
display.print(".");
display.print(voltage%10);
display.print("v");
} else if (2 == batteryType) {
display.println("LiPo battery");
display.setCursor(16,42);
display.print(bar);
display.print("0 % at ");
display.print(voltage/10);
display.print(".");
display.print(voltage%10);
display.print("v");
}
}
return true;
} else {
@ -1654,6 +1780,8 @@ static KeyState readInput(uint32_t timeNow) {
return keys;
}
void menu() {
unsigned long timeNow = millis();

0
NuEVI/menu.h Normal file → Executable file
View file

0
NuEVI/midi.cpp Normal file → Executable file
View file

0
NuEVI/midi.h Normal file → Executable file
View file

0
NuEVI/name.c Normal file → Executable file
View file

0
NuEVI/numenu.cpp Normal file → Executable file
View file

0
NuEVI/numenu.h Normal file → Executable file
View file

View file

@ -114,6 +114,12 @@ void readEEPROM(const bool factoryReset) {
writeSetting(FINGER_ADDR, FINGER_FACTORY);
writeSetting(LPINKY3_ADDR, LPINKY3_FACTORY);
}
if(settingsVersion < 35) {
writeSetting(BATTYPE_ADDR, BATTYPE_FACTORY);
writeSetting(HARMSET_ADDR, HARMSET_FACTORY);
writeSetting(HARMSEL_ADDR, HARMSEL_FACTORY);
}
writeSetting(VERSION_ADDR, EEPROM_VERSION);
}
@ -143,7 +149,7 @@ void readEEPROM(const bool factoryReset) {
curve = readSettingBounded(BREATHCURVE_ADDR, 0, 12, BREATHCURVE_FACTORY);
velSmpDl = readSettingBounded(VEL_SMP_DL_ADDR, 0, 30, VEL_SMP_DL_FACTORY);
velBias = readSettingBounded(VEL_BIAS_ADDR, 0, 9, VEL_BIAS_FACTORY);
pinkySetting = readSettingBounded(PINKY_KEY_ADDR, 0, 29, PINKY_KEY_FACTORY);
pinkySetting = readSettingBounded(PINKY_KEY_ADDR, 0, 30, PINKY_KEY_FACTORY);
fastPatch[0] = readSettingBounded(FP1_ADDR, 0, 127, 0);
fastPatch[1] = readSettingBounded(FP2_ADDR, 0, 127, 0);
fastPatch[2] = readSettingBounded(FP3_ADDR, 0, 127, 0);
@ -174,6 +180,9 @@ void readEEPROM(const bool factoryReset) {
levelVal = readSettingBounded(LEVEL_VAL_ADDR, 0, 127, LEVEL_VAL_FACTORY);
fingering = readSettingBounded(FINGER_ADDR, 0, 4, FINGER_FACTORY);
lpinky3 = readSettingBounded(LPINKY3_ADDR, 0, 25, LPINKY3_FACTORY);
batteryType = readSettingBounded(BATTYPE_ADDR, 0, 2, BATTYPE_FACTORY);
harmSetting = readSettingBounded(HARMSET_ADDR, 0, 6, HARMSET_FACTORY);
harmSelect = readSettingBounded(HARMSEL_ADDR, 0, 4, HARMSEL_FACTORY);
//Flags stored in bit field
fastBoot = (dipSwBits & (1<<DIPSW_FASTBOOT))?1:0;

View file

@ -60,9 +60,11 @@
#define LEVEL_VAL_ADDR 106
#define FINGER_ADDR 108
#define LPINKY3_ADDR 110
#define BATTYPE_ADDR 112
#define HARMSET_ADDR 114
#define HARMSEL_ADDR 116
#define EEPROM_SIZE 112
#define EEPROM_SIZE 118
//DAC output modes
@ -79,7 +81,7 @@
//"factory" values for settings
#define EEPROM_VERSION 34
#define EEPROM_VERSION 35
#define BREATH_THR_FACTORY 1400
#define BREATH_MAX_FACTORY 4000
#define PORTAM_THR_FACTORY 2600
@ -130,6 +132,9 @@
#define LEVEL_VAL_FACTORY 127
#define FINGER_FACTORY 0
#define LPINKY3_FACTORY 0
#define BATTYPE_FACTORY 0
#define HARMSET_FACTORY 0
#define HARMSEL_FACTORY 0
#define NO_CHECKSUM 0x7F007F00