// Process Port commands. // Returns zero on success. public override byte CommandHandler(MessageTransaction mtx) { PacketBuffer g = mtx.MsgBuffer; Boolean isReply = ((g.flagsRS() & ProtocolConstants.MESSAGE_FLAGS_IS_REPLY) != 0); if (((!isReply) && (g.command() < ProtocolConstants.MEDIATOR_CONTROL_CMD_BASE)) || (isReply && (g.senderId() == ProtocolConstants.IDENT_MEDIATOR))) { byte dataIndex = ProtocolConstants.GENERAL_DATA_ARRAY_OFFSET; byte[] tmp; switch (g.command()) { // Standard device commands. case ProtocolConstants.MEDIATOR_DEVICE_RESET: // Reset the module. Manager.AppBabelDeviceReset(); break; case ProtocolConstants.MEDIATOR_DEVICE_STATUS: // Get device status. if (isReply) { return(1); } g.dataLength(Diagnostics.GetDeviceStatus(Manager, g.buffer)); mtx.ChangeDir = true; mtx.Finish = MessageTransaction.FinishAction.Normal; break; case ProtocolConstants.MEDIATOR_DEVICE_TICKER: // Get device ticker count. if (isReply) { return(1); // We've been sent a ticker count. } // Sender wants to know ticker count. tmp = Primitives.UIntToByteArray(Primitives.GetBabelMilliTicker()); return(mtx.StoreMessageValue(tmp, (byte)(tmp.Length))); case ProtocolConstants.MEDIATOR_DEVICE_ERASE: // TODO: erase eeprom and restart. return(2); case ProtocolConstants.MEDIATOR_DEVICE_READVAR: return((MediatorReadCommand(mtx) == 0) ? (byte)1 : (byte)0); case ProtocolConstants.MEDIATOR_DEVICE_WRITEVAR: return((MediatorWriteCommand(mtx) == 0) ? (byte)1 : (byte)0); case ProtocolConstants.MEDIATOR_DEVICE_ISOVAR: return((MediatorIsoCommand(mtx) == 0) ? (byte)1 : (byte)0); case ProtocolConstants.MEDIATOR_DEVICE_ISOMONVAR: return((MediatorIsoCommand(mtx) == 0) ? (byte)1 : (byte)0); case ProtocolConstants.MEDIATOR_DEVICE_ISOMSG: return((MediatorIsoCommand(mtx) == 0) ? (byte)1 : (byte)0); case ProtocolConstants.MEDIATOR_DEVICE_LOG: if (!isReply) { if (Settings.LogOn) { uint ticks = (uint)Primitives.GetArrayValueU(g.buffer, dataIndex, 4); string s; byte logType = g.buffer[dataIndex + 4]; if (Settings.LogBinary || logType == 'B') { int start = dataIndex + 5; int last = dataIndex + g.dataLength(); s = "("; for (int k = start; k < last; k++) { s = s + g.buffer[k].ToString("X2") + " "; } s += ")"; } else { s = Primitives.GetArrayStringValue(g.buffer, dataIndex + 5, g.dataLength() - 5); } Log.d("MediatorNetIf:" + Exchange.Id, ":" + ticks + ":" + s); } } return(1); // Connection specific commands. case ProtocolConstants.MEDIATOR_DEVICE_GETSN: // Get SN of receiver device at end of link. if (isReply) // We've been sent an SN for SPort. { g.buffer[dataIndex + g.dataLength()] = 0; Manager.SerialNumberManager.UpdateSerialNumbers(g.buffer, dataIndex, g.dataLength(), g.iNetIf, g.sender()); if (mtx.MsgBuffer.iNetIf != ProtocolConstants.NETIF_USER_BASE) // Notify master of SN via connection attach command. { SendLinkMediatorCommand(this, true, ProtocolConstants.MEDIATOR_CONNECT_ATTACH, g.dataLength(), g.buffer, dataIndex); } break; } // Sender wants to know SN of master. g.dataLength(Manager.SerialNumberManager.CopyMasterSerialNumber(g.buffer, dataIndex, g.iNetIf)); mtx.ChangeDir = true; mtx.Finish = MessageTransaction.FinishAction.Normal; break; case ProtocolConstants.MEDIATOR_CONNECT_ATTACH: // TODO: Report attach and SN of device. case ProtocolConstants.MEDIATOR_CONNECT_DETACH: // TODO: Report detach of device. case ProtocolConstants.MEDIATOR_CONNECT_GATEWAY: // TODO: Register as a gateway. return(10); default: // TODO: try handling via NETIF_MEDIATOR_PORT. return(11); } return(0); } return(BabelMessage.ProcessIncomingRawMesssage(Exchange, mtx)); }