SafeDispatch/MotoTRBO_XNL_Cmd/RadioMessage.cs

1847 lines
70 KiB
C#
Raw Permalink Normal View History

2024-02-22 16:43:59 +00:00
using SafeMobileLib;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MotoTRBO_XNL_Cmd
{
class RadioMessage
{
//set DEBUG=true to print data in console
private bool DEBUG = false;
private byte[] data;
private int recvLength;
public bool connectionStatus;
private bool messageStatus;//decide if we need to send another message or not
public bool speakerStatus = false;
public int zoneNr,channelNr;
public bool channelNrRecived;
public static byte xnlFlag;
private bool valid;
private ushort length;
private ushort opcode;
private byte protocolId;
private byte XNLflags;
private ushort destAddr;
private ushort sourceAddr;
private ushort transID_low=0;
private ushort transId;
public byte transId_high = 0;
private ushort payloadLength;
private byte[] payload;
// intern
private ushort xnlAdress;
private byte[] tempAuthKey;
private byte[] majXNLVers = { 0x00, 0x00, 0x00, 0x00 };
#region constructor
//constructor
public RadioMessage()
{
}
#endregion
#region main process function
//process message
public bool processMessage(byte[] recvData, int recv)
{
data = recvData;
recvLength = recv;
//xnlFlag = 0x09;
channelNrRecived = false;
try
{
valid = false;
//compute length
length = bytes2ushort(data[0], data[1]);
length += 2;// first to bytes are the curent length
//validet message
if (length == recvLength)
{
valid = true;
}
else
{
Utils.WriteLine("-------------- INValid messsage-------------", ConsoleType.XNL);
}
if (valid)
{
/*
Console.WriteLine("-------------------------------------------------------- " + length);
Console.WriteLine("-------------- processing message ----------------------");
Console.Write("Data: ");
for (int i = 0; i < recvLength; i++)
Console.Write(" 0x" + data[i].ToString("X"));
Console.WriteLine("");
*/
//set opcode
opcode = bytes2ushort(data[2], data[3]);
switch (opcode)
{
case (ushort)OPCODE_ENUM.XNL_MASTER_STATUS_BRDCST:
//set transaction id
transId = bytes2ushort(data[10], data[11]);
messageStatus = true;
Utils.WriteLine("RX : XNL_MASTER_STATUS_BRDCST", ConsoleType.XNL);
break;
case (ushort)OPCODE_ENUM.DEVICE_AUTH_KEY_REPLY:
messageStatus = true;
Utils.WriteLine("RX : DEVICE_AUTH_KEY_REPLY", ConsoleType.XNL);
break;
case (ushort)OPCODE_ENUM.DEVICE_CONN_REPLY:
messageStatus = true;
Utils.WriteLine("RX : DEVICE_CONN_REPLY", ConsoleType.XNL);
break;
case (ushort)OPCODE_ENUM.DATA_MSG:
messageStatus = true;
//Console.WriteLine("RX : DATA_MSG");
break;
case (ushort)OPCODE_ENUM.DATA_MSG_ACK:
messageStatus = false;
/*
Console.WriteLine("######### ACK MESSAGE RECEIVED ######### " + length);
Console.Write("Data: ");
for (int i = 2; i < length; i++)
Console.Write(" 0x" + data[i].ToString("X"));
Console.WriteLine("");
Console.WriteLine("#############################################");
*/
break;
default:
messageStatus = false;
break;
}
//set protocol id
protocolId = data[4];
//set XNL flags
XNLflags = data[5];
//set destination address
destAddr = bytes2ushort(data[6], data[7]);
//set source address
sourceAddr = bytes2ushort(data[8], data[9]);
//set paylaod length
payloadLength = bytes2ushort(data[12], data[13]);
//if any payload set it
if (payloadLength > 0)
{
//Console.WriteLine("payload lenth=" + payloadLength);
payload = new byte[payloadLength];
for (int i = 14; i < length; i++)
{
payload[i - 14] = data[i];
}
//process payload
switch (opcode)
{
case (ushort)OPCODE_ENUM.XNL_MASTER_STATUS_BRDCST:
break;
case (ushort)OPCODE_ENUM.DEVICE_AUTH_KEY_REPLY:
processPayloadForAuth();
break;
case (ushort)OPCODE_ENUM.DEVICE_CONN_REPLY:
if (processConnection() == true)
{
}
else
{
Utils.WriteLine("====ERROR processConnection OPCODE_ENUM.DEVICE_CONN_REPLY==== \nprocessConnection() == false", ConsoleType.XNL);
}
break;
case (ushort)OPCODE_ENUM.DATA_MSG:
ushort pOpcode = bytes2ushort(payload[0], payload[1]);
if (pOpcode == (ushort)OPCODE_ENUM.DEVINITSTS)
{
if (payload[6] == 0x00)
{
byte temp_transID = data[10];
Utils.WriteLine("TransId_high:" + transId_high + " temp_transID:" + temp_transID + " transID:" + transId, ConsoleType.XNL);
connectionStatus = true;
if (this.OnAuthDone != null)
{
this.OnAuthDone(this);
}
}
}
else
{
//regular data message continue
processPayload();
}
break;
default:
{
//Console.WriteLine("Opcode: " + opcode);
}
break;
}
byte temp_transID2 = data[10];
//Console.WriteLine("TransId_high:" + transId_high + " temp_transID:" + temp_transID2 + " transID:" + transId);
}
}
else
{
//Console.WriteLine("Invalid message ::Length=" + length + " || actual length=" + recvLength);
//Console.Write("Data: ");
//for (int i = 2; i < length; i++)
//Console.Write(" 0x" + data[i].ToString("X"));
//Console.WriteLine("--------------------------------------------------------------------------- ");
}//if valid end
}//try end :D
catch (Exception ex)
{
Utils.WriteLine("MotoTrbo_XNL_CMD/RadioMessage.cs/processMessage ", ConsoleType.XNL);
Utils.WriteLine(ex.ToString(), ConsoleType.XNL);
throw ex;
}
//Console.WriteLine("-------------------------------------------------------- ");
return messageStatus;
}// process message end
#endregion
#region aux function
//convert 2 bytes to 1 ushort
public static ushort bytes2ushort(byte first, byte second)
{
ushort us;
us = (ushort)first;
us <<= 8;
us |= (ushort)second;
return us;
}
#endregion
//process payload
#region process payload functions
//process auth key
private void processPayloadForAuth()
{
try
{
xnlAdress = bytes2ushort(payload[0], payload[1]);
Utils.WriteLine("Temp XNL address:" + xnlAdress, ConsoleType.XNL);
if (payloadLength > 0)
{
//Console.WriteLine("payload lenth=" + payloadLength);
tempAuthKey = new byte[payload.Length - 2];
for (int i = 2; i < payloadLength; i++)
{
tempAuthKey[i - 2] = payload[i];
}
}
///new code
MTteaEncoder mtCsharp = new MTteaEncoder();
uint[] tempKey = mtCsharp.ConvertTea(tempAuthKey[0], tempAuthKey[1], tempAuthKey[2], tempAuthKey[3], tempAuthKey[4], tempAuthKey[5], tempAuthKey[6], tempAuthKey[7]);
byte[] temp1 = BitConverter.GetBytes(tempKey[0]);
byte[] temp2 = BitConverter.GetBytes(tempKey[1]);
byte[] output = new byte[8];
for (int i = 0; i < 4; i++)
{
output[i] = temp1[i];
output[i + 4] = temp2[i];
}
tempAuthKey = output;
}
catch (Exception ex) { Utils.WriteLine(ex.ToString(), ConsoleType.XNL); }
}
//get data from auth reply
private bool processConnection()
{
try
{
Utils.WriteLine(" Init processConnection()", ConsoleType.XNL);
Utils.WriteLine("Length:" + payloadLength + " payload[0]:" + payload[0], ConsoleType.XNL);
if (payloadLength > 0)
{
//test if auth has been successfuly
if (payload[0] == 1)
{
//Console.WriteLine("data1=" + payload[1].ToString("X"));
transId = bytes2ushort(payload[1], 0x01);
transId_high = payload[1];
Utils.WriteLine("TransId_high:" + transId_high, ConsoleType.XNL);
//Console.WriteLine("+++++++++++++CONNECTED++++++++++++++");
xnlAdress = bytes2ushort(payload[2], payload[3]);
//connectionStatus = true;
return true;
}
else
{
Utils.WriteLine("processConnection : payload[0] != 1 ... auth failed!!!", ConsoleType.XNL);
return false;
}
}
else
{
return false;
}
}
catch (Exception ex) { Utils.WriteLine(ex.ToString(), ConsoleType.XNL); return false; }
}
//process payload (test if an ACK for any of the messages sent is receied)
private void processPayload()
{
if (DEBUG)
{
Utils.WriteLine("--------------------------------------------------------------------------- " + length, ConsoleType.XNL);
Utils.WriteLine("Data: ", ConsoleType.XNL);
for (int i = 2; i < length; i++)
Utils.Write(" 0x" + data[i].ToString("X2"), ConsoleType.XNL);
Utils.WriteLine("", ConsoleType.XNL);
Utils.WriteLine("--------------------------------------------------------------------------- ", ConsoleType.XNL);
}
ushort pOpcode = bytes2ushort(payload[0], payload[1]);
switch (pOpcode)
{
case (ushort)OPCODE_ENUM.SPKRSTAT:
ushort function = bytes2ushort(payload[4], payload[5]);
if (function == 0x0001)
{
speakerStatus = true;
//Console.WriteLine("Speakers ON (reciving data from another radio)");
if (this.OnSpeakersEvent != null)
{
this.OnSpeakersEvent(true);
}
}
else
{
speakerStatus = false;
if (this.OnSpeakersEvent != null)
{
this.OnSpeakersEvent(false);
}
//Console.WriteLine("Speakers OFF (reciving data from another radio)");
}
break;
case (ushort)OPCODE_ENUM.CHANNEL_Broadcast:
zoneNr = (int)bytes2ushort(payload[2], payload[3]);
//Console.WriteLine("CHANNEL_Broadcas Zone nr recived =" + zoneNr.ToString());
channelNr = (int)bytes2ushort(payload[4], payload[5]);
//Console.WriteLine("CHANNEL_Broadcas Channel nr recived =" + channelNr.ToString());
channelNrRecived = true;
if (this.OnChannelEvent != null)
{
this.OnChannelEvent(zoneNr, channelNr);
}
break;
case (ushort)OPCODE_ENUM.CHANNEL:
if (payload[2] == 0x00 && payload[3] == 0x80)//success
{
zoneNr = (int)bytes2ushort(payload[4], payload[5]);
//Console.WriteLine("CHANNEL reply Zone nr recived =" + zoneNr.ToString());
channelNr = (int)bytes2ushort(payload[6], payload[7]);
//Console.WriteLine("CHANNEL reply Channel nr recived =" + channelNr.ToString());
channelNrRecived = true;
if (this.OnChannelEvent != null)
{
this.OnChannelEvent(zoneNr,channelNr);
}
}
else
{
if (payload[3] != 0x05)
Utils.WriteLine("Channel nr recived ERROR!!!!", ConsoleType.XNL);
}
break;
case (ushort)OPCODE_ENUM.INCOMINGCALL:
if (payload[3] == 0x01 || payload[3] == 0x02)
{
byte[] temp = { payload[6], payload[7], payload[8] };
int i = payload[8] + payload[7] * 256 + payload[6] * 256 * 256;
//Console.WriteLine("Incomming call from " + i + " calltype:"+payload[2]);// + payload[].ToString());
int callType = payload[2];
int groupId = 0;
if (payloadLength > 14)
{
groupId = payload[14] + payload[13] * 256 + payload[12] * 256 * 256;
}
CALL_STATUS cStatus = (payload[3] ==1)?CALL_STATUS.INIT:CALL_STATUS.INCALL;
if (this.OnCallEvent != null)
{
this.OnCallEvent(cStatus, i, callType, groupId);
}
}
else
{
if (payload[3] == 0x03 || payload[3] == 0x07)
{
byte[] temp = { payload[6], payload[7], payload[8] };
int i = payload[8] + payload[7] * 256 + payload[6] * 256 * 256;
//Console.WriteLine("Call end from " + i + " calltype:" + payload[2]);// + payload[].ToString());
int callType = payload[2];
int groupId = 0;
if (payloadLength > 14)
{
groupId = payload[14] + payload[13] * 256 + payload[12] * 256 * 256;
}
CALL_STATUS cStatus = (payload[3] == 3) ? CALL_STATUS.CALLEND : CALL_STATUS.HANGTIMER;
if (this.OnCallEvent != null)
{
this.OnCallEvent(cStatus, i, callType, groupId);
}
}
}
break;
case (ushort)OPCODE_ENUM.TRANSMITCONTROL:
bool onoff = (payload[3] == 1);
if (this.OnTransmitEvent != null)
{
this.OnTransmitEvent(onoff);
}
break;
case (ushort)OPCODE_ENUM.REMOTE_CONTROL_BROADCAST:
if (payload[3] != 0x20 && payload[3] != 0x21)
{
bool status = (payload[3] == 0x10);
REMOTE_RADIO_FUNCS func = (REMOTE_RADIO_FUNCS)payload[2];
int radioID = payload[8] + payload[7] * 256 + payload[6] * 256 * 256;
if (this.OnRemoteControlEvent != null)
{
this.OnRemoteControlEvent(status, func, radioID);
}
}
break;
case (ushort)OPCODE_ENUM.EMERGENCY_BROADCAST:
if (payload[2] == 0x3)
{
int rID = payload[7] + payload[6] * 256 + payload[5] * 256 * 256;
if (this.OnEmergencyEvent != null)
{
this.OnEmergencyEvent(rID,true);
}
}
else if (payload[2] == 0x00)
{
//int rID = payload[7] + payload[6] * 256 + payload[5] * 256 * 256;
if (this.OnEmergencyEvent != null)
{
this.OnEmergencyEvent(0, false);
}
}
break;
case (ushort)OPCODE_ENUM.EMGREP:
{
int status = payload[2];
int func = payload[3];
if (this.OnSendEmergencyEvent != null)
{
this.OnSendEmergencyEvent(func, status);
}
break;
}
case (ushort) OPCODE_ENUM.SHUTDOWN_BROADCAST:
if (payload[2] == 0x00)
{
if (this.OnRestartEvent != null)
{
this.OnRestartEvent();
}
}
break;
case (ushort)OPCODE_ENUM.VERSION_REPLY:
if (payload[2] == 0x00)
{
//get vesrsion from payload
//skip first 3 bytes (2 are opcode, 1 is the result 0-ok 4-invalid parameter)
//skip the last byte that is NULL, ascii code 0x00
string str = System.Text.Encoding.ASCII.GetString(payload, 3, payloadLength-4);
if (this.OnVersionEvent != null)
{
this.OnVersionEvent(str);
}
}
break;
case (ushort) OPCODE_ENUM.INUPDAT:
break;
case (ushort)OPCODE_ENUM.DISPTEXT:
break;
//case (ushort)OPCODE_ENUM.NAVBRDCST:
case (ushort)OPCODE_ENUM.NAVREP:
if (this.OnNavRepEvent != null)
{
this.OnNavRepEvent(payload[2], payload[3]);
}
break;
default:
Utils.WriteLine("", ConsoleType.XNL);
Utils.WriteLine("******************UNPROCESS********************", ConsoleType.XNL);
Utils.WriteLine("OPCODE :0x"+ payload[0].ToString("X")+ payload[1].ToString("X2"), ConsoleType.XNL);
Utils.WriteLine("payload: ", ConsoleType.XNL);
for (int i = 0; i < payload.Length; i++)
Utils.Write(" 0x" + payload[i].ToString("X2"), ConsoleType.XNL);
Utils.WriteLine("", ConsoleType.XNL);
Utils.WriteLine("***********************************************", ConsoleType.XNL);
Utils.WriteLine("", ConsoleType.XNL);
break;
}//swith end
}//processPayload end
#endregion
#region EVENTS
public delegate void AuthDone(RadioMessage rm);
public event AuthDone OnAuthDone;
public delegate void SpeakersEvent(bool onOFF);
public event SpeakersEvent OnSpeakersEvent;
public delegate void CallEvent(CALL_STATUS status, int callerID, int callType, int groupID);
public event CallEvent OnCallEvent;
public delegate void TransmitEvent(bool onOFF);
public event TransmitEvent OnTransmitEvent;
public delegate void ChannelEvent(int zoneNR,int channelNr);
public event ChannelEvent OnChannelEvent;
public delegate void RemoteControlEvent(bool status, REMOTE_RADIO_FUNCS func, int radioId);
public event RemoteControlEvent OnRemoteControlEvent;
public delegate void EmergencyEvent(int radioId, bool status);
public event EmergencyEvent OnEmergencyEvent;
public delegate void SendEmergencyEvent(int function, int status);
public event SendEmergencyEvent OnSendEmergencyEvent;
public delegate void RestartEvent();
public event RestartEvent OnRestartEvent;
public delegate void VersionEvent(string version);
public event VersionEvent OnVersionEvent;
public delegate void NavRepEvent(int function, int status);
public event NavRepEvent OnNavRepEvent;
#endregion
//create stepicfic messages ptt,channel request,set cal type .....
#region create specific messages
//ptt 0x0415 KEYREQ Transmit Control Request;
public byte[] pttONOFF(bool state)
{
byte[] temp = new byte[2];
//Console.WriteLine(" ");
//Console.WriteLine("--------------------------------------------------------------------------- ");
transID_low++;
if (transID_low > 255) transID_low = 0;
byte[] br_off = new byte[18];
//add message length
br_off[0] = 0x00;
br_off[1] = 0x10;
//add opcode
temp = BitConverter.GetBytes((ushort)OPCODE_ENUM.DATA_MSG);
br_off[2] = temp[1];
br_off[3] = temp[0];
//add protocol id
br_off[4] = protocolId;
//add XNL flags
br_off[5] = 0x01;
//add destination addres (previous message source address)
temp = BitConverter.GetBytes(sourceAddr);
br_off[6] = temp[1];
br_off[7] = temp[0];
//add source addres ()
temp = BitConverter.GetBytes(xnlAdress);
br_off[8] = temp[1];
br_off[9] = temp[0];
//add transaction ID
temp = BitConverter.GetBytes(transID_low);
byte[] temp1 = BitConverter.GetBytes(transId);
br_off[10] = temp1[1];
br_off[11] = temp[0];
//add payload length
temp = BitConverter.GetBytes(0x0004);
br_off[12] = temp[1];
br_off[13] = temp[0];
temp = BitConverter.GetBytes(0x0415);
br_off[14] = temp[1];
br_off[15] = temp[0];
//function
if (state)
{
//Console.WriteLine("Creating message for ptt on");
br_off[16] = 0x01;
br_off[5] = 0x01;
}
else
{
//Console.WriteLine("Creating message for ptt off");
br_off[16] = 0x02;
br_off[5] = 0x02;
}
//call type
br_off[17] = 0x00;
//for (int i = 0; i < 18; i++)
///Console.Write(" 0x" + br_off[i].ToString("X") + " ");
//Console.WriteLine(" ");
return br_off;
}
//ptt 0xb405 user Inputs
public byte[] pttWithPUI(bool onOF)
{
byte[] temp = new byte[2];
//Console.WriteLine(" ");
//Console.WriteLine("--------------PUI------------------------------------------------------------- ");
transID_low++;
if (transID_low > 255) transID_low = 0;
byte[] br_off = new byte[23];
//add message length
br_off[0] = 0x00;
br_off[1] = 0x15;
//add opcode
temp = BitConverter.GetBytes((ushort)OPCODE_ENUM.DATA_MSG);
br_off[2] = temp[1];
br_off[3] = temp[0];
//add protocol id
br_off[4] = protocolId;
//add XNL flags
br_off[5] = 0x01;
//add destination addres (previous message source address)
temp = BitConverter.GetBytes(sourceAddr);
br_off[6] = temp[1];
br_off[7] = temp[0];
//add source addres ()
temp = BitConverter.GetBytes(xnlAdress);
br_off[8] = temp[1];
br_off[9] = temp[0];
//add transaction ID
temp = BitConverter.GetBytes(transID_low);
byte[] temp1 = BitConverter.GetBytes(transId);
br_off[10] = temp1[1];
br_off[11] = temp[0];
//add payload length
temp = BitConverter.GetBytes(0x0009);
br_off[12] = temp[1];
br_off[13] = temp[0];
//opcode
temp = BitConverter.GetBytes(0xb405);
br_off[14] = temp[1];
br_off[15] = temp[0];
//PUI source
br_off[16] = 0x03;
//PUI TYPE
br_off[17] = 0x00;
//PUI ID
temp = BitConverter.GetBytes(0x0001);
br_off[18] = temp[1];
br_off[19] = temp[0];
//pui state
if (onOF)
{
br_off[20] = 0x01;
br_off[5] = 0x01;
}
else
{
br_off[20] = 0x00;
br_off[5] = 0x02;
}
//pui min/max
br_off[21] = 0x00;
br_off[22] = 0x03;
Utils.WriteLine(" PUI code start", ConsoleType.XNL);
for (int i = 0; i < 18; i++)
Utils.Write(" 0x" + br_off[i].ToString("X2") + " ", ConsoleType.XNL);
Utils.WriteLine(" PUI code end", ConsoleType.XNL);
return br_off;
}
//back button 0xb405 user Inputs ( button code 0x0081)
public byte[] backBtnShortPress(bool status)
{
byte[] temp = new byte[2];
//Console.WriteLine(" ");
//Console.WriteLine("--------------BACK BUtton PUI------------------------------------------- ");
transID_low++;
if (transID_low > 255) transID_low = 0;
byte[] br_off = new byte[23];
//add message length
br_off[0] = 0x00;
br_off[1] = 0x15;
//add opcode
temp = BitConverter.GetBytes((ushort)OPCODE_ENUM.DATA_MSG);
br_off[2] = temp[1];
br_off[3] = temp[0];
//add protocol id
br_off[4] = protocolId;
//add XNL flags
br_off[5] = 0x01;
//add destination addres (previous message source address)
temp = BitConverter.GetBytes(sourceAddr);
br_off[6] = temp[1];
br_off[7] = temp[0];
//add source addres ()
temp = BitConverter.GetBytes(xnlAdress);
br_off[8] = temp[1];
br_off[9] = temp[0];
//add transaction ID
temp = BitConverter.GetBytes(transID_low);
byte[] temp1 = BitConverter.GetBytes(transId);
br_off[10] = temp1[1];
br_off[11] = temp[0];
//add payload length
temp = BitConverter.GetBytes(0x0009);
br_off[12] = temp[1];
br_off[13] = temp[0];
//opcode
temp = BitConverter.GetBytes(0xb405);
br_off[14] = temp[1];
br_off[15] = temp[0];
//PUI source
br_off[16] = 0x00;
//PUI TYPE
br_off[17] = 0x00;
//PUI ID
temp = BitConverter.GetBytes(0x0081);
br_off[18] = temp[1];
br_off[19] = temp[0];
//pui state
if (status)
{
br_off[20] = 0x01;
br_off[5] = 0x01;
}
else
{
br_off[20] = 0x00;
br_off[5] = 0x02;
}
//pui min/max
br_off[21] = 0x00;
br_off[22] = 0x03;
//for (int i = 0; i < 18; i++)
///Console.Write(" 0x" + br_off[i].ToString("X") + " ");
//Console.WriteLine(" ");
return br_off;
}
//P4 button 0xb405 user Inputs ( button code 0x00A3)
public byte[] btnP4longPress(bool status)
{
byte[] temp = new byte[2];
//Console.WriteLine(" ");
//Console.WriteLine("--------------P4 BUtton PUI------------------------------------------- ");
transID_low++;
if (transID_low > 255) transID_low = 0;
byte[] br_off = new byte[23];
//add message length
br_off[0] = 0x00;
br_off[1] = 0x15;
//add opcode
temp = BitConverter.GetBytes((ushort)OPCODE_ENUM.DATA_MSG);
br_off[2] = temp[1];
br_off[3] = temp[0];
//add protocol id
br_off[4] = protocolId;
//add XNL flags
br_off[5] = 0x01;
//add destination addres (previous message source address)
temp = BitConverter.GetBytes(sourceAddr);
br_off[6] = temp[1];
br_off[7] = temp[0];
//add source addres ()
temp = BitConverter.GetBytes(xnlAdress);
br_off[8] = temp[1];
br_off[9] = temp[0];
//add transaction ID
temp = BitConverter.GetBytes(transID_low);
byte[] temp1 = BitConverter.GetBytes(transId);
br_off[10] = temp1[1];
br_off[11] = temp[0];
//add payload length
temp = BitConverter.GetBytes(0x0009);
br_off[12] = temp[1];
br_off[13] = temp[0];
//opcode
temp = BitConverter.GetBytes(0xb405);
br_off[14] = temp[1];
br_off[15] = temp[0];
//PUI source
br_off[16] = 0x00;
//PUI TYPE
br_off[17] = 0x00;
//PUI ID
temp = BitConverter.GetBytes(0x00A3);
br_off[18] = temp[1];
br_off[19] = temp[0];
//pui state
if (status)
{
br_off[20] = 0x01;
br_off[5] = 0x01;
}
else
{
br_off[20] = 0x00;
br_off[5] = 0x02;
}
//pui min/max
br_off[21] = 0x00;
br_off[22] = 0x03;
return br_off;
}
//0x040E MICCTRLREQ Microphone Control Request(this doesnt work) - for future use
public byte[] micONoff(bool state)
{
transID_low++;
if (transID_low > 255) transID_low = 0;
byte[] temp = new byte[2];
byte[] br_off = new byte[20];
//add message length
br_off[0] = 0x00;
br_off[1] = 0x12;
//add opcode
temp = BitConverter.GetBytes((ushort)OPCODE_ENUM.DATA_MSG);
br_off[2] = temp[1];
br_off[3] = temp[0];
//add protocol id
br_off[4] = protocolId;
//add XNL flags
br_off[5] = 0x01;
//add destination addres (previous message source address)
temp = BitConverter.GetBytes(sourceAddr);
br_off[6] = temp[1];
br_off[7] = temp[0];
//add source addres ()
temp = BitConverter.GetBytes(xnlAdress);
br_off[8] = temp[1];
br_off[9] = temp[0];
//add transaction ID
temp = BitConverter.GetBytes(transID_low);
byte[] temp1 = BitConverter.GetBytes(transId);
br_off[10] = temp1[1];
br_off[11] = temp[0];
//add payload length
temp = BitConverter.GetBytes(0x0006);
br_off[12] = temp[1];
br_off[13] = temp[0];
//opcode
temp = BitConverter.GetBytes(0x040e);
br_off[14] = temp[1];
br_off[15] = temp[0];
//function
if (state)
{
br_off[16] = 0x01;
br_off[5] = 0x02;
}
else
{
br_off[16] = 0x02;
br_off[5] = 0x02;
}
//mic type
br_off[17] = 0x01;
//signal type
br_off[18] = 0x01;
//mic gain
br_off[19] = 0x00;
return br_off;
}
//0x041E CALLCTRLREQ Call Control Request;
//int type ====GROUP=0/Private=1/allCall=2
//int groupOrSubscriberId(passed from SD) or 0 if it is an all call
/// <summary>
/// 0x041E CALLCTRLREQ Call Control Request;
/// int type ====GROUP=0/Private=1/allCall=2
/// int groupOrSubscriberId(passed from SD) or 0 if it is an all call
/// </summary>
/// <param name="type"></param>
/// <param name="groupOrSubscriberId"></param>
/// <returns></returns>
public byte[] callType(int type, int groupOrSubscriberId)
{
transID_low++;
if (transID_low > 255) transID_low = 0;
byte[] temp = new byte[2];
byte[] br_off = new byte[29];
//add message length
br_off[0] = 0x00;
br_off[1] = 0x1b;
//add opcode
temp = BitConverter.GetBytes((ushort)OPCODE_ENUM.DATA_MSG);
br_off[2] = temp[1];
br_off[3] = temp[0];
//add protocol id
br_off[4] = protocolId;
//add XNL flags
br_off[5] = 0x01;
//add destination addres (previous message source address)
temp = BitConverter.GetBytes(sourceAddr);
br_off[6] = temp[1];
br_off[7] = temp[0];
//add source addres ()
temp = BitConverter.GetBytes(xnlAdress);
br_off[8] = temp[1];
br_off[9] = temp[0];
//add transaction ID
temp = BitConverter.GetBytes(transID_low);
byte[] temp1 = BitConverter.GetBytes(transId);
br_off[10] = temp1[1];
br_off[11] = temp[0];
//add payload length
temp = BitConverter.GetBytes(0x000f);
br_off[12] = temp[1];
br_off[13] = temp[0];
//opcode
temp = BitConverter.GetBytes(0x041e);
br_off[14] = temp[1];
br_off[15] = temp[0];
//function
br_off[16] = 0x01;
//call type
br_off[17] = 0x06;
//remote address
br_off[18] = 0x01;
br_off[19] = 0x03;
br_off[20] = 0x00;
br_off[21] = 0x00;
br_off[22] = 0x00;
//rezerved nr
br_off[23] = 0x00;
br_off[24] = 0x00;
//group id size
br_off[25] = 0x03;
//group id number
br_off[26] = 0xff;
br_off[27] = 0xff;
br_off[28] = 0xff;
// modifie parameters to create group or private call (!!!! default is all call!!!!!)
switch (type)
{
case 0:
//call type
br_off[17] = 0x06;
//transaction id
br_off[5] = 0x03;
//group id number
temp = BitConverter.GetBytes(groupOrSubscriberId);
br_off[26] = temp[2];
br_off[27] = temp[1];
br_off[28] = temp[0];
break;
case 1:
//call type
br_off[17] = 0x04;
//transaction id
br_off[5] = 0x04;
//remote address
temp = BitConverter.GetBytes(groupOrSubscriberId);
br_off[20] = temp[2];
br_off[21] = temp[1];
br_off[22] = temp[0];
break;
case 2:
//transaction id
br_off[5] = 0x05;
break;
default:
//call type
//Console.WriteLine("Creating message for all call");
//transaction id
br_off[5] = 0x05;
break;
}
/*
Console.Write("TX :");
for (int i = 0; i < br_off.Length; i++)
Console.Write(" 0x" + br_off[i].ToString("X") + " ");
Console.WriteLine(" ");
*/
return br_off;
}
//0x040D CHZNSELREQ Channel Zone Selection Request
//channelnr -- channel number; if 0 the query for current channel nr
public byte[] channelSelect(int channelNR, int zoneNr)
{
transID_low++;
if (transID_low > 255) transID_low = 0;
byte[] temp = new byte[2];
byte[] br_off = new byte[21];
//add message length
br_off[0] = 0x00;
br_off[1] = 0x13;
//add opcode
temp = BitConverter.GetBytes((ushort)OPCODE_ENUM.DATA_MSG);
br_off[2] = temp[1];
br_off[3] = temp[0];
//add protocol id
br_off[4] = protocolId;
//add XNL flags
br_off[5] = 0x01;
//add destination addres (previous message source address)
temp = BitConverter.GetBytes(sourceAddr);
br_off[6] = temp[1];
br_off[7] = temp[0];
//add source addres ()
temp = BitConverter.GetBytes(xnlAdress);
br_off[8] = temp[1];
br_off[9] = temp[0];
//add transaction ID
temp = BitConverter.GetBytes(transID_low);
byte[] temp1 = BitConverter.GetBytes(transId);
br_off[10] = temp1[1];
br_off[11] = temp[0];
//add payload length
temp = BitConverter.GetBytes(0x0007);
br_off[12] = temp[1];
br_off[13] = temp[0];
//opcode
temp = BitConverter.GetBytes(0x040D);
br_off[14] = temp[1];
br_off[15] = temp[0];
//function
br_off[16] = 0x80;
//zone number
temp = BitConverter.GetBytes(0x0000);
br_off[17] = temp[1];
br_off[18] = temp[0];
//channel number
temp = BitConverter.GetBytes(channelNR);
br_off[19] = temp[1];
br_off[20] = temp[0];
if (xnlFlag > 0x40)
{
xnlFlag = 0x09;
}
if (channelNR == 0 && zoneNr ==0)
{
//Console.WriteLine("Creating message for CHANNel querry");
br_off[16] = 0x80;
br_off[5] = xnlFlag++;
//Console.WriteLine("xnlFlag=" + xnlFlag.ToString());
}
else
{
//Console.WriteLine("Creating message for CHANNel selection");
br_off[16] = 0x05;
br_off[5] = xnlFlag++;
//zone number
temp = BitConverter.GetBytes(zoneNr);
br_off[17] = temp[1];
br_off[18] = temp[0];
//channel number
temp = BitConverter.GetBytes(channelNR);
br_off[19] = temp[1];
br_off[20] = temp[0];
}
return br_off;
}
//0x041C RRCTRLREQ Remote Radio Control Request
public byte[] remoteRadioControl(int radioID, REMOTE_RADIO_FUNCS remoteFunction)
{
transID_low++;
if (transID_low > 255) transID_low = 0;
byte[] temp = new byte[2];
byte[] br_off = new byte[29];
//add message length
br_off[0] = 0x00;
br_off[1] = 0x1b;
//add opcode
temp = BitConverter.GetBytes((ushort)OPCODE_ENUM.DATA_MSG);
br_off[2] = temp[1];
br_off[3] = temp[0];
//add protocol id
br_off[4] = protocolId;
//add XNL flags
br_off[5] = xnlFlag++;
//add destination addres (previous message source address)
temp = BitConverter.GetBytes(sourceAddr);
br_off[6] = temp[1];
br_off[7] = temp[0];
//add source addres ()
temp = BitConverter.GetBytes(xnlAdress);
br_off[8] = temp[1];
br_off[9] = temp[0];
//add transaction ID
temp = BitConverter.GetBytes(transID_low);
byte[] temp1 = BitConverter.GetBytes(transId);
br_off[10] = temp1[1];
br_off[11] = temp[0];
//add payload length
temp = BitConverter.GetBytes(0x000f);
br_off[12] = temp[1];
br_off[13] = temp[0];
//opcode
temp = BitConverter.GetBytes(0x041C);
br_off[14] = temp[1];
br_off[15] = temp[0];
//Feature
br_off[16] = (byte)remoteFunction;
//Operation
br_off[17] = 0x01;
//Remote Address Structure
br_off[18] = 0x01;
br_off[19] = 0x03;
//remote address
temp = BitConverter.GetBytes(radioID);
br_off[20] = temp[2];
br_off[21] = temp[1];
br_off[22] = temp[0];
//rezerved nr
br_off[23] = 0x00;
br_off[24] = 0x00;
//group id size
br_off[25] = 0x03;
//group id number
br_off[26] = 0xff;
br_off[27] = 0xff;
br_off[28] = 0xff;
return br_off;
}
//0x0413 SHUTDWNREQ Shut Down Request
public byte[] SendEmergencyAck()
{
transID_low++;
if (transID_low > 255) transID_low = 0;
byte[] temp = new byte[2];
byte[] br_off = new byte[19];
//add message length
br_off[0] = 0x00;
br_off[1] = 0x11;
//add opcode
temp = BitConverter.GetBytes((ushort)OPCODE_ENUM.DATA_MSG);
br_off[2] = temp[1];
br_off[3] = temp[0];
//add protocol id
br_off[4] = protocolId;
//add XNL flags
br_off[5] = xnlFlag++;
//add destination addres (previous message source address)
temp = BitConverter.GetBytes(sourceAddr);
br_off[6] = temp[1];
br_off[7] = temp[0];
//add source addres ()
temp = BitConverter.GetBytes(xnlAdress);
br_off[8] = temp[1];
br_off[9] = temp[0];
//add transaction ID
temp = BitConverter.GetBytes(transID_low);
byte[] temp1 = BitConverter.GetBytes(transId);
br_off[10] = temp1[1];
br_off[11] = temp[0];
//add payload length
temp = BitConverter.GetBytes(0x0005);
br_off[12] = temp[1];
br_off[13] = temp[0];
//opcode
temp = BitConverter.GetBytes(0x0413);
br_off[14] = temp[1];
br_off[15] = temp[0];
//function
br_off[16] = (byte)(0x03);
//Option
temp = BitConverter.GetBytes(0x0000);
br_off[17] = temp[1];
br_off[18] = temp[0];
/*
//remote address
br_off[19] = 0x01;
br_off[20] = 0x03;
temp = new byte[3];
temp = BitConverter.GetBytes(radioID);
br_off[21] = temp[2];
br_off[22] = temp[1];
br_off[23] = temp[0];*/
/*
Console.WriteLine("%%%%%%%%%%% SendEmergency %%%%%%%%%%%%%%%%%%%%%%% " + br_off.Length);
Console.Write("SendEmergency: ");
for (int i = 0; i < br_off.Length; i++)
Console.Write(" 0x" + br_off[i].ToString("X"));
Console.WriteLine("");
Console.WriteLine("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ");
*/
return br_off;
}
//0x0413 SHUTDWNREQ Shut Down Request
public byte[] SendEmergency(bool isOn)
{
transID_low++;
if (transID_low > 255) transID_low = 0;
byte[] temp = new byte[2];
byte[] br_off = new byte[19];
//add message length
br_off[0] = 0x00;
br_off[1] = 0x11;
//add opcode
temp = BitConverter.GetBytes((ushort)OPCODE_ENUM.DATA_MSG);
br_off[2] = temp[1];
br_off[3] = temp[0];
//add protocol id
br_off[4] = protocolId;
//add XNL flags
br_off[5] = xnlFlag++;
//add destination addres (previous message source address)
temp = BitConverter.GetBytes(sourceAddr);
br_off[6] = temp[1];
br_off[7] = temp[0];
//add source addres ()
temp = BitConverter.GetBytes(xnlAdress);
br_off[8] = temp[1];
br_off[9] = temp[0];
//add transaction ID
temp = BitConverter.GetBytes(transID_low);
byte[] temp1 = BitConverter.GetBytes(transId);
br_off[10] = temp1[1];
br_off[11] = temp[0];
//add payload length
temp = BitConverter.GetBytes(0x0005);
br_off[12] = temp[1];
br_off[13] = temp[0];
//opcode
temp = BitConverter.GetBytes(0x0413);
br_off[14] = temp[1];
br_off[15] = temp[0];
//function
br_off[16] = (byte)((isOn) ? 1 : 3);
//Option
br_off[17] = 0x00;
br_off[18] = 0x00;
/*
Console.WriteLine("%%%%%%%%%%% SendEmergency %%%%%%%%%%%%%%%%%%%%%%% " + br_off.Length);
Console.Write("SendEmergency: ");
for (int i = 0; i < br_off.Length; i++)
Console.Write(" 0x" + br_off[i].ToString("X"));
Console.WriteLine("");
Console.WriteLine("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ");
*/
return br_off;
}
//0x0401 DISPTXTRQ Display Text Request
public byte[] DisplayText(string txt)
{
//byte[] b_txt = txt.ge
transID_low++;
if (transID_low > 255) transID_low = 0;
byte[] temp = new byte[2];
byte[] br_off = new byte[27 + txt.Length*2];
//add message length
temp = BitConverter.GetBytes(0x19 + txt.Length * 2);
br_off[0] = temp[1];
br_off[1] = temp[0];
//add opcode
temp = BitConverter.GetBytes((ushort)OPCODE_ENUM.DATA_MSG);
br_off[2] = temp[1];
br_off[3] = temp[0];
//add protocol id
br_off[4] = protocolId;
//add XNL flags
br_off[5] = xnlFlag++;
//add destination addres (previous message source address)
temp = BitConverter.GetBytes(sourceAddr);
br_off[6] = temp[1];
br_off[7] = temp[0];
//add source addres ()
temp = BitConverter.GetBytes(xnlAdress);
br_off[8] = temp[1];
br_off[9] = temp[0];
//add transaction ID
temp = BitConverter.GetBytes(transID_low);
byte[] temp1 = BitConverter.GetBytes(transId);
br_off[10] = temp1[1];
br_off[11] = temp[0];
//add payload length
temp = BitConverter.GetBytes(13 + txt.Length * 2 );
br_off[12] = temp[1];
br_off[13] = temp[0];
//opcode
temp = BitConverter.GetBytes(0x0401);
br_off[14] = temp[1];
br_off[15] = temp[0];
//function
br_off[16] = 0x00;
//Token
br_off[17] = 0xff;
//region
br_off[18] = 0x01;
//timed
br_off[19] = 0x00;
br_off[20] = 0x0a;
//class
br_off[21] = 0x04;
//encode
br_off[22] = 0x01;
//num bytes
temp = BitConverter.GetBytes(txt.Length*2+2);
br_off[23] = temp[1];
br_off[24] = temp[0];
//System.Text.ASCIIEncoding.ASCII.
System.Text.Encoding enc2 = System.Text.Encoding.ASCII;
byte[] buf2 = enc2.GetBytes(txt);
//actual bytes
for (int i = 0; i < buf2.Length; i++)
{
br_off[25 + i * 2] = 0x00;
br_off[25 + i * 2 + 1] = buf2[i];
}
/*
//c1
br_off[25] = 0x00;
br_off[26] = 0x4c;
//c2
br_off[27] = 0x00;
br_off[28] = 0x49;
*/
//end c
br_off[25 + txt.Length * 2] = 0x00;
br_off[26 + txt.Length * 2] = 0x00;
Utils.WriteLine("%%%%%%%%%%% DisplayText %%%%%%%%%%%%%%%%%%%%%%% " + br_off.Length, ConsoleType.XNL);
Utils.WriteLine("DisplayText: ", ConsoleType.XNL);
for (int i = 0; i < br_off.Length; i++)
Utils.Write(" 0x" + br_off[i].ToString("X"), ConsoleType.XNL);
Utils.WriteLine("", ConsoleType.XNL);
Utils.WriteLine("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ", ConsoleType.XNL);
return br_off;
}
//0x040A SHUTDWNREQ Shut Down Request
public byte[] RestartRequest()
{
transID_low++;
if (transID_low > 255) transID_low = 0;
byte[] temp = new byte[2];
byte[] br_off = new byte[17];
//add message length
br_off[0] = 0x00;
br_off[1] = 0x0f;
//add opcode
temp = BitConverter.GetBytes((ushort)OPCODE_ENUM.DATA_MSG);
br_off[2] = temp[1];
br_off[3] = temp[0];
//add protocol id
br_off[4] = protocolId;
//add XNL flags
br_off[5] = xnlFlag++;
//add destination addres (previous message source address)
temp = BitConverter.GetBytes(sourceAddr);
br_off[6] = temp[1];
br_off[7] = temp[0];
//add source addres ()
temp = BitConverter.GetBytes(xnlAdress);
br_off[8] = temp[1];
br_off[9] = temp[0];
//add transaction ID
temp = BitConverter.GetBytes(transID_low);
byte[] temp1 = BitConverter.GetBytes(transId);
br_off[10] = temp1[1];
br_off[11] = temp[0];
//add payload length
temp = BitConverter.GetBytes(0x0003);
br_off[12] = temp[1];
br_off[13] = temp[0];
//opcode
temp = BitConverter.GetBytes(0x040A);
br_off[14] = temp[1];
br_off[15] = temp[0];
//Operation
br_off[16] = 0x02;
return br_off;
}
//0x000F VERINFO Version Information Request
public byte[] VersionRequest()
{
transID_low++;
if (transID_low > 255) transID_low = 0;
byte[] temp = new byte[2];
byte[] br_off = new byte[17];
//add message length
br_off[0] = 0x00;
br_off[1] = 0x0f;
//add opcode
temp = BitConverter.GetBytes((ushort)OPCODE_ENUM.DATA_MSG);
br_off[2] = temp[1];
br_off[3] = temp[0];
//add protocol id
br_off[4] = protocolId;
//add XNL flags
br_off[5] = xnlFlag++;
//add destination addres (previous message source address)
temp = BitConverter.GetBytes(sourceAddr);
br_off[6] = temp[1];
br_off[7] = temp[0];
//add source addres ()
temp = BitConverter.GetBytes(xnlAdress);
br_off[8] = temp[1];
br_off[9] = temp[0];
//add transaction ID
temp = BitConverter.GetBytes(transID_low);
byte[] temp1 = BitConverter.GetBytes(transId);
br_off[10] = temp1[1];
br_off[11] = temp[0];
//add payload length
temp = BitConverter.GetBytes(0x0003);
br_off[12] = temp[1];
br_off[13] = temp[0];
//opcode
temp = BitConverter.GetBytes(0x000F);
br_off[14] = temp[1];
br_off[15] = temp[0];
//Operation
br_off[16] = 0x00;
return br_off;
}
//0x000F VERINFO Version Information Request
public byte[] disableDisplayBcstRequest()
{
transID_low++;
if (transID_low > 255) transID_low = 0;
byte[] temp = new byte[2];
byte[] br_off = new byte[27];
/* Length = 25 = 0x0019*/
br_off[0] = (byte)(0x0019 >> 8);
br_off[1] = (byte)(0x0019);
/* OpCode */
br_off[2] = (byte)(0x00);
br_off[3] = (byte)(0x0B);
/* ProtocolID and XNLFlags */
br_off[4] = protocolId;
/* XNLFlag */
br_off[5] = xnlFlag++;
/* Destination Address = MasterAddress */
temp = BitConverter.GetBytes(sourceAddr);
br_off[6] = temp[1];
br_off[7] = temp[0];
/* Source Address = TempXNLAddress */
temp = BitConverter.GetBytes(xnlAdress);
br_off[8] = temp[1];
br_off[9] = temp[0];
/* TransactionID */
temp = BitConverter.GetBytes(transID_low);
byte[] temp1 = BitConverter.GetBytes(transId);
br_off[10] = temp1[1];
br_off[11] = temp[0];
/* PayLoad Length = 0x000D*/
br_off[12] = (byte)(0x000D >> 8);
br_off[13] = (byte)(0x000D);
/* OpCode */
br_off[14] = (byte)(0x00B4);
br_off[15] = (byte)(0x0000);
/* XCMP Version */
br_off[16] = majXNLVers[3];
br_off[17] = majXNLVers[2];
br_off[18] = majXNLVers[1];
br_off[19] = majXNLVers[0];
/* Device init Type */
br_off[20] = 0x02; // Device Status Update - 0x02
/* ### Start Device Status Info Region ### */
/* Device Type [Size 1 byte] */
br_off[21] = 0x01;
/* Device Status [Size 2 byte] */
br_off[22] = 0x00;
br_off[23] = 0x00;
/* Device Descriptor Size [Size 1 byte] */
br_off[24] = 0x02; // 2 bytes for the pair <attributeID><value>
/* Device Descriptor [Size 0+] */
br_off[25] = 0x02;
br_off[26] = 0x00;
/* ### End Device Status Info Region ### */
return br_off;
}
//respond message
public byte[] genResponseMessage()
{
//Console.WriteLine("!!!!!!Generating response!!!");
byte[] temp = new byte[2];
byte[] toReturn;
switch (opcode)
{
//case we got XNL_MASTER_STATUS_BRDCST create DEVICE_AUTH_KEY_REQUEST
case (ushort)OPCODE_ENUM.XNL_MASTER_STATUS_BRDCST:
//Console.WriteLine("Creating message for DEVICE_AUTH_KEY_REQUEST");
byte[] device_auth_key_request = new byte[14];
//add message length
device_auth_key_request[0] = 0x00;
device_auth_key_request[1] = 0x0C;
//add opcode
temp = BitConverter.GetBytes((ushort)OPCODE_ENUM.DEVICE_AUTH_KEY_REQUEST);
device_auth_key_request[2] = temp[1];
device_auth_key_request[3] = temp[0];
//add protocol id
device_auth_key_request[4] = protocolId;
//add XNL flags
device_auth_key_request[5] = XNLflags;
//add destination addres (previus message source addres)
temp = BitConverter.GetBytes(sourceAddr);
device_auth_key_request[6] = temp[1];
device_auth_key_request[7] = temp[0];
//add source addres (null)
temp = BitConverter.GetBytes(0x0000);
device_auth_key_request[8] = temp[0];
device_auth_key_request[9] = temp[1];
//add transaction ID
temp = BitConverter.GetBytes(0x0000);
device_auth_key_request[10] = temp[0];
device_auth_key_request[11] = temp[1];
//add payload length
temp = BitConverter.GetBytes(0x0000);
device_auth_key_request[12] = temp[0];
device_auth_key_request[13] = temp[1];
toReturn = device_auth_key_request;
break;
//case we got DEVICE_AUTH_KEY_REPLY create DEVICE_CONN_REQUEST
case (ushort)OPCODE_ENUM.DEVICE_AUTH_KEY_REPLY:
byte[] device_conn_request = new byte[26];
//add message length
device_conn_request[0] = 0x00;
device_conn_request[1] = 0x18;
//add opcode
temp = BitConverter.GetBytes((ushort)OPCODE_ENUM.DEVICE_CONN_REQUEST);
device_conn_request[2] = temp[1];
device_conn_request[3] = temp[0];
//add protocol id
device_conn_request[4] = protocolId;
//add XNL flags
device_conn_request[5] = XNLflags;
//add destination addres (previous message source address)
temp = BitConverter.GetBytes(sourceAddr);
device_conn_request[6] = temp[1];
device_conn_request[7] = temp[0];
//add source addres (null)
Utils.WriteLine("source addres:" + xnlAdress, ConsoleType.XNL);
temp = BitConverter.GetBytes(xnlAdress);
device_conn_request[8] = temp[1];
device_conn_request[9] = temp[0];
//add transaction ID
temp = BitConverter.GetBytes(0x0000);
device_conn_request[10] = temp[1];
device_conn_request[11] = temp[0];
//add payload length
temp = BitConverter.GetBytes(0x000C);
device_conn_request[12] = temp[1];
device_conn_request[13] = temp[0];
//add preferred xnl address
temp = BitConverter.GetBytes(0x0000);
device_conn_request[14] = temp[1];
device_conn_request[15] = temp[0];
//add device type
device_conn_request[16] = 0x0A;
//add authentification index
device_conn_request[17] = 0x01;
for (int i = 18; i < 26; i++)
{
device_conn_request[i] = tempAuthKey[i - 18];
}
/*
Console.WriteLine("Sent device_conn_request:");
for (int i = 0; i < 26; i++)
Console.Write("0x" + device_conn_request[i].ToString("X") + " ");
Console.WriteLine();
*/
toReturn = device_conn_request;
break;
//case we got DATA_MSG create DATA_MSG_ACK
case (ushort)OPCODE_ENUM.DATA_MSG:
byte[] data_msg_ack = new byte[14];
//add message length
data_msg_ack[0] = 0x00;
data_msg_ack[1] = 0x0C;
//add opcode
temp = BitConverter.GetBytes((ushort)OPCODE_ENUM.DATA_MSG_ACK);
data_msg_ack[2] = temp[1];
data_msg_ack[3] = temp[0];
//add protocol id
data_msg_ack[4] = protocolId;
//add XNL flags
data_msg_ack[5] = XNLflags;
//add destination addres (previous message source address)
temp = BitConverter.GetBytes(sourceAddr);
data_msg_ack[6] = temp[1];
data_msg_ack[7] = temp[0];
//add source addres (null)
temp = BitConverter.GetBytes(xnlAdress);
data_msg_ack[8] = temp[1];
data_msg_ack[9] = temp[0];
//add transaction ID
temp = BitConverter.GetBytes(transID_low);
byte[] temp1 = BitConverter.GetBytes(transId);
data_msg_ack[10] = temp1[1];
data_msg_ack[11] = temp[0];
//add payload length
temp = BitConverter.GetBytes(0x0000);
data_msg_ack[12] = temp[1];
data_msg_ack[13] = temp[0];
toReturn = data_msg_ack;
/*
Console.WriteLine("%%%%%%%%%%% ACK SENT %%%%%%%%%%%%%%%%%%%%%%% " + data_msg_ack.Length);
Console.Write("ACK: ");
for (int i = 2; i < data_msg_ack.Length; i++)
Console.Write(" 0x" + data_msg_ack[i].ToString("X"));
Console.WriteLine("");
Console.WriteLine("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ");
*/
break;
case (ushort)OPCODE_ENUM.DATA_MSG_ACK:
default:
byte[] zero2 = { 0, 0 };
toReturn = zero2;
break;
}//switch
return toReturn;
}//responde message
//send Nav Request
public byte[] sendNavReq()
{
byte[] temp = new byte[2];
//Console.WriteLine(" ");
//Console.WriteLine("--------------BACK BUtton PUI------------------------------------------- ");
transID_low++;
if (transID_low > 255) transID_low = 0;
byte[] br_off = new byte[22];
//add message length
br_off[0] = 0x00;
br_off[1] = 0x14;
//add opcode
temp = BitConverter.GetBytes((ushort)OPCODE_ENUM.DATA_MSG);
br_off[2] = temp[1];
br_off[3] = temp[0];
//add protocol id
br_off[4] = protocolId;
//add XNL flags
br_off[5] = 0x01;
//add destination addres (previous message source address)
temp = BitConverter.GetBytes(sourceAddr);
br_off[6] = temp[1];
br_off[7] = temp[0];
//add source addres ()
temp = BitConverter.GetBytes(xnlAdress);
br_off[8] = temp[1];
br_off[9] = temp[0];
//add transaction ID
temp = BitConverter.GetBytes(transID_low);
byte[] temp1 = BitConverter.GetBytes(transId);
br_off[10] = temp1[1];
br_off[11] = temp[0];
//add payload length
temp = BitConverter.GetBytes(0x0008);
br_off[12] = temp[1];
br_off[13] = temp[0];
//opcode
temp = BitConverter.GetBytes(0x041F);
br_off[14] = temp[1];
br_off[15] = temp[0];
//Function
br_off[16] = 0x01;
//br_off[16] = 0x80;
//Display Mode
br_off[17] = 0x00;
//br_off[17] = 0x02;
//Menu or List ID
temp = BitConverter.GetBytes(0x0001);
//temp = BitConverter.GetBytes(0x0002);
br_off[18] = temp[1];
br_off[19] = temp[0];
//Count
temp = BitConverter.GetBytes(0x0002);
br_off[20] = temp[1];
br_off[21] = temp[0];
//br_off[20] = 0x00;
//br_off[21] = 0xFF;
//for (int i = 0; i < 18; i++)
///Console.Write(" 0x" + br_off[i].ToString("X") + " ");
//Console.WriteLine(" ");
return br_off;
}
//send Nav Request
public byte[] sendNavReqQueryList()
{
byte[] temp = new byte[2];
//Console.WriteLine(" ");
//Console.WriteLine("--------------BACK BUtton PUI------------------------------------------- ");
transID_low++;
if (transID_low > 255) transID_low = 0;
byte[] br_off = new byte[22];
//add message length
br_off[0] = 0x00;
br_off[1] = 0x14;
//add opcode
temp = BitConverter.GetBytes((ushort)OPCODE_ENUM.DATA_MSG);
br_off[2] = temp[1];
br_off[3] = temp[0];
//add protocol id
br_off[4] = protocolId;
//add XNL flags
br_off[5] = 0x01;
//add destination addres (previous message source address)
temp = BitConverter.GetBytes(sourceAddr);
br_off[6] = temp[1];
br_off[7] = temp[0];
//add source addres ()
temp = BitConverter.GetBytes(xnlAdress);
br_off[8] = temp[1];
br_off[9] = temp[0];
//add transaction ID
temp = BitConverter.GetBytes(transID_low);
byte[] temp1 = BitConverter.GetBytes(transId);
br_off[10] = temp1[1];
br_off[11] = temp[0];
//add payload length
temp = BitConverter.GetBytes(0x0008);
br_off[12] = temp[1];
br_off[13] = temp[0];
//opcode
temp = BitConverter.GetBytes(0x041F);
br_off[14] = temp[1];
br_off[15] = temp[0];
//Function
//br_off[16] = 0x01;
br_off[16] = 0x80;
//Display Mode
//br_off[17] = 0x00;
br_off[17] = 0x00;
//Menu or List ID
temp = BitConverter.GetBytes(0x0001);
//temp = BitConverter.GetBytes(0x0002);
br_off[18] = temp[1];
br_off[19] = temp[0];
//Count
temp = BitConverter.GetBytes(0x0002);
br_off[20] = temp[1];
br_off[21] = temp[0];
//br_off[20] = 0x00;
//br_off[21] = 0xFF;
//for (int i = 0; i < 18; i++)
///Console.Write(" 0x" + br_off[i].ToString("X") + " ");
//Console.WriteLine(" ");
return br_off;
}
#endregion
private void printHex(string dir, byte[] data)
{
int length = 0;
length += data[0] << 8;
length += data[1];
string hexed = "";
for (int i = 0; i < length + 2; i++)
hexed += "0x" + data[i].ToString("x2") + " ";
Utils.WriteLine("" + dir + hexed, ConsoleType.XNL);
}
}// radio message class end
}