/**\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);
}