I can not understand why if I insert code into two functions of the same sketch, the sketch is ever restarted;
it's quietly if I leave it blank, instead i I put the code happens the damage ...
the fact that the sketch restart it will be deducted from the lack of output on the LCD screen and the continuous print (on the serial monitor) for certain phrases that I put in the constructor of an object (which automatically creates the library )....
what I do not go back is that there are features that add to have problems like segmentation fault, since they do not have time to be invoked ....
I ask your help because I really do not understand why ...
the compiled results to be 25,824 ...
I post the code of the functions
char *typeSocketToString(int8_t type){
switch(type){
case(COOLER): return "REFRIGERATORE";
case(FANS): return "VENTOLE";
case(FILTER): return "FILTRO";
case(HEATER): return "RISCALDATORE";
case(KALKWASSER): return "KALKWASSER";
case(LIFTS): return "RISALITA";
case(LIGHT): return "LUCE";
case(MANGER): return "MANGIATOIA";
case(MOBILE_FANS): return "VENT. MOBILE";
case(MOON_LIGHT): return "LUCE LUNARE";
case(OTHER): return "ALTRO";
case(PUMP): return "POMPA";
case(REACTOR): return "REATTORE";
case(SKIMMER): return "SKIMMER";
case(AQUARIUM_SOLENOID): return "ELETTROV. VASCA";
case(REACTOR_SOLENOID): return "ELETTROV. REATTORE";
case(TOPPING_TANK): return "RABBOCCO VASCA";
case(TOPPING_SUMP): return "RABBOCCO SUMP";
case(COOLER_PROBED): return "REFRIG. SONDATO";
case(TOPPING_TANK_PROBED): return "RABB. VASCA SONDATO";
case(TOPPING_SUMP_PROBED): return "RABB. SUMP SONDATO";
case(AQUARIUM_SOLENOID_PROBED): return "ELETTR. VASCA SONDATA";
case(REACTOR_SOLENOID_PROBED): return "ELETTR. REATTORE SONDATA";
case(ORP_PROBED): return "ORP SONDATO";
case(MOON_LIGHT_PROBED): return "LUCE LUNARE SONDATA";
case(HEATER_PROBED): return "RISCALDATORE SONDATO";
case(FANS_PROBED): return "VENTOLE SONDATE";
case(TURNED_OFF): return "SPENTA";
default: return "TIPO SCONOSCIUTO";
}
}
void makeSocket(uint8_t indexSocket){
uint8_t socketType = TURNED_OFF, row = 0;
int8_t n = 0, sel = 0, sel2 = 0;
short on = 0, off = 0;
float th = 0.0;
IO.clearLcd();
IO.lcdPrint((int) indexSocket + 1, 0);
IO.lcdPrint(") ");
switch((sel = IO.readSelectedIndex("LA PRESA E'", "TEMPORIZZATA", "SEMPRE ACCESA", "SEMPRE SPENTA", "SONDATA", NULL))){
case(0): case(1): case(2):
if((sel2 = IO.readSelectedIndex("TIPO PRESA", "LUCE", "POMPA", "FILTRO", "RISCALDATORE", "RISALITA", "SKIMMER",
"VENTOLE", "REFRIGERATORE", "MANGIATOIA", "VENT. MOBILE", "LUCE LUNARE", "REATTORE", "KALKWASSER", "ELETTROV. REATTORE",
"ELETTROV. VASCA", "RABBOCCO VASCA", "RABBOCCO SUMP", "ALTRO", "SPENTA", NULL)) >= 0)
socketType = sel2; //di default e' gia' TURNED_OFF
break;
case(3):
if((sel2 = IO.readSelectedIndex("TIPO PRESA", "RISCALDATORE SONDATO", "ELETTR. REATTORE SONDATA", "ELETTR. VASCA SONDATA",
"RABB. VASCA SONDATO", "RABB. SUMP SONDATO", "REFRIG. SONDATO", "VENTOLE SONDATE", "LUCE LUNARE SONDATA",
"ORP SONDATO", NULL)) >= 0)
socketType = HEATER_PROBED + sel2; //HEATER_PROBED + sel2 perche' sel2 e' lo "scostamento" dalla prima presa sondata
if(socketType != TURNED_OFF){
IO.clearLcd();
IO.lcdPrint("SOGLIA = ");
th = IO.readFloat(10); // 10 = strlen("SOGLIA = ") + 1
}
break;
}
if(sock.setPowerSocket(indexSocket, socketType, th) == CORRECT){
if(sel == 1)
sock.setPowerSocketEverOn(indexSocket);
else if(socketType != TURNED_OFF && sel == 0){
IO.clearLcd();
IO.lcdPrint("ACCENSIONI (<=", 2);
IO.lcdPrint((int) MAX_SOCKET_SWITCH);
IO.lcdPrint(")");
n = IO.readInt(MAX_SOCKET_SWITCH, ++row);
IO.clearLcd();
for(int i = 0, row = 0; i < n; i++){
if(row == LCD_ROW){
IO.clearLcd();
row = 0;
}
IO.lcdPrint("ON ", row++);
IO.lcdPrint(i + 1);
IO.lcdPrint(" = ");
on = IO.readTime(9);
IO.lcdPrint("OFF ", row++);
IO.lcdPrint(i + 1);
IO.lcdPrint(" = ");
off = IO.readTime(9);
sock.addTime(indexSocket, ((on == TIME_OUT) ? 0 : on), ((off == TIME_OUT) ? 0 : off));
}
}
}
}
IO.readSelectedIndex, works because I use it in other part of the sketch and goes ok
int InputOutputI2C::readSelectedIndex(const char *query, ...){
char key = CHAR_NOT_INSERT;
va_list argList;
uint8_t i = 0, nArg = 0, select = 0, row = 0;
bool timeout = false;
va_start(argList, query);
while(va_arg(argList, char *))
nArg++;
char *args[nArg];
va_start(argList, query);
for(; i < nArg; i++)
args[i] = va_arg(argList, char *);
va_end(argList);
clearLcd();
if(query)
lcdPrint(query, row++);
_secondsWithoutInput = 0;
do{
for(i = 0; i < _lcdRow - (query ? 1 : 0); i++){ //-1 perche' devo togliere la prima riga di "intestazione"
clearLcdRow(row + i);
if(i == 0) //solo la prima opzione ha ->
lcdPrint("->", row);
lcdPrint(args[(select + i) % nArg], row + i, 2);
}
// fino a che non scade il tempo scarto tutti i caratteri inseriti che non sono
while(!timeout && ((key = readChar()) != ENTER && key != CANCEL && key != CURSOR_UP && key != CURSOR_DOWN))
timeout = _secondsWithoutInput > MAX_SECOND_WAIT_INPUT_TIME;
if(key == CURSOR_UP)
select = (nArg + select - 1) % nArg; //nArg perche' le opzioni sono nArg; devo sommarlo perche' -1 % nArg e' corretto, ma io voglio solo valori positivi
else if(key == CURSOR_DOWN)
select = (select + 1) % nArg; //nArg perche' le opzioni sono nArg
}while(key != ENTER && key != CANCEL && !timeout);
return ((key == ENTER) ? select : ((key == CANCEL) ? CANCELED : TIME_OUT));
}
edit:
the blame can be attributed to the fact that both functions create many literals ...
how you might solve?