SafeDispatch/MotoTRBO_XNL_Cmd/RadioMessage.cs
2024-02-22 18:43:59 +02:00

1847 lines
70 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}