/**\brief * Make a copy of the event and event vars to another position. * Has to reorganize the memory: events and events vars to avoid fragmentation. * @param fromIndex event index starting on 0. * @param toIndex event index starting on 0. */ void MergMemoryManagement::copyEvent(uint8_t fromIndex,uint8_t toIndex){ unsigned int memposOld,memposNew; if (fromIndex==toIndex){return;}; memposOld=resolveEventPos(fromIndex); memposNew=resolveEventPos(toIndex); for (int i=0;i<(EVENT_SIZE+MAX_VAR_PER_EVENT);i++){ EEPROM.write(memposNew,EEPROM.read(memposOld)); memposNew++; memposOld++; } }
/**\brief * Print all memory to serial. Used for debug. */ void MergMemoryManagement::dumpMemory(){ /**\brief * Find the event variable position in memory */ #ifdef DEBUGDEF read(); byte a; Serial.println("MEMORY DUMP"); Serial.print("IDENT:"); a=EEPROM.read(MERG_MEMPOS); Serial.print(a,HEX); Serial.print("\nCAN_ID:"); Serial.print(can_ID,HEX); Serial.print("\nNN:"); Serial.print(getNodeNumber()); Serial.print("\nFlags:"); Serial.print(flags,HEX); Serial.print("\nNUM EVENTS:"); Serial.print(numEvents,HEX); Serial.print("\nNUM EVENTS VARS:"); Serial.print(MAX_VAR_PER_EVENT,HEX); Serial.print("\nNUM VARS:"); Serial.print(MAX_AVAIL_VARS,HEX); Serial.print("\nNODE VARS:"); for (int i=0;i<MAX_AVAIL_VARS;i++){ Serial.print(EEPROM.read(VARS_MEMPOS+i),HEX); Serial.print(" "); } Serial.print("\nDEVICE NUMBERS:"); for (int i=0;i<MAX_NUM_DEVICE_NUMBERS;i++){ Serial.print(EEPROM.read(DN_MEMPOS+i*NNDD_SIZE),HEX); Serial.print(EEPROM.read(DN_MEMPOS+i*NNDD_SIZE+1),HEX); Serial.print(" "); } Serial.println("\nEVENTS:"); int n=resolveEventPos(0); for (int i=0;i<MAX_NUM_EVENTS;i++){ for (int j=0;j<EVENT_SIZE;j++){ Serial.print(EEPROM.read(n),HEX); n++; Serial.print(" "); } Serial.print("VARS "); for (int j=0;j<MAX_VAR_PER_EVENT;j++){ Serial.print(EEPROM.read(n),HEX); n++; Serial.print(" "); } Serial.println(); } #endif // DEBUGDEF }
/**\brief * Put a new event in the memory and return its index. * @param event 4 bytes event * @param index event index starting in 0. */ uint8_t MergMemoryManagement::setEvent(byte *event,uint8_t index){ if (index >= MAX_NUM_EVENTS){ return (MAX_NUM_EVENTS + 1) ; } int j; numEvents++; //number of events EEPROM.write(NUM_EVENTS_MEMPOS, numEvents); //write event j = resolveEventPos(index); for (int i = 0;i < EVENT_SIZE;i++){ EEPROM.write(j,event[i]); j++; } return index; }
byte * MergMemoryManagement::getEvent(unsigned int index){ event[0]=EMPTY_BYTE; event[1]=EMPTY_BYTE; event[2]=EMPTY_BYTE; event[3]=EMPTY_BYTE; //Serial.println("MEM: Getting event"); if (index>(MAX_NUM_EVENTS)||index>numEvents){ //Serial.println("MEM: Getting event failed"); return event; } unsigned int i=resolveEventPos(index); event[0]=EEPROM.read(i); event[1]=EEPROM.read(i+1); event[2]=EEPROM.read(i+2); event[3]=EEPROM.read(i+3); return event; }
unsigned int MergMemoryManagement::resolveEvVarArrayPos(byte evidx,byte varidx){ return (resolveEventPos(evidx)+EVENT_SIZE+varidx); }