Thanks for your messages.
I am posting the two main functions that handle arrays. I understand its not easy to follow the program flow here however...
void DoTargetBusCommands (byte cmd, byte Target){
if ((readEEPROM(disk1, 4800+(cmd-1)*140+(Target-1)*7)==0x00)or (readEEPROM(disk1, 4800+(cmd-1)*140+(Target-1)*7)==0xff)) {return;}
byte TargetState=readEEPROM(disk1, 4+4800+(cmd-1)*140+(Target-1)*7); // Variable to hold the target state to be sent
DataLog ="";
OutPacket[1]=DeviceSubNet;
OutPacket[2]=DeviceID;
OutPacket[3]=highByte(DeviceType);
OutPacket[4]=lowByte(DeviceType);
if (readEEPROM(disk1, 4800+(cmd-1)*140+(Target-1)*7)==0x59) { // Single channel lighting command
OutPacket[0]=15; // Length of packet
OutPacket[5]= 0x00; // op code 1
OutPacket[6]= 0x31; // op code 2
OutPacket[7]= readEEPROM(disk1, 1+4800+(cmd-1)*140+(Target-1)*7); // target device subnet
OutPacket[8]= readEEPROM(disk1, 2+4800+(cmd-1)*140+(Target-1)*7); // targer device ID
OutPacket[9]= readEEPROM(disk1, 3+4800+(cmd-1)*140+(Target-1)*7); // Channel No
PORT.println (CurrentStatus[cmd]);
if ((CurrentStatus[cmd]==0)and ReverseControl) {OutPacket[10]=100;}
if (((CurrentStatus[cmd]>0)and ReverseControl) or (TargetState==0)) {OutPacket[10]=0;}
if (not ReverseControl) {OutPacket[10]= TargetState;} // Brightness Level
OutPacket[11]= readEEPROM(disk1, 5+4800+(cmd-1)*140+(Target-1)*7); // High 8 bit running time
OutPacket[12]= readEEPROM(disk1, 6+4800+(cmd-1)*140+(Target-1)*7); // Low 8 bit running time
Pack_crc(OutPacket,OutPacket[0]-2); // Get CRC codes
SendFeedback();
for (int x=11; x<31; x++) {ReplyBuffer[x-11]=readEEPROM(disk1, (x-11)+2800+(cmd-1)*20); }
LogSDCard(" COMMAND: ",0,11,2);
LogSDCard(ReplyBuffer,0,20,1);
LogSDCard(" ",0,4,1);
DataLog=String(OutPacket[10]);
string2char();
LogSDCard(ReplyBuffer,0,DataLog.length(),1);
LogSDCard("% SubNet:",0,10,1);
DataLog=String(OutPacket[7]);
string2char();
LogSDCard(ReplyBuffer,0,DataLog.length(),1);
LogSDCard(" ID:",0,5,1);
DataLog=String(OutPacket[8]);
string2char();
LogSDCard(ReplyBuffer,0,DataLog.length(),1);
LogSDCard(" CH:",0,5,1);
DataLog=String(OutPacket[9]);
string2char();
LogSDCard(ReplyBuffer,0,DataLog.length(),1);
LogSDCard("Origin:",0,7,1);
IPAddress remote = Udp.remoteIP();
for (int i =0; i < 4; i++) {
DataLog=String(remote[i]);
string2char();
LogSDCard(ReplyBuffer,0,DataLog.length(),1);
if (i < 3) { LogSDCard(".",0,1,1); }
}
return;
}
if (readEEPROM(disk1, 4800+(cmd-1)*140+(Target-1)*7)==0x55) { // AREA
OutPacket[0]=13; // Length of packet
OutPacket[5]= 0x00; // op code 1
OutPacket[6]= 0x02; // op code 2
OutPacket[7]= readEEPROM(disk1, 1+4800+(cmd-1)*140+(Target-1)*7); // target device subnet
OutPacket[8]= readEEPROM(disk1, 2+4800+(cmd-1)*140+(Target-1)*7); // targer device ID
OutPacket[9]= readEEPROM(disk1, 3+4800+(cmd-1)*140+(Target-1)*7); // Area No
if ((CurrentStatus[cmd]==0)and ReverseControl) {OutPacket[10]= readEEPROM(disk1, 4+4800+(cmd-1)*140+(Target-1)*7);}
if ((CurrentStatus[cmd]>0 )and ReverseControl) {OutPacket[10]=0;}
if (not ReverseControl) {OutPacket[10]= readEEPROM(disk1, 4+4800+(cmd-1)*140+(Target-1)*7);} // Scene No
Pack_crc(OutPacket,OutPacket[0]-2); // Get CRC codes
SendFeedback();
return;
boolean LogSDCard(char LogData[35], byte Start, byte Len, byte time){
if (logging<1) { return 0xf5; } // exit if logging is disabled
File dataFile = SD.open("datalog.txt", FILE_WRITE);
if (time==2) {GetTime();}
if (dataFile) { // if the file is available, write to it:
if ((time==2) or (time==0)) {dataFile.println();PORT.println();PORT.println("*** Data Logged ***");}
if (time==2) {dataFile.print(timenow);PORT.print(timenow);}
dataFile.print(" ");
if (Start+Len>34) {PORT.println("Error- Subscript out of range");PORT.print(Start+Len);dataFile.println("Error- Subscript out of range"); dataFile.close();return 0xf5;}
for (int x=Start; x<Start+Len+1; x++){
dataFile.write (LogData[x]);
PORT.write(LogData[x]);}
dataFile.close();
return 0xf8;
}
else { // if the file isn't open, pop up an error:
digitalWrite (ErrorLed,HIGH);
PORT.println("Error opening datalog.txt");
return 0xf5;
}
}