using Aurora.Api; using Aurora.Api.Devices; using Hermes; using System; using System.Linq; using System.Runtime.InteropServices; using System.Threading; using System.Windows.Documents; using static AuroraTriggerBoard.Trigger; namespace AuroraTriggerBoard.SJT { partial class SJTTrigger : SerialConn, ITrigger { uint m_iTrigSetupTime_us; uint m_iTrigPulseWidth_us; uint m_iRtnWaitTime_us; byte Max_OutCh = 8; byte DebugMode = 1; uint m_iSendReTry_Num = 2; uint HW_Ver = 0; uint FW_Ver = 0; uint BUILDSTAMP = 0; uint IDENTIFY_FLAG = 0; public SJTTrigger(string deviceId, bool isSimul) : base(deviceId, isSimul) { } public int Connect(IConnConfig config) { if (Open(config as SerialConnConfig) != E1.OK) { return E2.NOT_CONNECTED; } m_iTrigSetupTime_us = 1; m_iTrigPulseWidth_us = 1; //m_iRtnWaitTime_us = 100000; m_iRtnWaitTime_us = 100; return E1.OK; } public int Disconnect() { return Close(); } // public int DisableTrigCorrectTable() // { // uint data = 0x1; // // } public bool IsCommError() { return IsConnected(); } public byte ToHex(byte Data) { if ((Data & 0x10) == 0) // a~f, A~F { Data += 9; } Data &= 0x0F; return Data; } public byte h2c(ref byte[] hex) { return Convert.ToByte((Convert.ToInt32(ToHex(hex[0])) << 4) | Convert.ToInt32(ToHex(hex[1]))); } public byte Hex2Ascii(byte hex) { if (hex <= 9) { return Convert.ToByte((Convert.ToInt32(hex) | 0x30)); } else if ((hex >= 10) && (hex <= 15)) { return Convert.ToByte((Convert.ToInt32(hex - 9) | 0x40)); } else return 0; } public int TotalBit_add(ref byte[] charPt, byte char_num) { int sum = 0; for (int i = 0; i < char_num; i++) { sum += (charPt[i] & 0x01) + ((charPt[i] & 0x02) >> 1) + ((charPt[i] & 0x04) >> 2) + ((charPt[i] & 0x08) >> 3) + ((charPt[i] & 0x10) >> 4) + ((charPt[i] & 0x20) >> 5) + ((charPt[i] & 0x40) >> 6) + ((charPt[i] & 0x80) >> 7); } return sum; } //ushort SJUartSingleSend(int addr, uint data, sbyte mode = 0) ushort SJUartSingleSend(int addr, T data, sbyte mode = 0) { // by SJ 170126 ushort rtn = 0; if (0 == mode) rtn = SJUartAsSingleSend(addr, data); else if (1 == mode) rtn = SJUartRawSingleSend(addr, data); //if ((DebugMode >= 2) && (NULL != Connected_COM)) { // //CStringA Tmp; // //Tmp.Format("Single Send 32Bit : Addr 0x%x / RAW mode %d / Data 0x%x: rtn %x\r\n ", addr, mode, data, rtn); Put_Log(Tmp, *Connected_COM); // string temp; // temp = formatA("Single Send 32Bit : Addr 0x%x / RAW mode %d / Data 0x%x: rtn %x\r\n ", addr, mode, data, rtn); Put_Log(temp, *Connected_COM); //} if ((DebugMode >= 2) && (IsConnected() == true)) Log.D(String.Format("Single Send 32Bit : Addr 0x{0:x} / RAW mode {1:d} / Data 0x{2:x}: rtn {3:x} ", addr, mode, data, rtn)); return rtn; } //public ushort SJUartAsSingleSend(int addr, uint data) public ushort SJUartAsSingleSend(int addr, T data) { // by SJ 170126 byte[] StartSignal = new byte[2]; byte[] RegAddr = new byte[4]; byte[] Data = new byte[8]; // 4 * data length byte[] recvPacket = new byte[3]; byte err_retry_cnt = 0; ushort rtn; uint bit_sum = 0; int i = 0; // m_comm.m_QueueRead.Clear(); // Data Seq1 : StartSignal StartSignal[0] = 0x48; // H StartSignal[1] = 0x4E; // N bit_sum += Convert.ToUInt32(TotalBit_add(ref StartSignal, 2)); // Data Seq2 : Option (skip) // Data Seq3 : Addr RegAddr[0] = Hex2Ascii(Convert.ToByte(addr & 0x000F)); RegAddr[1] = Hex2Ascii(Convert.ToByte((addr & 0x00F0) >> 4)); RegAddr[2] = Hex2Ascii(Convert.ToByte((addr & 0x0F00) >> 8)); RegAddr[3] = Hex2Ascii(Convert.ToByte((addr & 0xF000) >> 12)); bit_sum += Convert.ToUInt32(TotalBit_add(ref RegAddr, 4)); // Data Seq4 : DataSeq //Data[0] = Hex2Ascii(Convert.ToByte(data & 0x0000000F)); Data[1] = Hex2Ascii(Convert.ToByte((data & 0x000000F0) >> 4)); //Data[2] = Hex2Ascii(Convert.ToByte((data & 0x00000F00) >> 8)); Data[3] = Hex2Ascii(Convert.ToByte((data & 0x0000F000) >> 12)); //Data[4] = Hex2Ascii(Convert.ToByte((data & 0x000F0000) >> 16)); Data[5] = Hex2Ascii(Convert.ToByte((data & 0x00F00000) >> 20)); //Data[6] = Hex2Ascii(Convert.ToByte((data & 0x0F000000) >> 24)); Data[7] = Hex2Ascii(Convert.ToByte((data & 0xF0000000) >> 28 Data[0] = Hex2Ascii(Convert.ToByte((uint)(object)data & 0x0000000F)); Data[1] = Hex2Ascii(Convert.ToByte(((uint)(object)data & 0x000000F0) >> 4)); Data[2] = Hex2Ascii(Convert.ToByte(((uint)(object)data & 0x00000F00) >> 8)); Data[3] = Hex2Ascii(Convert.ToByte(((uint)(object)data & 0x0000F000) >> 12)); Data[4] = Hex2Ascii(Convert.ToByte(((uint)(object)data & 0x000F0000) >> 16)); Data[5] = Hex2Ascii(Convert.ToByte(((uint)(object)data & 0x00F00000) >> 20)); Data[6] = Hex2Ascii(Convert.ToByte(((uint)(object)data & 0x0F000000) >> 24)); Data[7] = Hex2Ascii(Convert.ToByte(((uint)(object)data & 0xF0000000) >> 28)); bit_sum += Convert.ToUInt32(TotalBit_add(ref Data, 8)); // Data Seq5 : EndSignal byte[] EndSignal = new byte[] { 0x59 }; // Y bit_sum += Convert.ToUInt32(TotalBit_add(ref EndSignal, 1)); // Data Seq5 : Checksum // just bit_sum raw data // CheckSum[0] = Hex2Ascii( (INT8U)(bit_sum & 0x0F) ); // CheckSum[1] = Hex2Ascii( (INT8U)(bit_sum & 0xF0) >> 4 ); // Data Integration byte[] packet = new byte[2 + 4 + 8 + 1 + 1]; packet[0] = StartSignal[0]; packet[1] = StartSignal[1]; packet[2] = RegAddr[0]; packet[3] = RegAddr[1]; packet[4] = RegAddr[2]; packet[5] = RegAddr[3]; packet[6] = Data[0]; packet[7] = Data[1]; packet[8] = Data[2]; packet[9] = Data[3]; packet[10] = Data[4]; packet[11] = Data[5]; packet[12] = Data[6]; packet[13] = Data[7]; packet[14] = EndSignal[0]; // packet[15] = CheckSum[0]; packet[16] = CheckSum[1]; packet[15] = Convert.ToByte(bit_sum); /* m_comm.WriteComm(&packet[0], 16); for(i = 0 ; i < 3 ; i++){ while(!m_comm.m_QueueRead.GetByte(&recvPacket[i])); } if((recvPacket[0] == StartSignal[1]) & (recvPacket[1] == 0x4F) & (recvPacket[2] == 0x4B) ) { rtn = true; } else { } free (packet); return rtn; */ uint RtnWait_Cnt; while (true) { Write(packet); RtnWait_Cnt = 0; Thread.Sleep(10); while (Read(recvPacket) <= 0) { Thread.Sleep(10); RtnWait_Cnt += 10; if (RtnWait_Cnt > m_iRtnWaitTime_us) { Log.D(String.Format("SJUartAsSingleSend Receive Fail {0:d} > {1:d}", RtnWait_Cnt, m_iRtnWaitTime_us)); return ERR_NORESPONSE; } }; if ((recvPacket[0] == StartSignal[1]) && (recvPacket[1] == 0x4F) && (recvPacket[2] == 0x4B)) // 'N OK' { // rtn = (recvPacket[2] | (recvPacket[1] << 8) | (recvPacket[0] << 16)); rtn = OK_RETURN; break; } else { Log.D(String.Format("SJUartAsSingleSend Send Fail {0:d} > {1:d} : {2:x}, {3:x}, {4:x}", err_retry_cnt, m_iSendReTry_Num, recvPacket[0], recvPacket[1], recvPacket[2])); if (err_retry_cnt >= m_iSendReTry_Num) { rtn = Convert.ToUInt16(ERR_RTN_NOT_OK | (Convert.ToInt32(recvPacket[2]) & 0xff)); break; } else { err_retry_cnt++; } } } return rtn; } //ushort SJUartRawSingleSend(int addr, uint data) ushort SJUartRawSingleSend(int addr, T data) { // by SJ 170906 byte[] StartSignal = new byte[2]; byte[] RegAddr = new byte[4]; //byte[] Data = new byte[4]; // 2 * data length Int32 DataLength = Marshal.SizeOf(data); byte[] Data = new byte[DataLength]; byte[] recvPacket = new byte[3]; byte err_retry_cnt = 0; ushort rtn; uint bit_sum = 0; int i = 0; // m_comm.m_QueueRead.Clear(); // Data Seq1 : StartSignal StartSignal[0] = 0x48; // H StartSignal[1] = 0x4F; // O bit_sum += Convert.ToUInt32(TotalBit_add(ref StartSignal, 2)); // Data Seq2 : Option (skip) // Data Seq3 : Addr RegAddr[0] = Hex2Ascii(Convert.ToByte(addr & 0x000F)); RegAddr[1] = Hex2Ascii(Convert.ToByte((addr & 0x00F0) >> 4)); RegAddr[2] = Hex2Ascii(Convert.ToByte((addr & 0x0F00) >> 8)); RegAddr[3] = Hex2Ascii(Convert.ToByte((addr & 0xF000) >> 12)); bit_sum += Convert.ToUInt32(TotalBit_add(ref RegAddr, 4)); // Data Seq4 : DataSeq #region //Data[0] = Hex2Ascii(Convert.ToByte((uint)(object)data & 0x000000FF)); //Data[1] = Hex2Ascii(Convert.ToByte(((uint)(object)data & 0x0000FF00) >> 8)); //Data[2] = Hex2Ascii(Convert.ToByte(((uint)(object)data & 0x00FF0000) >> 16)); //Data[3] = Hex2Ascii(Convert.ToByte(((uint)(object)data & 0xFF000000) >> 24)); //bit_sum += Convert.ToUInt32(TotalBit_add(ref Data, (byte)Data.Length)); #endregion Data[0] = Convert.ToByte((uint)(object)data & 0x000000FF); Data[1] = Convert.ToByte(((uint)(object)data & 0x0000FF00) >> 8); Data[2] = Convert.ToByte(((uint)(object)data & 0x00FF0000) >> 16); Data[3] = Convert.ToByte(((uint)(object)data & 0xFF000000) >> 24); if (DataLength > 4) { Data[4] = Convert.ToByte(((uint)(object)data & 0xFF00000000) >> 32); Data[5] = Convert.ToByte(((uint)(object)data & 0xFF0000000000) >> 40); Data[6] = Convert.ToByte(((uint)(object)data & 0xFF000000000000) >> 48); Data[7] = Convert.ToByte(((uint)(object)data & 0xFF00000000000000) >> 56); } bit_sum += Convert.ToUInt32(TotalBit_add(ref Data, (byte)DataLength)); // Data Seq5 : EndSignal byte[] EndSignal = new byte[] { 0x59 }; // Y bit_sum += Convert.ToUInt32(TotalBit_add(ref EndSignal, 1)); // Data Seq5 : Checksum // just bit_sum raw data // CheckSum[0] = Hex2Ascii( (INT8U)(bit_sum & 0x0F) ); // CheckSum[1] = Hex2Ascii( (INT8U)(bit_sum & 0xF0) >> 4 ); // Data Integration byte[] packet = new byte[2 + 4 + DataLength + 1 + 1]; packet[0] = StartSignal[0]; packet[1] = StartSignal[1]; packet[2] = RegAddr[0]; packet[3] = RegAddr[1]; packet[4] = RegAddr[2]; packet[5] = RegAddr[3]; packet[6] = Data[0]; packet[7] = Data[1]; packet[8] = Data[2]; packet[9] = Data[3]; if (DataLength > 4) { packet[10] = Data[4]; packet[11] = Data[5]; packet[12] = Data[6]; packet[13] = Data[7]; packet[14] = EndSignal[0]; // packet[15] = CheckSum[0]; packet[16] = CheckSum[1]; packet[15] = Convert.ToByte(bit_sum); } else { packet[10] = EndSignal[0]; // packet[15] = CheckSum[0]; packet[16] = CheckSum[1]; packet[11] = Convert.ToByte(bit_sum); } /* m_comm.WriteComm(&packet[0], 16); for(i = 0 ; i < 3 ; i++){ while(!m_comm.m_QueueRead.GetByte(&recvPacket[i])); } if((recvPacket[0] == StartSignal[1]) & (recvPacket[1] == 0x4F) & (recvPacket[2] == 0x4B) ) { rtn = true; } else { } free (packet); return rtn; */ uint RtnWait_Cnt; while (true) { Write(packet); RtnWait_Cnt = 0; Thread.Sleep(10); while (Read(recvPacket) <= 0) { Thread.Sleep(10); RtnWait_Cnt += 10; if (RtnWait_Cnt > m_iRtnWaitTime_us) { Log.D(String.Format("SJUartRawSingleSend Receive Fail {0:d} > {1:d}", RtnWait_Cnt, m_iRtnWaitTime_us)); return ERR_NORESPONSE; } }; if ((recvPacket[0] == StartSignal[1]) && (recvPacket[1] == 0x4F) && (recvPacket[2] == 0x4B)) // 'N OK' { // rtn = (recvPacket[2] | (recvPacket[1] << 8) | (recvPacket[0] << 16)); rtn = OK_RETURN; break; } else { //Thread.Sleep(50); Log.D(String.Format("SJUartRawSingleSend Send Fail {0:d} > {1:d} : {2:x}, {3:x}, {4:x}", err_retry_cnt, m_iSendReTry_Num, recvPacket[0], recvPacket[1], recvPacket[2])); if (err_retry_cnt >= m_iSendReTry_Num) { rtn = Convert.ToUInt16(ERR_RTN_NOT_OK | (Convert.ToInt32(recvPacket[2]) & 0xff)); break; } else { err_retry_cnt++; } } } return rtn; } //ushort SJUartRawBurstSend(int addr, ulong[] data, byte data_num, sbyte S_Ioption = 0) ushort SJUartRawBurstSend(int addr, ref T[] data, byte data_num, sbyte S_Ioption = 0) { // by SJ 170213 byte[] StartSignal = new byte[2]; byte[] Option = new byte[4]; byte[] RegAddr = new byte[4]; byte[] Data = new byte[8]; byte Max_ByteUnit = 0, Cur_ByteUnit; //ulong[] SendData = data; ulong[] SendData = data as ulong[]; byte[] recvPacket = new byte[3]; byte err_retry_cnt = 0; uint ByteLength; ushort rtn; uint bit_sum = 0; int i = 0, j = 0; // m_comm.m_QueueRead.Clear(); if ((0 == data_num) || (255 < data_num)) return ERR_VAL_BURST_DATANUM; // Data Seq1 : StartSignal StartSignal[0] = 0x48; // H StartSignal[1] = 0x51; // P bit_sum += Convert.ToUInt32(TotalBit_add(ref StartSignal, 2)); // before option check for (i = 0; i < data_num; i++) { if (SendData[i] < 0x100) Cur_ByteUnit = 1; else if (SendData[i] < 0x10000) Cur_ByteUnit = 2; else if (SendData[i] < 0x1000000) Cur_ByteUnit = 3; else if (SendData[i] < 0x100000000) Cur_ByteUnit = 4; else if (SendData[i] < 0x10000000000) Cur_ByteUnit = 5; else if (SendData[i] < 0x1000000000000) Cur_ByteUnit = 6; else if (SendData[i] < 0x100000000000000) Cur_ByteUnit = 7; else Cur_ByteUnit = 8; if (Max_ByteUnit < Cur_ByteUnit) Max_ByteUnit = Cur_ByteUnit; } ByteLength = 2 + 4 + 4 + (Convert.ToUInt32(Max_ByteUnit) * Convert.ToUInt32(data_num)) + 1 + 1; // Data Seq2 : Option if (0 == S_Ioption) Option[0] = 0x49; //'I' else Option[0] = 0x53; //'S' Option[1] = Hex2Ascii(Convert.ToByte(data_num & 0x0F)); // data_count LSB Option[2] = Hex2Ascii(Convert.ToByte((data_num & 0xF0) >> 4)); // data_count MSB Option[3] = Hex2Ascii(Convert.ToByte(Max_ByteUnit & 0x0F)); bit_sum += Convert.ToUInt32(TotalBit_add(ref Option, 4)); // Data Seq3 : Addr RegAddr[0] = Hex2Ascii(Convert.ToByte(addr & 0x000F)); RegAddr[1] = Hex2Ascii(Convert.ToByte((addr & 0x00F0) >> 4)); RegAddr[2] = Hex2Ascii(Convert.ToByte((addr & 0x0F00) >> 8)); RegAddr[3] = Hex2Ascii(Convert.ToByte((addr & 0xF000) >> 12)); bit_sum += Convert.ToUInt32(TotalBit_add(ref RegAddr, 4)); // Data Seq4 : DataSeq for (i = 0; i < data_num; i++) { Data[0] = Convert.ToByte(SendData[i] & 0x000000FF); Data[1] = Convert.ToByte((SendData[i] & 0x0000FF00) >> 8); Data[2] = Convert.ToByte((SendData[i] & 0x00FF0000) >> 16); Data[3] = Convert.ToByte((SendData[i] & 0xFF000000) >> 24); Data[4] = Convert.ToByte((SendData[i] & 0xFF00000000) >> 32); Data[5] = Convert.ToByte((SendData[i] & 0xFF0000000000) >> 40); Data[6] = Convert.ToByte((SendData[i] & 0xFF000000000000) >> 48); Data[7] = Convert.ToByte((SendData[i] & 0xFF00000000000000) >> 56); bit_sum += Convert.ToUInt32(TotalBit_add(ref Data, Max_ByteUnit)); } // Data Seq5 : EndSignal byte[] EndSignal = new byte[] { 0x59 }; // Y bit_sum += Convert.ToUInt32(TotalBit_add(ref EndSignal, 1)); // Data Seq5 : Checksum // just bit_sum raw data // CheckSum[0] = Hex2Ascii( (INT8U)(bit_sum & 0x0F) ); // CheckSum[1] = Hex2Ascii( (INT8U)(bit_sum & 0xF0) >> 4 ); // Data Integration byte[] packet = new byte[ByteLength]; packet[0] = StartSignal[0]; packet[1] = StartSignal[1]; packet[2] = Option[0]; packet[3] = Option[1]; packet[4] = Option[2]; packet[5] = Option[3]; packet[6] = RegAddr[0]; packet[7] = RegAddr[1]; packet[8] = RegAddr[2]; packet[9] = RegAddr[3]; for (i = 0; i < data_num; i++) { for (j = 0; j < Max_ByteUnit; j++) { switch (j) { case 0: packet[10 + i * Max_ByteUnit + j] = Convert.ToByte(SendData[i] & 0x000000FF); break; case 1: packet[10 + i * Max_ByteUnit + j] = Convert.ToByte((SendData[i] & 0x0000FF00) >> 8); break; case 2: packet[10 + i * Max_ByteUnit + j] = Convert.ToByte((SendData[i] & 0x00FF0000) >> 16); break; case 3: packet[10 + i * Max_ByteUnit + j] = Convert.ToByte((SendData[i] & 0xFF000000) >> 24); break; case 4: packet[10 + i * Max_ByteUnit + j] = Convert.ToByte((SendData[i] & 0xFF00000000) >> 32); break; case 5: packet[10 + i * Max_ByteUnit + j] = Convert.ToByte((SendData[i] & 0xFF0000000000) >> 40); break; case 6: packet[10 + i * Max_ByteUnit + j] = Convert.ToByte((SendData[i] & 0xFF000000000000) >> 48); break; case 7: packet[10 + i * Max_ByteUnit + j] = Convert.ToByte((SendData[i] & 0xFF00000000000000) >> 56); break; } } } packet[ByteLength - 2] = EndSignal[0]; packet[ByteLength - 1] = Convert.ToByte(bit_sum & 0xFF); uint RtnWait_Cnt; while (true) { Write(packet); RtnWait_Cnt = 0; Thread.Sleep(10); while (Read(recvPacket) <= 0) { Thread.Sleep(10); RtnWait_Cnt += 10; if (RtnWait_Cnt > m_iRtnWaitTime_us) { Log.D(String.Format("SJUartRawBurstSend Receive Fail {0:d} > {1:d}", RtnWait_Cnt, m_iRtnWaitTime_us)); return ERR_NORESPONSE; } }; if ((recvPacket[0] == StartSignal[1]) && (recvPacket[1] == 0x4F) && (recvPacket[2] == 0x4B)) // 'N OK' { // rtn = (recvPacket[2] | (recvPacket[1] << 8) | (recvPacket[0] << 16)); rtn = OK_RETURN; break; } else { Log.D(String.Format("SJUartRawBurstSend Send Fail {0:d} > {1:d} : {2:x}, {3:x}, {4:x}", err_retry_cnt, m_iSendReTry_Num, recvPacket[0], recvPacket[1], recvPacket[2])); if (err_retry_cnt >= m_iSendReTry_Num) { rtn = Convert.ToUInt16(ERR_RTN_NOT_OK | (Convert.ToInt32(recvPacket[2]) & 0xff)); break; } else { err_retry_cnt++; } } } return rtn; } //ushort SJUartAsBurstSend(int addr, ulong[] data, byte data_num, sbyte S_Ioption) ushort SJUartAsBurstSend(int addr, ref T[] data, byte data_num, sbyte S_Ioption = 0) { // by SJ 170213 byte[] StartSignal = new byte[2]; byte[] Option = new byte[4]; byte[] RegAddr = new byte[4]; byte[] Data = new byte[16]; byte Max_ByteUnit = 0, Cur_ByteUnit; //ulong[] SendData = data; //T[] SendData = (T[])(object)data.Clone(); ulong[] SendData = Array.ConvertAll(data, (obj) => Convert.ToUInt64(obj)); byte[] recvPacket = new byte[3]; byte err_retry_cnt = 0; uint ByteLength; ushort rtn; uint bit_sum = 0; int i = 0, j = 0; // m_comm.m_QueueRead.Clear(); if ((0 == data_num) || (255 < data_num)) return ERR_VAL_BURST_DATANUM; // Data Seq1 : StartSignal StartSignal[0] = 0x48; // H StartSignal[1] = 0x50; // P bit_sum += Convert.ToUInt32(TotalBit_add(ref StartSignal, 2)); // before option check for (i = 0; i < data_num; i++) { if (SendData[i] < 0x10) Cur_ByteUnit = 1; else if (SendData[i] < 0x100) Cur_ByteUnit = 2; else if (SendData[i] < 0x1000) Cur_ByteUnit = 3; else if (SendData[i] < 0x10000) Cur_ByteUnit = 4; else if (SendData[i] < 0x100000) Cur_ByteUnit = 5; else if (SendData[i] < 0x1000000) Cur_ByteUnit = 6; else if (SendData[i] < 0x10000000) Cur_ByteUnit = 7; else if (SendData[i] < 0x100000000) Cur_ByteUnit = 8; else if (SendData[i] < 0x1000000000) Cur_ByteUnit = 9; else if (SendData[i] < 0x10000000000) Cur_ByteUnit = 10; else if (SendData[i] < 0x100000000000) Cur_ByteUnit = 11; else if (SendData[i] < 0x1000000000000) Cur_ByteUnit = 12; else if (SendData[i] < 0x10000000000000) Cur_ByteUnit = 13; else if (SendData[i] < 0x100000000000000) Cur_ByteUnit = 14; else if (SendData[i] < 0x1000000000000000) Cur_ByteUnit = 16; //caused by HDL logic else Cur_ByteUnit = 16; if (Max_ByteUnit < Cur_ByteUnit) Max_ByteUnit = Cur_ByteUnit; } ByteLength = 2 + 4 + 4 + (Convert.ToUInt32(Max_ByteUnit) * Convert.ToUInt32(data_num)) + 1 + 1; // Data Seq2 : Option if (0 == S_Ioption) Option[0] = 0x49; //'I' else Option[0] = 0x53; //'S' Option[1] = Hex2Ascii(Convert.ToByte(data_num & 0x0F)); // data_count LSB Option[2] = Hex2Ascii(Convert.ToByte((data_num & 0xF0) >> 4)); // data_count MSB if (Max_ByteUnit == 16) Option[3] = Hex2Ascii(Convert.ToByte(0x0f & 0x0F)); else Option[3] = Hex2Ascii(Convert.ToByte(Max_ByteUnit & 0x0F)); bit_sum += Convert.ToUInt32(TotalBit_add(ref Option, 4)); // Data Seq3 : Addr RegAddr[0] = Hex2Ascii(Convert.ToByte(addr & 0x000F)); RegAddr[1] = Hex2Ascii(Convert.ToByte((addr & 0x00F0) >> 4)); RegAddr[2] = Hex2Ascii(Convert.ToByte((addr & 0x0F00) >> 8)); RegAddr[3] = Hex2Ascii(Convert.ToByte((addr & 0xF000) >> 12)); bit_sum += Convert.ToUInt32(TotalBit_add(ref RegAddr, 4)); // Data Seq4 : DataSeq for (i = 0; i < data_num; i++) { Data[0] = Hex2Ascii(Convert.ToByte(SendData[i] & 0x0000000F)); Data[1] = Hex2Ascii(Convert.ToByte((SendData[i] & 0x000000F0) >> 4)); Data[2] = Hex2Ascii(Convert.ToByte((SendData[i] & 0x00000F00) >> 8)); Data[3] = Hex2Ascii(Convert.ToByte((SendData[i] & 0x0000F000) >> 12)); Data[4] = Hex2Ascii(Convert.ToByte((SendData[i] & 0x000F0000) >> 16)); Data[5] = Hex2Ascii(Convert.ToByte((SendData[i] & 0x00F00000) >> 20)); Data[6] = Hex2Ascii(Convert.ToByte((SendData[i] & 0x0F000000) >> 24)); Data[7] = Hex2Ascii(Convert.ToByte((SendData[i] & 0xF0000000) >> 28)); Data[8] = Hex2Ascii(Convert.ToByte((SendData[i] & 0x0F00000000) >> 32)); Data[9] = Hex2Ascii(Convert.ToByte((SendData[i] & 0xF000000000) >> 36)); Data[10] = Hex2Ascii(Convert.ToByte((SendData[i] & 0x0F0000000000) >> 40)); Data[11] = Hex2Ascii(Convert.ToByte((SendData[i] & 0xF00000000000) >> 44)); Data[12] = Hex2Ascii(Convert.ToByte((SendData[i] & 0x0F000000000000) >> 48)); Data[13] = Hex2Ascii(Convert.ToByte((SendData[i] & 0xF0000000000000) >> 52)); Data[14] = Hex2Ascii(Convert.ToByte((SendData[i] & 0x0F00000000000000) >> 56)); Data[15] = Hex2Ascii(Convert.ToByte((SendData[i] & 0xF000000000000000) >> 60)); bit_sum += Convert.ToUInt32(TotalBit_add(ref Data, Max_ByteUnit)); } // Data Seq5 : EndSignal byte[] EndSignal = new byte[] { 0x59 }; // Y bit_sum += Convert.ToUInt32(TotalBit_add(ref EndSignal, 1)); // Data Seq5 : Checksum // just bit_sum raw data // CheckSum[0] = Hex2Ascii( (INT8U)(bit_sum & 0x0F) ); // CheckSum[1] = Hex2Ascii( (INT8U)(bit_sum & 0xF0) >> 4 ); // Data Integration byte[] packet = new byte[ByteLength]; packet[0] = StartSignal[0]; packet[1] = StartSignal[1]; packet[2] = Option[0]; packet[3] = Option[1]; packet[4] = Option[2]; packet[5] = Option[3]; packet[6] = RegAddr[0]; packet[7] = RegAddr[1]; packet[8] = RegAddr[2]; packet[9] = RegAddr[3]; for (i = 0; i < data_num; i++) { for (j = 0; j < Max_ByteUnit; j++) { switch (j) { case 0: packet[10 + i * Max_ByteUnit + j] = Hex2Ascii(Convert.ToByte(SendData[i] & 0x0000000F)); break; case 1: packet[10 + i * Max_ByteUnit + j] = Hex2Ascii(Convert.ToByte((SendData[i] & 0x000000F0) >> 4)); break; case 2: packet[10 + i * Max_ByteUnit + j] = Hex2Ascii(Convert.ToByte((SendData[i] & 0x00000F00) >> 8)); break; case 3: packet[10 + i * Max_ByteUnit + j] = Hex2Ascii(Convert.ToByte((SendData[i] & 0x0000F000) >> 12)); break; case 4: packet[10 + i * Max_ByteUnit + j] = Hex2Ascii(Convert.ToByte((SendData[i] & 0x000F0000) >> 16)); break; case 5: packet[10 + i * Max_ByteUnit + j] = Hex2Ascii(Convert.ToByte((SendData[i] & 0x00F00000) >> 20)); break; case 6: packet[10 + i * Max_ByteUnit + j] = Hex2Ascii(Convert.ToByte((SendData[i] & 0x0F000000) >> 24)); break; case 7: packet[10 + i * Max_ByteUnit + j] = Hex2Ascii(Convert.ToByte((SendData[i] & 0xF0000000) >> 28)); break; case 8: packet[10 + i * Max_ByteUnit + j] = Hex2Ascii(Convert.ToByte((SendData[i] & 0xF00000000) >> 32)); break; case 9: packet[10 + i * Max_ByteUnit + j] = Hex2Ascii(Convert.ToByte((SendData[i] & 0xF000000000) >> 36)); break; case 10: packet[10 + i * Max_ByteUnit + j] = Hex2Ascii(Convert.ToByte((SendData[i] & 0xF0000000000) >> 40)); break; case 11: packet[10 + i * Max_ByteUnit + j] = Hex2Ascii(Convert.ToByte((SendData[i] & 0xF00000000000) >> 44)); break; case 12: packet[10 + i * Max_ByteUnit + j] = Hex2Ascii(Convert.ToByte((SendData[i] & 0xF000000000000) >> 48)); break; case 13: packet[10 + i * Max_ByteUnit + j] = Hex2Ascii(Convert.ToByte((SendData[i] & 0xF0000000000000) >> 52)); break; case 14: packet[10 + i * Max_ByteUnit + j] = Hex2Ascii(Convert.ToByte((SendData[i] & 0xF00000000000000) >> 56)); break; case 15: packet[10 + i * Max_ByteUnit + j] = Hex2Ascii(Convert.ToByte((SendData[i] & 0xF000000000000000) >> 60)); break; } } } packet[ByteLength - 2] = EndSignal[0]; packet[ByteLength - 1] = Convert.ToByte(bit_sum & 0xFF); uint RtnWait_Cnt; while (true) { Write(packet); RtnWait_Cnt = 0; Thread.Sleep(10); while (Read(recvPacket) <= 0) { Thread.Sleep(10); RtnWait_Cnt += 10; if (RtnWait_Cnt > m_iRtnWaitTime_us) { Log.D(String.Format("SJUartAsBurstSend Receive Fail {0:d} > {1:d}", RtnWait_Cnt, m_iRtnWaitTime_us)); return ERR_NORESPONSE; } }; if ((recvPacket[0] == StartSignal[1]) && (recvPacket[1] == 0x4F) && (recvPacket[2] == 0x4B)) // 'N OK' { // rtn = (recvPacket[2] | (recvPacket[1] << 8) | (recvPacket[0] << 16)); rtn = OK_RETURN; break; } else { Log.D(String.Format("SJUartAsBurstSend Send Fail {0:d} > {1:d} : {2:x}, {3:x}, {4:x}", err_retry_cnt, m_iSendReTry_Num, recvPacket[0], recvPacket[1], recvPacket[2])); if (err_retry_cnt >= m_iSendReTry_Num) { rtn = Convert.ToUInt16(ERR_RTN_NOT_OK | (Convert.ToInt32(recvPacket[2]) & 0xff)); break; } else { err_retry_cnt++; } } } return rtn; } //ushort SJUartBurstSend(int addr, ulong[] data, byte data_num, sbyte mode, sbyte S_Ioption) ushort SJUartBurstSend(int addr, ref T[] data, byte data_num, sbyte mode, sbyte S_Ioption = 0) { // by SJ 170213 ushort rtn = 0; if (0 == mode) rtn = SJUartAsBurstSend(addr, ref data, data_num, S_Ioption); else if (1 == mode) rtn = SJUartRawBurstSend(addr, ref data, data_num, S_Ioption); // if ((DebugMode >= 2) && (NULL != Connected_COM)) // { // // CStringA Tmp; // // Tmp.Format("Burst Send 64Bit : Addr 0x%x ~ %x / DataNum %d / RAW mode %d / SI_option %d : rtn %x", addr, addr+data_num, data_num, mode, S_Ioption, rtn); // // Put_DataLog(Tmp, (__int64*)data, data_num, DATA_WR_TYPE_HEX_WRITE, *Connected_COM); // string temp; // temp = formatA("Burst Send 64Bit : Addr 0x%x ~%x / DataNum %d / RAW mode %d / SI_option %d : rtn %x", addr, addr + data_num, data_num, mode, S_Ioption, rtn); // Put_DataLog(temp, (__int64*)data, data_num, DATA_WR_TYPE_HEX_WRITE, *Connected_COM); // } return rtn; } //ushort SJUartRawSingleRecv(int addr, out ulong data) ushort SJUartRawSingleRecv(int addr, ref T data) { // by SJ 170906 byte[] StartSignal = new byte[2]; byte[] RegAddr = new byte[4]; byte[] EndSignal = new byte[1]; byte[] recvPacket = new byte[20]; byte err_retry_cnt = 0; ushort rtn; uint Rbit_sum = 0; ushort Rtn_ByteLength; ushort Rtn_UnitByte; ulong Rtn_Data = 0; Rtn_UnitByte = 8; Rtn_ByteLength = Convert.ToUInt16(Rtn_UnitByte * 1 + 1 + 3); // data + checksum + 3 rtn byte; uint bit_sum = 0; int i = 0; // Data Seq1 : StartSignal StartSignal[0] = 0x48; // H StartSignal[1] = 0x53; // S bit_sum += Convert.ToUInt32(TotalBit_add(ref StartSignal, 2)); // Data Seq2 : Option (skip) // Data Seq3 : Addr RegAddr[0] = Hex2Ascii(Convert.ToByte(addr & 0x000F)); RegAddr[1] = Hex2Ascii(Convert.ToByte((addr & 0x00F0) >> 4)); RegAddr[2] = Hex2Ascii(Convert.ToByte((addr & 0x0F00) >> 8)); RegAddr[3] = Hex2Ascii(Convert.ToByte((addr & 0xF000) >> 12)); bit_sum += Convert.ToUInt32(TotalBit_add(ref RegAddr, 4)); // Data Seq4 : DataSeq // Data Seq5 : EndSignal EndSignal[0] = 0x59; // Y bit_sum += Convert.ToUInt32(TotalBit_add(ref EndSignal, 1)); // Data Seq5 : Checksum // just 'bit_sum' raw data // Data Integration byte[] packet = new byte[2 + 4 + 1 + 1]; packet[0] = StartSignal[0]; packet[1] = StartSignal[1]; packet[2] = RegAddr[0]; packet[3] = RegAddr[1]; packet[4] = RegAddr[2]; packet[5] = RegAddr[3]; packet[6] = EndSignal[0]; packet[7] = Convert.ToByte(bit_sum); // m_comm.WriteComm(&packet[0], 8); // temporal uint RtnWait_Cnt; while (true) { Write(packet); Rbit_sum = 0; // recv checksum initial RtnWait_Cnt = 0; Thread.Sleep(10); while (Read(recvPacket) <= 0) // while (ReadMessage(recvPacket, Rtn_ByteLength, 200)< Rtn_ByteLength) { { Thread.Sleep(10); RtnWait_Cnt += 10; if (RtnWait_Cnt > m_iRtnWaitTime_us) { Log.D(String.Format("SJUartRawSingleRecv Receive Fail {0:d} > {1:d}", RtnWait_Cnt, m_iRtnWaitTime_us)); return ERR_NORESPONSE; } }; if ((recvPacket[3] == StartSignal[1]) && ((recvPacket[4] == 0x54) | (recvPacket[5] == 0x58) | (recvPacket[2] == 0x53) | (recvPacket[2] == 0x57))) { Log.D(String.Format("SJUartRawSingleRecv Receive Fail {0:x}, {1:x}, {2:x}, {3:x}", recvPacket[3], recvPacket[4], recvPacket[5], recvPacket[2])); return Convert.ToUInt16((ERR_RTN_NOT_OK | (recvPacket[2] & 0xff))); } for (i = 0; i < Rtn_ByteLength - 4; i++) { byte[] temppacket = { recvPacket[i] }; Rbit_sum += Convert.ToUInt16(TotalBit_add(ref temppacket, 1)); } if ((recvPacket[Rtn_ByteLength - 3] == StartSignal[1]) && (recvPacket[Rtn_ByteLength - 2] == 0x4F) && (recvPacket[Rtn_ByteLength - 1] == 0x4B) && ((Rbit_sum & 0xff) == recvPacket[Rtn_ByteLength - 4])) // 'T OK' { // rtn = (recvPacket[2] | (recvPacket[1] << 8) | (recvPacket[0] << 16)); for (i = 0; i < Rtn_UnitByte; i++) Rtn_Data |= (Convert.ToUInt64(recvPacket[i]) << (i * 8)); //data = Rtn_Data; data = (T)Convert.ChangeType(Rtn_Data, typeof(T)); rtn = OK_RETURN; break; } else { Log.D(String.Format("SJUartRawSingleRecv Receive Fail {0:d} > {1:d} : {2:x}, {3:x}, {4:x}, {5:x}", err_retry_cnt, m_iSendReTry_Num, recvPacket[Rtn_ByteLength - 3], recvPacket[Rtn_ByteLength - 2], recvPacket[Rtn_ByteLength - 1], recvPacket[Rtn_ByteLength - 4])); if (err_retry_cnt == m_iSendReTry_Num) { if ((Rbit_sum & 0xff) != recvPacket[Rtn_ByteLength - 4]) { rtn = Convert.ToUInt16(ERR_RTN_CHECKSUM | (recvPacket[Rtn_ByteLength - 4] & 0xff)); } else { rtn = Convert.ToUInt16(ERR_RTN_NOT_OK | (recvPacket[Rtn_ByteLength - 1] & 0xff)); } break; } else { err_retry_cnt++; } } } return rtn; } //ushort SJUartAsSingleRecv(int addr, ref ulong data) ushort SJUartAsSingleRecv(int addr, ref T data) { // by SJ 170210 // Recv only raw mode 170905 return ERR_NOT_DEVELOPED_YET; } //ushort SJUartSingleRecv(int addr, out ulong data, sbyte mode = 1) ushort SJUartSingleRecv(int addr, ref T data, sbyte mode = 1) { // by SJ 170906 ushort rtn = 0; if (mode == 0) rtn = SJUartAsSingleRecv(addr, ref data); else rtn = SJUartRawSingleRecv(addr, ref data); //if ((DebugMode >= 2) && (NULL != Connected_COM)) //{ // // CStringA Tmp; // // Tmp.Format("Single Recv 64Bit : Addr 0x%x / RAW mode %d / Data 0x%I64x: rtn %x\r\n ", addr, mode, *data, rtn); Put_Log(Tmp, *Connected_COM); // string temp; // temp = formatA("Single Recv 64Bit : Addr 0x%x / RAW mode %d / Data 0x%I64x: rtn %x\r\n ", addr, mode, *data, rtn); Put_Log(temp, *Connected_COM); //} if ((DebugMode >= 2) && (IsConnected() == true)) Log.D(String.Format("Single Recv 64Bit : Addr 0x{0:x} / RAW mode {1:d} / Data 0x{2:x}: rtn {3:x} ", addr, mode, data, rtn)); return rtn; } //ushort SJUartRawBurstRecv(int addr, ulong[] data, byte data_num, sbyte S_Ioption = 0) ushort SJUartRawBurstRecv(int addr, ref T[] data, byte data_num, sbyte S_Ioption = 0) { // by SJ 170907 byte[] StartSignal = new byte[2]; byte[] Option = new byte[4]; byte[] RegAddr = new byte[4]; byte[] Data = new byte[8]; // 4 * data length byte Max_ByteUnit = 0; byte[] recvPacket = new byte[2050]; byte err_retry_cnt = 0; uint ByteLength; ushort rtn; uint Rbit_sum = 0; ushort Rtn_ByteLength; ushort Rtn_UnitByte; // INT32U Rtn_Data = 0; ulong Rtn_Data = 0; Rtn_UnitByte = 8; Rtn_ByteLength = Convert.ToUInt16(Rtn_UnitByte * data_num + 1 + 3); // data*read_cnt + checksum + 3 rtn byte; uint bit_sum = 0; int i = 0, j = 0; if ((0 == data_num) || (255 < data_num)) return ERR_VAL_BURST_DATANUM; // m_comm.m_QueueRead.Clear(); // Data Seq1 : StartSignal StartSignal[0] = 0x48; // H StartSignal[1] = 0x52; // N bit_sum += Convert.ToUInt32(TotalBit_add(ref StartSignal, 2)); ByteLength = 2 + 4 + 4 + 1 + 1; // Data Seq2 : Option if (0 == S_Ioption) Option[0] = 0x49; //'I' else Option[0] = 0x53; //'S' Option[1] = Hex2Ascii(Convert.ToByte(data_num & 0x0F)); Option[2] = Hex2Ascii(Convert.ToByte((data_num & 0xF0) >> 4)); Option[3] = Hex2Ascii(Convert.ToByte(8 & 0x0F)); // Raw type 32bit bit_sum += Convert.ToUInt32(TotalBit_add(ref Option, 4)); // Data Seq3 : Addr RegAddr[0] = Hex2Ascii(Convert.ToByte(addr & 0x000F)); RegAddr[1] = Hex2Ascii(Convert.ToByte((addr & 0x00F0) >> 4)); RegAddr[2] = Hex2Ascii(Convert.ToByte((addr & 0x0F00) >> 8)); RegAddr[3] = Hex2Ascii(Convert.ToByte((addr & 0xF000) >> 12)); bit_sum += Convert.ToUInt32(TotalBit_add(ref RegAddr, 4)); // Data Seq4 : DataSeq // Data Seq5 : EndSignal byte[] EndSignal = new byte[] { 0x59 }; // Y bit_sum += Convert.ToUInt32(TotalBit_add(ref EndSignal, 1)); // Data Seq5 : Checksum // just bit_sum raw data // CheckSum[0] = Hex2Ascii( (INT8U)(bit_sum & 0x0F) ); // CheckSum[1] = Hex2Ascii( (INT8U)(bit_sum & 0xF0) >> 4 ); // Data Integration byte[] packet = new byte[ByteLength]; packet[0] = StartSignal[0]; packet[1] = StartSignal[1]; packet[2] = Option[0]; packet[3] = Option[1]; packet[4] = Option[2]; packet[5] = Option[3]; packet[6] = RegAddr[0]; packet[7] = RegAddr[1]; packet[8] = RegAddr[2]; packet[9] = RegAddr[3]; packet[ByteLength - 2] = EndSignal[0]; packet[ByteLength - 1] = Convert.ToByte(bit_sum & 0xFF); uint RtnWait_Cnt; while (true) { Write(packet, Convert.ToInt32(ByteLength)); Rbit_sum = 0; // recv checksum initial RtnWait_Cnt = 0; Thread.Sleep(10); while (Read(recvPacket) <= 0) // while (ReadMessage(recvPacket, Rtn_ByteLength, 200)< Rtn_ByteLength) { { Thread.Sleep(10); RtnWait_Cnt += 10; if (RtnWait_Cnt > m_iRtnWaitTime_us) { Log.D(String.Format("SJUartRawSingleRecv Receive Fail {0:d} > {1:d}", RtnWait_Cnt, m_iRtnWaitTime_us)); return ERR_NORESPONSE; } }; if ((recvPacket[3] == StartSignal[1]) && ((recvPacket[4] == 0x54) | (recvPacket[5] == 0x58) | (recvPacket[2] == 0x53) | (recvPacket[2] == 0x57))) { Log.D(String.Format("SJUartRawBurstRecv Receive Fail {0:x}, {1:x}, {2:x}, {3:x}", recvPacket[3], recvPacket[4], recvPacket[5], recvPacket[2])); return Convert.ToUInt16((ERR_RTN_NOT_OK | (recvPacket[2] & 0xff))); } for (i = 0; i < Rtn_ByteLength - 4; i++) { byte[] temppacket = { recvPacket[i] }; Rbit_sum += Convert.ToUInt16(TotalBit_add(ref temppacket, 1)); } if ((recvPacket[Rtn_ByteLength - 3] == StartSignal[1]) && (recvPacket[Rtn_ByteLength - 2] == 0x4F) && (recvPacket[Rtn_ByteLength - 1] == 0x4B) && ((Rbit_sum & 0xff) == recvPacket[Rtn_ByteLength - 4])) // 'T OK' { for (j = 0; j < data_num; j++) { for (i = 0; i < Rtn_UnitByte; i++) { // Rtn_Data |= (recvPacket[(j * 4) + i] << (i * 8)); Rtn_Data |= (Convert.ToUInt64(recvPacket[(j * 8) + i]) << (i * 8)); } //data[j] = Rtn_Data; data[j] = (T)Convert.ChangeType(Rtn_Data, typeof(T)); Rtn_Data = 0; } rtn = OK_RETURN; break; } else { Log.D(String.Format("SJUartRawBurstRecv Receive Fail {0:d} > {1:d} : {2:x}, {3:x}, {4:x}, {5:x}", err_retry_cnt, m_iSendReTry_Num, recvPacket[Rtn_ByteLength - 3], recvPacket[Rtn_ByteLength - 2], recvPacket[Rtn_ByteLength - 1], recvPacket[Rtn_ByteLength - 4])); if (err_retry_cnt == m_iSendReTry_Num) { if ((Rbit_sum & 0xff) != recvPacket[Rtn_ByteLength - 4]) rtn = Convert.ToUInt16((ERR_RTN_CHECKSUM | (recvPacket[Rtn_ByteLength - 4] & 0xff))); else rtn = Convert.ToUInt16((ERR_RTN_NOT_OK | (recvPacket[Rtn_ByteLength - 1] & 0xff))); break; } else { err_retry_cnt++; } } } return rtn; } //ushort SJUartAsBurstRecv(int addr, ulong[] data, byte data_num, sbyte S_Ioption) ushort SJUartAsBurstRecv(int addr, ref T[] data, byte data_num, sbyte S_Ioption = 0) { // by SJ 170307 return ERR_NOT_DEVELOPED_YET; } //ushort SJUartBurstRecv(int addr, ulong[] data, byte data_num, sbyte mode = 1, sbyte S_Ioption = 0) ushort SJUartBurstRecv(int addr, ref T[] data, byte data_num, sbyte mode = 1, sbyte S_Ioption = 0) { // by SJ 170906 ushort rtn = 0; if (mode == 0) rtn = SJUartAsBurstRecv(addr, ref data, data_num, S_Ioption); else rtn = SJUartRawBurstRecv(addr, ref data, data_num, S_Ioption); // if ((DebugMode >= 2) && (null != Connected_COM)) // { // CStringA Tmp; // Tmp.Format("Burst Recv 64Bit : Addr 0x%x ~ %x / DataNum %d / RAW mode %d / SI_option %d : rtn %x", addr, addr + data_num, data_num, mode, S_Ioption, rtn); // Put_DataLog(Tmp, (__int64*)data, data_num, DATA_WR_TYPE_HEX_WRITE, *Connected_COM); // string temp; // temp = formatA("Burst Recv 64Bit : Addr 0x%x ~ %x / DataNum %d / RAW mode %d / SI_option %d : rtn %x", addr, addr + data_num, data_num, mode, S_Ioption, rtn); // Put_DataLog(temp, (__int64*)data, data_num, DATA_WR_TYPE_HEX_WRITE, *Connected_COM); // } return rtn; } public short GetSJTVersion(out string HwVer, out string tcstr) { ushort rtn = 0; ulong[] data = new ulong[2]; char[] tmp_hwver = new char[16]; //rtn = SJUartBurstRecv(SJT_HW_FW_VER, data, 2); rtn = SJUartBurstRecv(SJT_HW_FW_VER, ref data, 2); if (0 == rtn) { // HW_Ver = data[0]; // BUILDSTAMP = data[1] & 0xffffffff; string str = ""; str += (char)((data[0] >> 0) & 0x0ff); str += (char)((data[0] >> 8) & 0x0ff); str += (char)((data[0] >> 16) & 0x0ff); str += (char)((data[0] >> 24) & 0x0ff); str += (char)((data[0] >> 32) & 0x0ff); str += (char)((data[0] >> 40) & 0x0ff); str += (char)((data[0] >> 48) & 0x0ff); str += (char)((data[0] >> 56) & 0x0ff); //str = string.Join(str, (char)((data[0] >> 0) & 0x0ff)); //str = string.Join(str, (char)((data[0] >> 8) & 0x0ff)); //str = string.Join(str, (char)((data[0] >> 16) & 0x0ff)); //str = string.Join(str, (char)((data[0] >> 24) & 0x0ff)); //str = string.Join(str, (char)((data[0] >> 32) & 0x0ff)); //str = string.Join(str, (char)((data[0] >> 40) & 0x0ff)); //str = string.Join(str, (char)((data[0] >> 48) & 0x0ff)); //str = string.Join(str, (char)((data[0] >> 56) & 0x0ff)); HwVer = str; /* *HwVer = (char)((data[0] >> 0) & 0x0ff); tmp_hwver[0] = *HwVer++; *HwVer = (char)((data[0] >> 8) & 0x0ff); tmp_hwver[1] = *HwVer++; *HwVer = (char)((data[0] >> 16) & 0x0ff); tmp_hwver[2] = *HwVer++; *HwVer = (char)((data[0] >> 24) & 0x0ff); tmp_hwver[3] = *HwVer++; *HwVer = (char)((data[0] >> 32) & 0x0ff); tmp_hwver[4] = *HwVer++; *HwVer = (char)((data[0] >> 40) & 0x0ff); tmp_hwver[5] = *HwVer++; *HwVer = (char)((data[0] >> 48) & 0x0ff); tmp_hwver[6] = *HwVer++; *HwVer = (char)((data[0] >> 56) & 0x0ff); tmp_hwver[7] = *HwVer++; *HwVer = 0; tmp_hwver[8] = *HwVer;*/ TIMECNT tc; IDENTIFY_FLAG = Convert.ToUInt32(((data[1] & 0xffffffff00000000) >> 32)); tc.day = Convert.ToSByte(((data[1] & 0xf8000000) >> 27) & 0xff); tc.month = Convert.ToSByte(((data[1] & 0x07800000) >> 23) & 0xff); tc.year = Convert.ToSByte(((data[1] & 0x007e0000) >> 17) & 0xff); tc.hour = Convert.ToSByte(((data[1] & 0x0001f000) >> 12) & 0xff); tc.minute = Convert.ToSByte(((data[1] & 0x00000fc0) >> 6) & 0xff); tc.seconds = Convert.ToSByte((data[1] & 0x0000003f) & 0xff); tcstr = string.Format("{0:d2}{1:d2}{2:d2}_{3:d2}{4:d2}", tc.year, tc.month, tc.day, tc.hour, tc.minute); if (IDENTIFY_FLAG == 0x1a3c5e7f) { if ((DebugMode != 0) && (IsConnected() == true)) Log.D("HW_Ver : " + str + "BUILDSTAMP : " + tcstr); return Convert.ToInt16(rtn); } else { return 1; } } else { HwVer = ""; tcstr = ""; return -1; } } public ushort GetSJT_DLL_Ver(ref char[] DllVer) { string str; #if DEBUG #if WIN64 str = "_64D"; #else str = "_86D"; #endif #else //#ifdef _DEBUG --> Release #if WIN64 str = "_64R"; #else str = "_86R"; #endif #endif str = DLL_TIME + str; DllVer = str.ToCharArray(); if ((DebugMode != 0) && (IsConnected() == true)) Log.D("SJT_SDK Get Dll Version : " + str); return 1; } public ushort SetTrigTimerSeq(uint timerfreq_100ns, sbyte mode = 0) { ushort rtn = 0; uint[] RcvTmpt = new uint[3]; uint GenMode, OutMode, data_num; ulong[] SendData = new ulong[5] { 0, 0, 0, 0, 0 }; // FPGA Calc condition check Start// //genmode outmode check //support check // rtn = SJUartRawSingleRecv(SJT_TRIG_GEN_OUT_MODE, &Check_Cur_Mode); rtn = SJUartRawBurstRecv(SJT_TRIG_GEN_OUT_MODE, ref RcvTmpt, 2); if (rtn != OK_RETURN) return ERR_NOT_DEVELOPED_YET; GenMode = RcvTmpt[0] & 0xf; OutMode = (RcvTmpt[0] >> 16) & 0x7f; RcvTmpt[1] = RcvTmpt[1] & 0xffff; if (((0 == GenMode) || (3 == GenMode)) && ((2 == OutMode) || (3 == OutMode)) && (1912 == RcvTmpt[1])) { // FPGA CALC Code SendData[0] = 1; //FCalc_Mode_Set SendData[1] = 1; // FCalc_Enc_Start SendData[2] = 1; // FCalc_Enc_Interval SendData[3] = 0; // FCalc_Enc_Iteration 0 : Infinite SendData[4] = 0; // FCalc_WD_Sel data_num = 5; rtn = SJUartRawBurstSend(SJT_FPGA_CALC_MODE_SET, ref SendData, (byte)data_num); if ((DebugMode == 1) && (true == IsConnected())) { // CStringA Tmp; // for (i = 0; i < data_num; i++) Tmp_TrigSet[i] = (__int64)SendData[i]; // for debug; // Tmp.Format("Trigger GenMode 0 Trigger Set Setting : Set Num %d : rtn %x / rtn1 %x", NumberOfTrigSet, rtn, rtn1); // Put_DataLog(Tmp, (__int64*)Tmp_TrigSet, data_num, DATA_WR_TYPE_HEX_WRITE, *Connected_COM); Log.D(String.Format("Trigger GenMode 3 (FPGA Calc Ver) running : rtn {0:x}", rtn)); } } // FPGA Calc condition check End// else if (timerfreq_100ns < TRIG_FREQ_MIN) return ERR_VAL_TRIG_FREQ; if (0 == mode) rtn = SJUartAsSingleSend(SJT_TRIG_TIMER_FREQ, timerfreq_100ns); else if (1 == mode) rtn = SJUartRawSingleSend(SJT_TRIG_TIMER_FREQ, timerfreq_100ns); if ((DebugMode == 1) && (true != IsConnected())) { // CStringA Tmp; // Tmp.Format("Trigger GenMode 3 Timer Setting %d00ns : rtn %x \r\n", timerfreq_100ns, rtn); Put_Log(Tmp, *Connected_COM); string temp; Log.D(String.Format("Trigger GenMode 3 Timer Setting {0:d}00ns : rtn {1:x}", timerfreq_100ns, rtn)); } return rtn; //Timer reference count frequency = (1sec / (1us*timerfreq)) } public ushort SetTrigTimerSeq(double timerfreq_us, sbyte mode = 0) { ushort rtn = 0; uint timerfreq_10ns; timerfreq_10ns = (uint)(timerfreq_us * 100); rtn = SetTrigTimerSeq(timerfreq_10ns, mode); return rtn; //Timer reference count frequency = (1sec / (1us*timerfreq)) } public ushort RunTrigTimerMode(sbyte mode = 0) { // unsigned short data=0; uint data = 0; byte TrigMode; // 0 bit : Enc Mode(1) / Timer (0) // unsigned char DisplayMode; // 1 bit : Trigger Count Display (1) / Enc count Display(0) // unsigned char Reset; // 2 bit byte CntClear; // 3 bit : Counter Clear(1) // unsigned char TrigEncModOut_Enable; // 4 bit : Trig out Enable(1) / Disable(0) byte TrigTimerModOut_Enable; // 5bit : Trig out Timer Enable(1) / Disable(0) byte VitualEnc_Enable; // 6 bit : VitualEnc input enable(1) / TrigMode must be Enc mode(1) byte VitualEncinput; // 7 bit : (1)가상 Enc Input A,B상 교차입력(역방향) / (0)가상 Enc Input A,B상 정상입력(정방향) // unsigned char Encoder_start; // 15 bit : 1 ? Encoder Start ushort rtn = 0; TrigMode = 0; CntClear = 0; TrigTimerModOut_Enable = 1; VitualEnc_Enable = 0; VitualEncinput = 0; data = Convert.ToUInt32((TrigMode & 0x1) | // ((DisplayMode & 0x1 ) << 1 ) | // ((Reset & 0x1) << 2 ) | ((CntClear & 0x1) << 3) | // ((TrigEncModOut_Enable & 0x1) << 4 ) | ((TrigTimerModOut_Enable & 0x1) << 5) | ((VitualEnc_Enable & 0x1) << 6) | ((VitualEncinput & 0x1) << 7)); // ((Encoder_start & 0x1) << 15); rtn = SetTrigOutEnable(false); rtn = SetFNDMode(1); rtn = SJUartAsSingleSend(SJT_TRIGSTATUS, data); if ((DebugMode == 1) && (true == IsConnected())) { // CStringA Tmp; // Tmp.Format("Run Trigger Timer Mode / TrigMode %d / CntClear %d / TrigTimerModOut_Enable %d / VitualEnc_Enable %d / VitualEncinput %d : rtn %x \r\n", TrigMode, CntClear, TrigTimerModOut_Enable, VitualEnc_Enable, VitualEncinput, rtn); // Put_Log(Tmp, *Connected_COM); // Log.D(String.Format("Run Trigger Timer Mode / TrigMode {0:d} / CntClear {1:d} / TrigTimerModOut_Enable {2:d} / VitualEnc_Enable {3:d} / VitualEncinput {5:d} : rtn {6:x}", TrigMode, CntClear, TrigTimerModOut_Enable, VitualEnc_Enable, VitualEncinput, rtn)); Log.D(String.Format("Run Trigger Timer Mode / TrigMode {0:d} / CntClear {1:d} / TrigTimerModOut_Enable {2:d} / VitualEnc_Enable {3:d} / VitualEncinput {4:d} : rtn {5:x}", TrigMode, CntClear, TrigTimerModOut_Enable, VitualEnc_Enable, VitualEncinput, rtn)); } return rtn; } ushort SetTrigPulse_(uint trigpulse, sbyte mode = 0) { ushort rtn = 0; if (0 == mode) rtn = SJUartAsSingleSend(SJT_TRIGPULSEWIDTH, trigpulse); else if (1 == mode) rtn = SJUartRawSingleSend(SJT_TRIGPULSEWIDTH, trigpulse); if ((DebugMode >= 2) && (true == IsConnected())) { //CStringA Tmp; //Tmp.Format("Single Send 32Bit : Addr 0x%x / RAW mode %d / Data 0x%x: rtn %x \r\n", SJT_TRIGPULSEWIDTH, mode, trigpulse, rtn); Put_Log(Tmp, *Connected_COM); Log.D(String.Format("Single Send 32Bit : Addr 0x{0:x} / RAW mode {1:d} / Data 0x{2:x}: rtn {3:x}", SJT_TRIGPULSEWIDTH, mode, trigpulse, rtn)); } return rtn; } public ushort SetTrigPulse(uint trigpulse_us, sbyte mode = 0) { ushort rtn = 0; if ((trigpulse_us < TRIG_PULSEWIDTH_MIN) || (trigpulse_us > TRIG_PULSEWIDTH_MAX)) return ERR_VAL_TRIG_PULSEWIDTH; else { m_iTrigPulseWidth_us = trigpulse_us; rtn = SetTrigPulse_(m_iTrigPulseWidth_us, mode); if ((DebugMode == 1) && (true == IsConnected())) { // CStringA Tmp; // Tmp.Format("Set Trigger pulse (Generation signal) %d us / RAW mode %d : rtn %x \r\n", trigpulse_us, mode, rtn); Put_Log(Tmp, *Connected_COM); Log.D(String.Format("Set Trigger pulse (Generation signal) {0:d} us / RAW mode {1:d} : rtn {2:x}", trigpulse_us, mode, rtn)); } return rtn; } } public ushort GetTrigPulse(ref uint trigpulse_us) { return ERR_NOT_DEVELOPED_YET; } public ushort SetEncDirection(uint EncDirection) { ushort rtn = 0; if (EncDirection > 1) return ERR_VAL_ENC_DIRECTION; rtn = SJUartRawSingleSend(SJT_ENC_DIRECTION, EncDirection); if ((DebugMode == 1) && (true == IsConnected())) { // CStringA Tmp; // Tmp.Format("Enc Direction Set %d : rtn %x \r\n", EncDirection, rtn); Put_Log(Tmp, *Connected_COM); Log.D(String.Format("Enc Direction Set {0:d} : rtn {1:x}", EncDirection, rtn)); } return rtn; } public ushort GetEncDirection(ref uint EncDirection) { ushort rtn = 0; rtn = SJUartSingleRecv(SJT_TRIG_CNT, ref EncDirection); return rtn; } public ushort SetFNDMode(byte FND_Mode, sbyte mode = 0) { uint data = 0; ushort rtn = 0; data = Convert.ToUInt32(0xff & FND_Mode); rtn = SJUartAsSingleSend(SJT_FND_CHANGE, data); if ((DebugMode == 1) && (true == IsConnected())) { // CStringA Tmp; // Tmp.Format("FNDMode Change: rtn %x \r\n", FND_Mode, rtn); Put_Log(Tmp, *Connected_COM); Log.D(String.Format("FNDMode Change: rtn {0:x}", FND_Mode, rtn)); } return rtn; } // INT16U EncoderWrapper::GetTrigNErrCnt(unsigned int* TrigCount, unsigned int* ErrCount) // { // INT16U rtn = 0; // unsigned __int64 Tmp_Cur_EncCnt[17]; // rtn = SJUartRawBurstRecv(SJT_TRIG_CNT, &Tmp_Cur_EncCnt[0], 17); // if (0 == rtn) // { // TrigCount[0] = (unsigned int)Tmp_Cur_EncCnt[0]; // for (int i = 1; i < 17; i++) // { // TrigCount[i] = (unsigned int)(Tmp_Cur_EncCnt[i] >> 32); // ErrCount[i - 1] = (unsigned int)(Tmp_Cur_EncCnt[i] & 0xffffffff); // } // } // else return rtn; // if ((DebugMode == 1) && (NULL != Connected_COM)) { //// CStringA Tmp; //// Tmp.Format("Get Trigger Count : Total : %d : rtn %x", TrigCount[0], rtn); //// Put_DataLog(Tmp, (int*)&TrigCount[1], 16, DATA_WR_TYPE_DEC_WRITE, *Connected_COM); //// Tmp.Format("Get Each Channel Error Count : rtn %x", rtn); //// Put_DataLog(Tmp, (int*)&ErrCount[0], 16, DATA_WR_TYPE_DEC_WRITE, *Connected_COM); // string temp; // temp = formatA("Get Trigger Count : Total : %d : rtn %x", TrigCount[0], rtn); // Put_DataLog(temp, (int*)&TrigCount[1], 16, DATA_WR_TYPE_DEC_WRITE, * Connected_COM); // temp = formatA("Get Each Channel Error Count : rtn %x", rtn); // Put_DataLog(temp, (int*)&ErrCount[0], 16, DATA_WR_TYPE_DEC_WRITE, * Connected_COM); // } // return rtn; //} public ushort GetTrigNErrCnt(uint[] TrigCount, uint[] ErrCount, float[] MaxFreq) { ushort rtn = 0; ulong[] Tmp_Cur_EncCnt = new ulong[21]; int i = 0; uint[] temp_ = Enumerable.Repeat(1, 16).ToArray(); // rtn = SJUartRawBurstRecv(SJT_TRIG_CNT, &Tmp_Cur_EncCnt[0], 17); //rtn = SJUartRawBurstRecv(SJT_TRIG_CNT, Tmp_Cur_EncCnt, 21); rtn = SJUartRawBurstRecv(SJT_TRIG_CNT, ref Tmp_Cur_EncCnt, 21); if (0 == rtn) { TrigCount[0] = Convert.ToUInt32(Tmp_Cur_EncCnt[0]); for (i = 1; i < 17; i++) { TrigCount[i] = Convert.ToUInt32(Tmp_Cur_EncCnt[i] >> 32); ErrCount[i - 1] = Convert.ToUInt32(Tmp_Cur_EncCnt[i] & 0xffffffff); } for (i = 0; i < 4; i++) { temp_[4 * i + 0] = Convert.ToUInt32(Tmp_Cur_EncCnt[i + 17] & Convert.ToUInt32(0xffff)); temp_[4 * i + 1] = Convert.ToUInt32((Tmp_Cur_EncCnt[i + 17] >> 16) & Convert.ToUInt32(0xffff)); temp_[4 * i + 2] = Convert.ToUInt32((Tmp_Cur_EncCnt[i + 17] >> 32) & Convert.ToUInt32(0xffff)); temp_[4 * i + 3] = Convert.ToUInt32((Tmp_Cur_EncCnt[i + 17] >> 48) & Convert.ToUInt32(0xffff)); /* if ((unsigned int)(Tmp_Cur_EncCnt[i + 17] & (unsigned int)0xffff) == 0xfffe) MaxFreq[i * 4 + 0] = 0.0; else MaxFreq[i * 4 + 0] = 100000 / (unsigned int)(Tmp_Cur_EncCnt[i + 17] & (unsigned int)0xffff); if ((unsigned int)((Tmp_Cur_EncCnt[i + 17] >> 16) & (unsigned int)0xffff) == 0xfffe) MaxFreq[i * 4 + 1] = 0.0; else MaxFreq[i * 4 + 1] = 100000 / (unsigned int)((Tmp_Cur_EncCnt[i + 17] >> 16) & (unsigned int)0xffff); if ((unsigned int)((Tmp_Cur_EncCnt[i + 17] >> 32) & (unsigned int)0xffff) == 0xfffe) MaxFreq[i * 4 + 2] = 0.0; else MaxFreq[i * 4 + 2] = 100000 / (unsigned int)((Tmp_Cur_EncCnt[i + 17] >> 32) & (unsigned int)0xffff); if ((unsigned int)((Tmp_Cur_EncCnt[i + 17] >> 48) & (unsigned int)0xffff) == 0xfffe) MaxFreq[i * 4 + 3] = 0.0; else MaxFreq[i * 4 + 3] = 100000 / (unsigned int)((Tmp_Cur_EncCnt[i + 17] >> 48) & (unsigned int)0xffff);*/ } for (i = 0; i < 16; i++) { if (temp_[i] == 0xfffe) MaxFreq[i] = (float)0.0; else { if (temp_[i] != 0) MaxFreq[i] = (float)100000 / temp_[i]; else MaxFreq[i] = (float)0.0; } } } else return rtn; //if (DebugMode == 1) //{ // // CStringA Tmp; // // Tmp.Format("Get Trigger Count : Total : %d : rtn %x", TrigCount[0], rtn); // // Put_DataLog(Tmp, (int*)&TrigCount[1], 16, DATA_WR_TYPE_DEC_WRITE, *Connected_COM); // // Tmp.Format("Get Each Channel Error Count : rtn %x", rtn); // // Put_DataLog(Tmp, (int*)&ErrCount[0], 16, DATA_WR_TYPE_DEC_WRITE, *Connected_COM); // string temp; // temp = formatA("Get Trigger Count : Total : %d : rtn %x", TrigCount[0], rtn); // Put_DataLog(temp, (int*)&TrigCount[1], 8, DATA_WR_TYPE_DEC_WRITE, *Connected_COM); // temp = formatA("Get Each Channel Error Count : rtn %x", rtn); // Put_DataLog(temp, (int*)&ErrCount[0], 8, DATA_WR_TYPE_DEC_WRITE, *Connected_COM); // temp = formatA("Get Each Channel Trigger Out Max Frequency : rtn %x (Unit:10 ns)", rtn); // Put_DataLog(temp, (int*)&temp_[0], 8, DATA_WR_TYPE_DEC_WRITE, *Connected_COM); //} return rtn; } public ushort TrigCount_Reset() { ushort rtn = 0; rtn = SJT_Reset(false, false, true, false, false); //if ((DebugMode != 0) && (NULL != Connected_COM)) //{ // // CStringA Tmp; // // Tmp.Format("Trigger Counter Clear : rtn %x \r\n", rtn); Put_Log(Tmp, *Connected_COM); // string temp; // temp = formatA("Trigger Counter Clear : rtn %x \r\n", rtn); Put_Log(temp, *Connected_COM); //} if ((DebugMode != 0) && (IsConnected() == true)) Log.D(string.Format("Trigger Counter Clear : rtn {0:x}", rtn)); return rtn; } public ushort SetTrigOutEnable(bool TrigOutEn, sbyte mode = 0) { uint data = 0; ushort rtn = 0; data = Convert.ToUInt32(0x1 & (TrigOutEn == true ? 0x1 : 0x0)); rtn = SJUartAsSingleSend(SJT_TRIGOUT_EN, data); if ((DebugMode == 1) && (true == IsConnected())) { // CStringA Tmp; // Tmp.Format("Set TrigOut Enable %d : rtn \r\n", TrigOutEn, rtn); Put_Log(Tmp, *Connected_COM); Log.D(String.Format("Set TrigOut Enable {0:d} : rtn {1:x}", TrigOutEn, rtn)); } return rtn; } public ushort SetENCCnt(long EncCnt, sbyte mode = 0) { ushort rtn = 0; //Enc value error control needed //rtn = SJUartAsSingleSend(SJT_CUR_MODECNT, Convert.ToUInt32(EncCnt)); rtn = SJUartAsSingleSend(SJT_CUR_MODECNT, Convert.ToUInt32(EncCnt)); //if ((DebugMode == 1) && (NULL != Connected_COM)) //{ // // CStringA Tmp; // // Tmp.Format("Encoder Counter Setting : %I64d : rtn %x \r\n", EncCnt, rtn); Put_Log(Tmp, *Connected_COM); // string temp; // temp = formatA("Encoder Counter Setting : %I64d : rtn %x \r\n", EncCnt, rtn); Put_Log(temp, *Connected_COM); //} if ((DebugMode != 0) && (IsConnected() == true)) Log.D(string.Format("Encoder Counter Setting : {0:d} : rtn {1:x}", EncCnt, rtn)); return rtn; } public ushort SJT_SystemReset() { ushort rtn = 0; rtn = SJT_Reset(true, true, true, true, true); //if ((DebugMode == 1) && (NULL != Connected_COM)) //{ // // CStringA Tmp; // // Tmp.Format("SJT System Reset : rtn %x \r\n", rtn); Put_Log(Tmp, *Connected_COM); // string temp; // temp = formatA("SJT System Reset : rtn %x \r\n", rtn); Put_Log(temp, *Connected_COM); //} if ((DebugMode != 0) && (IsConnected() == true)) Log.D(string.Format("SJT System Reset : rtn {0:x}", rtn)); return rtn; } public ushort SJT_Reset(bool MB_Reset, bool RefFF_Reset, bool TrigCnt_Reset, bool Strobe_Reset, bool EncCnt_Reset) { uint data = 0; ushort rtn = 0; data = 0; if (MB_Reset) data |= 0x01 << 0; if (RefFF_Reset) data |= 0x01 << 1; if (TrigCnt_Reset) data |= 0x01 << 2; if (Strobe_Reset) data |= 0x01 << 3; if (EncCnt_Reset) data |= 0x01 << 4; //rtn = SJUartAsSingleSend(SJT_SJTRESET, data); rtn = SJUartAsSingleSend(SJT_SJTRESET, data); //if ((DebugMode >= 2) && (NULL != Connected_COM)) //{ // // CStringA Tmp; // // Tmp.Format("SJT_Reset MB_Rst %d, RefFF_Rst %d, TrigCnt_Rst %d, Strobe_Rst %d, EncCnt_Rst %d : rtn %x \r\n", MB_Reset, RefFF_Reset, TrigCnt_Reset, Strobe_Reset, EncCnt_Reset, rtn); Put_Log(Tmp, *Connected_COM); // string temp; // temp = formatA("SJT_Reset MB_Rst %d, RefFF_Rst %d, TrigCnt_Rst %d, Strobe_Rst %d, EncCnt_Rst %d : rtn %x \r\n", // MB_Reset, RefFF_Reset, TrigCnt_Reset, Strobe_Reset, EncCnt_Reset, rtn); // Put_Log(temp, *Connected_COM); //} if ((DebugMode != 0) && (IsConnected() == true)) Log.D(string.Format("SJT_Reset MB_Rst {0:d}, RefFF_Rst {1:d}, TrigCnt_Rst {2:d}, Strobe_Rst {3:d}, EncCnt_Rst {4:d} : rtn {5:x}", MB_Reset, RefFF_Reset, TrigCnt_Reset, Strobe_Reset, EncCnt_Reset, rtn)); return rtn; } public ushort ENC_CNT_Reset() { ushort rtn = 0; rtn = SJT_Reset(true, true, true, false, true); //if ((DebugMode != 0) && (NULL != Connected_COM)) //{ // // CStringA Tmp; // // Tmp.Format("Encoder Counter Clear : rtn %x \r\n", rtn); Put_Log(Tmp, *Connected_COM); // string temp; // temp = formatA("Encoder Counter Clear : rtn %x \r\n", rtn); Put_Log(temp, *Connected_COM); //} if ((DebugMode != 0) && (IsConnected() == true)) Log.D(string.Format("Encoder Counter Clear : rtn {0:x}", rtn)); SJT_Trigger_Stop(); return rtn; } public ushort DisableTrigCorrectTable() { ushort rtn = 0; uint data = 0; data = 0x1; rtn = SJUartAsSingleSend(SJT_POSENCTABLE_OFF, data); if ((DebugMode != 0) && (true == IsConnected())) { // CStringA Tmp; // Tmp.Format("Pos,Enc 1:1 Mode /rtn %x \r\n", rtn); Put_Log(Tmp, *Connected_COM); Log.D(String.Format("Pos,Enc 1:1 Mode /rtn {0:x}", rtn)); } return rtn; } public ushort SetTrigCorrectTable(ref double[] Pos_Table, ref ulong[] Enc_Table, sbyte mode = 0) { ulong[] SendData = new ulong[256]; byte data_num = 0; ushort rtn = 0; if ((Pos_Table[0] != 0.0) | (Enc_Table[0] != 0)) return ERR_VAL_POS_ENC_TABLE; SendData[0] = 0; for (int i = 1; i < 256; i++) { data_num = (byte)i; if (Pos_Table[i] == 0.0) { break; } if ((POS_TABLE_MIN > Pos_Table[i]) || (POS_TABLE_MAX < Pos_Table[i])) return ERR_VAL_POS_ENC_TABLE; if ((Pos_Table[i - 1] >= Pos_Table[i])) // array should be increase on positive value return ERR_VAL_POS_ENC_TABLE; SendData[i] = Convert.ToUInt64((Pos_Table[i] + 0.0005) * 1000); } for (int i = 1; i < (int)data_num; i++) { if (Enc_Table[i] > ENCODER_MAX) return ERR_VAL_POS_ENC_TABLE; //All Encoder array should be positive integer if (Enc_Table[i - 1] >= Enc_Table[i]) return ERR_VAL_POS_ENC_TABLE; } rtn = SJUartAsBurstSend(SJT_POS_TABLE_INIT, ref SendData, data_num, 0); if ((DebugMode == 1) && (true == IsConnected())) { // CStringA Tmp; // Tmp.Format("Pos/Enc Table Set (Pos) : DataNum %d : rtn %x", data_num, rtn); // Put_DataLog(Tmp, (__int64*)SendData, data_num, DATA_WR_TYPE_DEC_WRITE, *Connected_COM); Log.D(String.Format("Pos/Enc Table Set (Pos) : DataNum {0:d} : rtn {1:x}", data_num, rtn)); //Put_DataLog(temp, (__int64*)SendData, data_num, DATA_WR_TYPE_DEC_WRITE, *Connected_COM); } rtn |= SJUartAsBurstSend(SJT_ENC_TABLE_INIT, ref Enc_Table, data_num, 0); if ((DebugMode == 1) && (true == IsConnected())) { // CStringA Tmp; // Tmp.Format("Pos/Enc Table Set (Enc) : DataNum %x : rtn %d", data_num, rtn); // Put_DataLog(Tmp, (__int64*)Enc_Table, data_num, DATA_WR_TYPE_DEC_WRITE, *Connected_COM); Log.D(String.Format("Pos/Enc Table Set (Enc) : DataNum {0:d} : rtn {1:x}", data_num, rtn)); //Put_DataLog(temp, (__int64*)Enc_Table, data_num, DATA_WR_TYPE_DEC_WRITE, *Connected_COM); } return rtn; } public ushort GetCurEncoderCnt(out long Cur_EncCnt) { ushort rtn = 0; ulong Tmp_Cur_EncCnt = 0; // rtn = SJUartSingleRecv(SJT_CUR_ENCCNT, (unsigned __int64*) Cur_EncCnt); // rtn = SJUartSingleRecv(SJT_CUR_ENCCNT, &Tmp_Cur_EncCnt); //rtn = SJUartSingleRecv(SJT_CUR_MODECNT, out Tmp_Cur_EncCnt); rtn = SJUartSingleRecv(SJT_CUR_MODECNT, ref Tmp_Cur_EncCnt); if (((Tmp_Cur_EncCnt >> 44) & 0x1) == 1) Cur_EncCnt = (Convert.ToInt64(0x7ffff) << 45) + (Convert.ToInt64(Tmp_Cur_EncCnt) & 0x1fffffffffff); else Cur_EncCnt = (Convert.ToInt64(Tmp_Cur_EncCnt) & 0x1fffffffffff); //if ((DebugMode == 1) && (NULL != Connected_COM)) //{ // // CStringA Tmp; // // Tmp.Format("Get Current Encoder Counter : %I64d : rtn %x \r\n", *Cur_EncCnt, rtn); Put_Log(Tmp, *Connected_COM); // string temp; // temp = formatA("Get Current Encoder Counter : %I64d : rtn %x \r\n", *Cur_EncCnt, rtn); Put_Log(temp, *Connected_COM); //} if ((DebugMode != 0) && (IsConnected() == true)) Log.D(string.Format("Get Current Encoder Counter : {0:d} : rtn {1:x}", Cur_EncCnt, rtn)); return rtn; } public ushort GetCurPosition(out long Cur_Position) { ushort rtn = 0; ulong Tmp_RefCnt = 0; // rtn = SJUartSingleRecv(SJT_CUR_POS, (unsigned __int64*)Cur_Position); rtn = SJUartSingleRecv(SJT_CUR_POS, ref Tmp_RefCnt); /* if (((Tmp_RefCnt >> 55) & 0x1)) *Cur_Position = ((unsigned __int64)0xff << 56) + (Tmp_RefCnt & 0xffffffffffffff); else *Cur_Position = (Tmp_RefCnt & 0xffffffffffffff); */ Cur_Position = (long)(Tmp_RefCnt / 1000); if ((DebugMode == 1) && (true == IsConnected())) { // CStringA Tmp; // Tmp.Format("Get Current Position : %I64d : rtn %x \r\n", *Cur_Position, rtn); Put_Log(Tmp, *Connected_COM); Log.D(String.Format("Get Current Position : {0:d} : rtn {1:x}", Cur_Position, rtn)); } return rtn; } public ushort SetTrigSet(byte NumberOfTrigSet, ref TrigSeqSet[] TrigSet) { // Trig Gen Mode 0; ulong[] SendData = new ulong[509]; int dir, i; ushort data_num; ushort rtn = 0, rtn1 = 0; long[] Tmp_TrigSet = new long[509]; uint SeqVerchk = 0; uint RcvTmp = 0; uint[] RcvTmpt = new uint[2]; uint Check_Cur_Mode, GenMode, OutMode; string temp = ""; if (7 == TrigSet[0].Out2_SeqMode_Sel) TrigSet[0].Out2_SeqMode_Sel = 0; if (TrigSet[0].Interval > 0.0) dir = 0; else if (TrigSet[0].Interval == 0.0) return ERR_VAL_TRIGSET_ARRAY; else dir = 1; // FPGA PL Calc condition check Start// i = 1; while ((i-- > 0)) { if (1 != NumberOfTrigSet) { temp = String.Format("GenMode 0(FPGA Calc) Fail for Number Of TrigSet : {0:d}", NumberOfTrigSet); break; } //fractal check if ((long)(TrigSet[0].Interval * 1000) % 1000 != 0) { temp = String.Format("GenMode 0(FPGA Calc) Fail for TrigInterbal : {0:f}", TrigSet[0].Interval); break; } if ((long)(TrigSet[0].StartPosition * 1000) % 1000 != 0) { temp = String.Format("GenMode 0(FPGA Calc) Fail for TrigStart_Pos : {0:f}", TrigSet[0].StartPosition); break; } /* if (fmod(TrigSet[0].TrigInterbal, (double)1.0) != 0.0) break; if (fmod(TrigSet[0].TrigStart_Pos, (double)1.0) != 0.0) break;*/ //position mapping not use check rtn = SJUartRawSingleRecv(SJT_POSENCTABLE_OFF, ref RcvTmp); if (rtn != OK_RETURN) return ERR_NOT_DEVELOPED_YET; if (0 == RcvTmp) { temp = String.Format("GenMode 0(FPGA Calc) Fail for using Enc/Pos Err map"); break; } //genmode outmode check //support check // rtn = SJUartRawSingleRecv(SJT_TRIG_GEN_OUT_MODE, &Check_Cur_Mode); rtn = SJUartRawBurstRecv(SJT_TRIG_GEN_OUT_MODE, ref RcvTmpt, 2); if (rtn != OK_RETURN) return ERR_NOT_DEVELOPED_YET; GenMode = RcvTmpt[0] & 0xf; OutMode = (RcvTmpt[0] >> 16) & 0x7f; if (((0 == GenMode) || (3 == GenMode)) && ((2 == OutMode) || (3 == OutMode)) && (1912 == RcvTmpt[1])) { // FPGA CALC Code if ((TrigSet[0].StartPosition > POSITION_MAX) || (TrigSet[0].StartPosition < POSITION_MIN)) return ERR_VAL_TRIGSET_ARRAY; // Initial value error // if (TrigSet[0].Out2_SeqMode_Sel > 8) // return ERR_VAL_TRIGSET_ARRAY; // OutMode2 MaskSeq Set error if (TrigSet[0].WD_Set_Sel > 7) return ERR_VAL_TRIGSET_ARRAY; // Width Delay Set error SendData[0] = 1; //FCalc_Mode_Set SendData[1] = (ulong)(TrigSet[0].StartPosition / (long)1); // FCalc_Enc_Start SendData[2] = (ulong)(TrigSet[0].Interval / (long)1); // FCalc_Enc_Interval SendData[3] = (ulong)TrigSet[0].Iteration; // FCalc_Enc_Iteration SendData[4] = (ulong)TrigSet[0].WD_Set_Sel; // FCalc_WD_Sel data_num = 5; rtn = SJUartRawBurstSend(SJT_FPGA_CALC_MODE_SET, ref SendData, (byte)data_num); if ((DebugMode == 1) && (true == IsConnected())) { // CStringA Tmp; // for (i = 0; i < data_num; i++) Tmp_TrigSet[i] = (__int64)SendData[i]; // for debug; // Tmp.Format("Trigger GenMode 0 Trigger Set Setting : Set Num %d : rtn %x / rtn1 %x", NumberOfTrigSet, rtn, rtn1); // Put_DataLog(Tmp, (__int64*)Tmp_TrigSet, data_num, DATA_WR_TYPE_HEX_WRITE, *Connected_COM); for (i = 0; i < data_num; i++) Tmp_TrigSet[i] = (long)SendData[i]; // for debug; temp = String.Format("Trigger GenMode 0(FPGA Calc Ver) Trigger Set Setting : Set Num {0:d} : rtn {1:x}", NumberOfTrigSet, rtn); //Put_DataLog(temp, (__int64*)Tmp_TrigSet, data_num, DATA_WR_TYPE_HEX_WRITE, *Connected_COM); } return rtn; } else { temp = String.Format("GenMode 0(FPGA Calc) Fail for GenMode : {0:d} / OutMode : {1:d} / HW Support {2:d},", GenMode, OutMode, RcvTmpt[1]); break; } } if ((DebugMode == 1) && (true == IsConnected())) Log.D(temp); // FPGA Calc condition check End// rtn = SJUartRawSingleRecv(SJT_SEQ_IMPROVE_CHK, ref SeqVerchk); if (rtn != OK_RETURN) return ERR_NOT_DEVELOPED_YET; if (1912 == SeqVerchk) { // Check for Trigger firmware support FPGA PL Calc mode if ((NumberOfTrigSet > 160) || (NumberOfTrigSet < 1)) return ERR_VAL_TRIGSET_ARRAY; data_num = (ushort)(NumberOfTrigSet * 3 + 1); for (i = 0; i < NumberOfTrigSet; i++) { // if ((TrigSet[i].Iteration_Num > GENMODE0_ITERATION_MAX) || (TrigSet[i].Iteration_Num == 0)) // return ERR_VAL_TRIGSET_ARRAY; // Maximum Iteration Num limit (1048575 ==> 20bit) if ((TrigSet[i].StartPosition > POSITION_MAX) || (TrigSet[i].StartPosition < POSITION_MIN)) return ERR_VAL_TRIGSET_ARRAY; // Initial value error if (TrigSet[i].Out2_SeqMode_Sel > 8) return ERR_VAL_TRIGSET_ARRAY; // OutMode2 MaskSeq Set error if (TrigSet[i].WD_Set_Sel > 7) return ERR_VAL_TRIGSET_ARRAY; // Width Delay Set error } if (dir == 0) { for (i = 0; i < NumberOfTrigSet; i++) { // if (((__int64)TrigSet[i].TrigInterbal) <= 0) //221107 bug fix by SJ -> less than 0.9999 ex) interbal = 0.073 if (TrigSet[i].Interval < 0.0) return ERR_VAL_TRIGSET_ARRAY; } for (i = 1; i < NumberOfTrigSet; i++) if (TrigSet[i - 1].StartPosition + (TrigSet[i - 1].Interval * (TrigSet[i - 1].Iteration - 1)) >= TrigSet[i].StartPosition) return ERR_VAL_TRIGSET_ARRAY; } else { // dir == 1 for (i = 0; i < NumberOfTrigSet; i++) { // if (((__int64)TrigSet[i].TrigInterbal) >= 0) //221107 bug fix by SJ if (TrigSet[i].Interval > 0.0) return ERR_VAL_TRIGSET_ARRAY; } for (i = 1; i < NumberOfTrigSet; i++) if (TrigSet[i - 1].StartPosition + (TrigSet[i - 1].Interval * (TrigSet[i - 1].Iteration - 1)) <= TrigSet[i].StartPosition) return ERR_VAL_TRIGSET_ARRAY; } SendData[0] = (ulong)NumberOfTrigSet; SendData[0] |= (0xffff & (ulong)1912) << 16; // double change to int *1000 --> ex) (double) 2.24567 --> 2246 (int) for (i = 0; i < NumberOfTrigSet; i++) { if (TrigSet[i].StartPosition >= 0.0) SendData[(i * 3) + 1] = (ulong)(0x1fffffffffff & ((long)((TrigSet[i].StartPosition + 0.0005) * 1000))); else SendData[(i * 3) + 1] = (ulong)(0x1fffffffffff & ((long)((TrigSet[i].StartPosition - 0.0005) * 1000))); SendData[(i * 3) + 1] |= (0xf & (ulong)(TrigSet[i].WD_Set_Sel)) << 48; SendData[(i * 3) + 1] |= (0xf & (ulong)(TrigSet[i].Out2_SeqMode_Sel)) << 56; if (TrigSet[i].Interval > 0.0) SendData[(i * 3) + 2] = (ulong)((long)((TrigSet[i].Interval + 0.0005) * 1000)); else SendData[(i * 3) + 2] = (ulong)((long)((TrigSet[i].Interval - 0.0005) * 1000)); SendData[(i * 3) + 3] = 0xffffffff & (uint)TrigSet[i].Iteration; } } else { // old Version iteration max 20bit if ((NumberOfTrigSet > 254) || (NumberOfTrigSet < 1)) return ERR_VAL_TRIGSET_ARRAY; data_num = (ushort)(NumberOfTrigSet * 2 + 1); for (i = 0; i < NumberOfTrigSet; i++) { if ((TrigSet[i].Iteration > GENMODE0_ITERATION_MAX) || (TrigSet[i].Iteration == 0)) return ERR_VAL_TRIGSET_ARRAY; // Maximum Iteration Num limit (1048575 ==> 20bit) if ((TrigSet[i].StartPosition > POSITION_MAX) || (TrigSet[i].StartPosition < POSITION_MIN)) return ERR_VAL_TRIGSET_ARRAY; // Initial value error if (TrigSet[i].Out2_SeqMode_Sel > 8) return ERR_VAL_TRIGSET_ARRAY; // OutMode2 MaskSeq Set error if (TrigSet[i].WD_Set_Sel > 7) return ERR_VAL_TRIGSET_ARRAY; // Width Delay Set error } if (dir == 0) { for (i = 0; i < NumberOfTrigSet; i++) { // if (((__int64)TrigSet[i].TrigInterbal) <= 0) //221107 bug fix by SJ if (TrigSet[i].Interval < 0.0) return ERR_VAL_TRIGSET_ARRAY; } for (i = 1; i < NumberOfTrigSet; i++) { if (TrigSet[i - 1].StartPosition + (TrigSet[i - 1].Interval * (TrigSet[i - 1].Iteration - 1)) >= TrigSet[i].StartPosition) return ERR_VAL_TRIGSET_ARRAY; } } else { // dir == 1 for (i = 0; i < NumberOfTrigSet; i++) { // if (((__int64)TrigSet[i].TrigInterbal) >= 0) //221107 bug fix by SJ if (TrigSet[i].Interval > 0.0) return ERR_VAL_TRIGSET_ARRAY; } for (i = 1; i < NumberOfTrigSet; i++) { if (TrigSet[i - 1].StartPosition + (TrigSet[i - 1].Interval * (TrigSet[i - 1].Iteration - 1)) <= TrigSet[i].StartPosition) return ERR_VAL_TRIGSET_ARRAY; } } SendData[0] = (ulong)NumberOfTrigSet; // double change to int *1000 --> ex) (double) 2.24567 --> 2246 (int) for (i = 0; i < NumberOfTrigSet; i++) { if (TrigSet[i].StartPosition >= 0.0) SendData[(i * 2) + 1] = (ulong)(0x1fffffffffff & ((long)((TrigSet[i].StartPosition + 0.0005) * 1000))); else SendData[(i * 2) + 1] = (ulong)(0x1fffffffffff & ((long)((TrigSet[i].StartPosition - 0.0005) * 1000))); SendData[(i * 2) + 1] |= (0xf & (ulong)(TrigSet[i].WD_Set_Sel)) << 48; SendData[(i * 2) + 1] |= (0xf & (ulong)(TrigSet[i].Out2_SeqMode_Sel)) << 56; SendData[(i * 2) + 1 + 1] = 0xfffff & (uint)TrigSet[i].Iteration; // 20bit // if (TrigSet[i * 3 + 1] < 0) SendData[(i * 2) + 1 + 1] |= (0xfffffffffff & ((__int64)(TrigSet[i * 3 + 1] * 1000))) << 20; // else SendData[(i * 2) + 1 + 1] |= (0xfffffffffff & ((__int64)(TrigSet[i * 3 + 1] * 1000))) << 20; if (TrigSet[i].Interval > 0.0) SendData[(i * 2) + 2] |= (ulong)(0xfffffffffff & ((long)((TrigSet[i].Interval + 0.0005) * 1000))) << 20; else SendData[(i * 2) + 2] |= (ulong)(0xfffffffffff & ((long)((TrigSet[i].Interval - 0.0005) * 1000))) << 20; } } if (data_num > 255) { rtn = SJUartRawBurstSend(SJT_TRIGSET, ref SendData, 255); ulong[] SendData2 = SendData.Skip(255).ToArray(); rtn1 = SJUartRawBurstSend(SJT_TRIGSET + 255, ref SendData2, (byte)(data_num - 255)); } else { rtn = SJUartRawBurstSend(SJT_TRIGSET, ref SendData, (byte)data_num); } if ((DebugMode == 1) && (true == IsConnected())) { // CStringA Tmp; // for (i = 0; i < data_num; i++) Tmp_TrigSet[i] = (__int64)SendData[i]; // for debug; // Tmp.Format("Trigger GenMode 0 Trigger Set Setting : Set Num %d : rtn %x / rtn1 %x", NumberOfTrigSet, rtn, rtn1); // Put_DataLog(Tmp, (__int64*)Tmp_TrigSet, data_num, DATA_WR_TYPE_HEX_WRITE, *Connected_COM); for (i = 0; i < data_num; i++) Tmp_TrigSet[i] = (long)SendData[i]; // for debug; Log.D(String.Format("Trigger GenMode 0({0:d} Ver) Trigger Set Setting : Set Num {1:d} : rtn {2:x} / rtn1 {3:x}", SeqVerchk, NumberOfTrigSet, rtn, rtn1)); // Put_DataLog(temp, (__int64*)Tmp_TrigSet, data_num, DATA_WR_TYPE_HEX_WRITE, *Connected_COM); } return rtn; } public ushort SetMaskSet(ref byte[] MaskSet_pt) { ulong[] SendData = Enumerable.Repeat(0, 14).ToArray(); uint[] SendData_F = Enumerable.Repeat(0, 9).ToArray(); int i = 0, j = 0; byte data_num, temp, Available_SeqCnt; ushort rtn; uint RcvTmp = 0; Available_SeqCnt = 0; for (i = 6; i >= 0; i--) { // temp = 0; // for (j = 0; j < 8; j++) { // temp += MaskSet_pt[i*8+j]; // } // if (0 != temp) { // Available_SeqCnt = i + 1; // break; // } for (j = 8; j >= 0; j--) { temp = 0; if (0 != MaskSet_pt[i * 8 + j]) { temp = (byte)j; Available_SeqCnt = (byte)(i + 1); break; } if (0 != temp) break; } } //if (0 == Available_SeqCnt) return -1; if (0 == Available_SeqCnt) return 0; // FPGA Calc Start // i = 1; while ((i-- >= 0)) { rtn = SJUartRawSingleRecv(SJT_FPGA_CALC_MODE_SET, ref RcvTmp); if (rtn != OK_RETURN) return ERR_NOT_DEVELOPED_YET; if (1 != RcvTmp) break; // if (1 != Available_SeqCnt) // return ERR_NOT_DEVELOPED_YET; data_num = (byte)(1 + (j + 1)); SendData_F[0] = (uint)(data_num - 1); for (j = 0; j < data_num - 1; j++) SendData_F[j + 1] = MaskSet_pt[j]; rtn = SJUartRawBurstSend(SJT_FPGA_CALC_SEQMASK_NUM, ref SendData_F, data_num); if ((DebugMode == 1) && (true == IsConnected())) { int[] temp_data_F = new int[8]; Log.D(String.Format("Trigger OutMode 2(FPGA Clac Ver) SEQMASK_NUM {0:d} : rtn {1:x}", data_num - 1, rtn)); for (i = 0; i < 8; i++) temp_data_F[i] = (int)MaskSet_pt[i]; //Put_DataLog(temp, (int*)&temp_data_F[0], data_num, DATA_WR_TYPE_HEX_WRITE, *Connected_COM); } return rtn; } // FPGA Calc End // data_num = (byte)(Available_SeqCnt * 2); for (i = 0; i < Available_SeqCnt; i++) { SendData[i * 2] = (ulong)(0x00ff & MaskSet_pt[i * 8]); SendData[i * 2] |= (ulong)(0x00ff & MaskSet_pt[i * 8 + 1]) << 16; SendData[i * 2] |= (ulong)(0x00ff & MaskSet_pt[i * 8 + 2]) << 32; SendData[i * 2] |= (ulong)(0x00ff & MaskSet_pt[i * 8 + 3]) << 48; SendData[i * 2 + 1] = (ulong)(0x00ff & MaskSet_pt[i * 8 + 4]); SendData[i * 2 + 1] |= (ulong)((0x00ff & MaskSet_pt[i * 8 + 5]) << 16); SendData[i * 2 + 1] |= (ulong)(0x00ff & MaskSet_pt[i * 8 + 6]) << 32; SendData[i * 2 + 1] |= (ulong)(0x00ff & MaskSet_pt[i * 8 + 7]) << 48; } rtn = SJUartRawBurstSend(SJT_MASK_SEQ_SET, ref SendData, data_num); if ((DebugMode == 1) && (true == IsConnected())) { // CStringA Tmp; int[] temp_data = new int[56]; // Tmp.Format("Trigger OutMode 2 Mask Sequence Set / NumberofMaskSet %d : rtn %x", Available_SeqCnt, rtn); // for (int i = 0; i < 56; i++) temp_data[i] = (unsigned int)MaskSet_pt[i]; // Put_DataLog(Tmp, (int*)&temp_data[0], Available_SeqCnt*8, DATA_WR_TYPE_HEX_WRITE, *Connected_COM); Log.D(String.Format("Trigger OutMode 2 Mask Sequence Set / NumberofMaskSet {0:d} : rtn {1:x}", Available_SeqCnt, rtn)); for (i = 0; i < 56; i++) temp_data[i] = (int)MaskSet_pt[i]; //Put_DataLog(temp, (int*)&temp_data[0], Available_SeqCnt * 8, DATA_WR_TYPE_HEX_WRITE, *Connected_COM); } return rtn; } // Trig GenOut Mode 2; public ushort SetMaskSet(ref ushort[] MaskSet_pt) { ulong[] SendData = new ulong[14]; int i, j; byte data_num, temp, Available_SeqCnt; ushort rtn; Available_SeqCnt = 0; for (i = 6; i >= 0; i--) { temp = 0; for (j = 0; j < 8; j++) { temp += (byte)MaskSet_pt[i * 8 + j]; } if (0 != temp) { Available_SeqCnt = (byte)(i + 1); break; } } //if (0 == Available_SeqCnt) return -1; if (0 == Available_SeqCnt) return 0; data_num = (byte)(Available_SeqCnt * 2); for (i = 0; i < Available_SeqCnt; i++) { SendData[i * 2] = (ulong)(0xffff & MaskSet_pt[i * 8]); SendData[i * 2] |= (ulong)((0xffff & MaskSet_pt[i * 8 + 1]) << 16); SendData[i * 2] |= (ulong)(0xffff & MaskSet_pt[i * 8 + 2]) << 32; SendData[i * 2] |= (ulong)(0xffff & MaskSet_pt[i * 8 + 3]) << 48; SendData[i * 2 + 1] = (ulong)(0xffff & MaskSet_pt[i * 8 + 4]); SendData[i * 2 + 1] |= (ulong)((0xffff & MaskSet_pt[i * 8 + 5]) << 16); SendData[i * 2 + 1] |= (ulong)(0xffff & MaskSet_pt[i * 8 + 6]) << 32; SendData[i * 2 + 1] |= (ulong)(0xffff & MaskSet_pt[i * 8 + 7]) << 48; } rtn = SJUartRawBurstSend(SJT_MASK_SEQ_SET, ref SendData, data_num); if ((DebugMode == 1) && (true == IsConnected())) { // CStringA Tmp; // int temp_data[56]; // Tmp.Format("Trigger OutMode 2 Mask Sequence Set / NumberofMaskSet %d : rtn %x", Available_SeqCnt, rtn); // for (int i = 0; i < 56; i++) temp_data[i] = (unsigned int)MaskSet_pt[i]; // Put_DataLog(Tmp, (int*)&temp_data[0], Available_SeqCnt * 8, DATA_WR_TYPE_HEX_WRITE, *Connected_COM); int[] temp_data = new int[56]; Log.D(String.Format("Trigger OutMode 2 Mask Sequence Set / NumberofMaskSet {0:d} : rtn {1:x}", Available_SeqCnt, rtn)); for (i = 0; i < 56; i++) temp_data[i] = (int)MaskSet_pt[i]; //Put_DataLog(temp, (int*)&temp_data[0], Available_SeqCnt * 8, DATA_WR_TYPE_HEX_WRITE, *Connected_COM); } return rtn; } // Trig GenOut Mode 2; public ushort SetMaskSet(uint NumberOfMaskSet, ref byte[] MaskSet_pt) { ulong[] SendData = new ulong[3] { 0, 0, 0 }; //int dir, i; byte data_num; ushort rtn; if (NumberOfMaskSet > 8) return ERR_OVER_MASKSET_NUMBER; data_num = (byte)(((NumberOfMaskSet - 1) / 4 + 1) + 1); SendData[0] = (uint)(NumberOfMaskSet - 1); SendData[1] = (uint)(((MaskSet_pt[3] << 24) & 0xff000000)); SendData[1] |= (uint)(((MaskSet_pt[2] << 16) & 0x00ff0000)); SendData[1] |= (uint)(((MaskSet_pt[1] << 8) & 0x0000ff00)); SendData[1] |= (uint)((MaskSet_pt[0] & 0x000000ff)); SendData[2] = (uint)(((MaskSet_pt[7] << 24) & 0xff000000)); SendData[2] |= (uint)(((MaskSet_pt[6] << 16) & 0x00ff0000)); SendData[2] |= (uint)(((MaskSet_pt[5] << 8) & 0x0000ff00)); SendData[2] |= (uint)((MaskSet_pt[4] & 0x000000ff)); rtn = SJUartRawBurstSend(SJT_SEQMASKSET, ref SendData, data_num); return rtn; } // Trig GenOut Mode 2; public ushort SetDirectMask(uint NumberofMask, ref byte[] DirectMask_pt) { ulong[] SendData = new ulong[255]; uint i, divide_share, divide_mod; ushort rtn; uint Check_Cur_GenMode = 0, left_PosData = 0, Total_Data_Cnt = 0; uint Kintex7chk = 0; rtn = SJUartRawSingleRecv(SJT_70T_160T_CHK, ref Kintex7chk); if (rtn != OK_RETURN) return ERR_NOT_DEVELOPED_YET; if ((70 == Kintex7chk) || (0 == Kintex7chk)) { // data check if (NumberofMask > SJT_REFFIFO_MAX_70T) return ERR_VAL_DIRECTMASK; } else if (160 == Kintex7chk) { if (NumberofMask > SJT_REFFIFO_MAX_160T) return ERR_VAL_DIRECTMASK; } Total_Data_Cnt = NumberofMask / 4; left_PosData = Total_Data_Cnt; divide_share = Total_Data_Cnt / 255; divide_mod = Total_Data_Cnt % 255; // Current Trigger Gen mode check rtn = SJUartRawSingleRecv(SJT_TRIG_GEN_OUT_MODE, ref Check_Cur_GenMode); Check_Cur_GenMode = Check_Cur_GenMode & 0xff; if ((0 != rtn) | (1 == Check_Cur_GenMode) | (2 == Check_Cur_GenMode)) return ERR_VAL_TRIGDIRECT_GENMODE; rtn = SJUartAsSingleSend(SJT_MB_DATA_TYPE, (uint)3); for (i = 0; i < NumberofMask; i++) { if (0 == i % 4) { SendData[(i / 4) % 255] = (ulong)(0x00ff & DirectMask_pt[i]); } else if (1 == i % 4) { SendData[(i / 4) % 255] |= (ulong)(0x00ff & DirectMask_pt[i]) << 16; } else if (2 == i % 4) { SendData[(i / 4) % 255] |= (ulong)(0x00ff & DirectMask_pt[i]) << 32; } else { //if (3 == i % 4) { SendData[(i / 4) % 255] |= (ulong)(0x00ff & DirectMask_pt[i]) << 48; } if (1019 == i % 1020) { rtn = SJUartRawBurstSend(SJT_TRIGPOSDIRECT, ref SendData, 255); if ((DebugMode == 1) && (true == IsConnected())) { // CStringA Tmp; // Tmp.Format("OutMode Direct Mask Setting %d : rtn %x", i, rtn); // Put_DataLog(Tmp, (int*) &DirectMask_pt[i-1019], 1020, DATA_WR_TYPE_HEX_WRITE, *Connected_COM); Log.D(String.Format("OutMode Direct Mask Setting {0:d} : rtn {1:x}", i, rtn)); //Put_DataLog(temp, (int*)&DirectMask_pt[i - 1019], 1020, DATA_WR_TYPE_HEX_WRITE, *Connected_COM); } if (rtn != OK_RETURN) return rtn; } else if (i == NumberofMask - 1) { rtn = SJUartRawBurstSend(SJT_TRIGPOSDIRECT, ref SendData, (byte)(((i / 4) % 255) + 1)); if ((DebugMode == 1) && (true == IsConnected())) { // CStringA Tmp; // Tmp.Format("OutMode Direct Mask Setting %d : rtn %x", i, rtn); // Put_DataLog(Tmp, (int*)&DirectMask_pt[(unsigned int)(NumberofMask / 1020)*1020], ((i / 4) % 255) + 1, DATA_WR_TYPE_HEX_WRITE, *Connected_COM); Log.D(String.Format("OutMode Direct Mask Setting {0:d} : rtn {1:x}", i, rtn)); //Put_DataLog(temp, (int*)&DirectMask_pt[(unsigned int)(NumberofMask / 1020) * 1020], ((i / 4) % 255) + 1, DATA_WR_TYPE_HEX_WRITE, *Connected_COM); } if (rtn != OK_RETURN) return rtn; } } return rtn; } public ushort SetDirectMask(uint NumberofMask, ref ushort[] DirectMask_pt) { ulong[] SendData = new ulong[255]; uint i, divide_share, divide_mod; ushort rtn; uint Check_Cur_GenMode = 0, left_PosData = 0, Total_Data_Cnt = 0; uint Kintex7chk = 0; rtn = SJUartRawSingleRecv(SJT_70T_160T_CHK, ref Kintex7chk); if (rtn != OK_RETURN) return ERR_NOT_DEVELOPED_YET; if ((70 == Kintex7chk) || (0 == Kintex7chk)) { // data check if (NumberofMask > SJT_REFFIFO_MAX_70T) return ERR_VAL_DIRECTMASK; } else if (160 == Kintex7chk) { if (NumberofMask > SJT_REFFIFO_MAX_160T) return ERR_VAL_DIRECTMASK; } Total_Data_Cnt = NumberofMask / 4; left_PosData = Total_Data_Cnt; divide_share = Total_Data_Cnt / 255; divide_mod = Total_Data_Cnt % 255; // Current Trigger Gen mode check rtn = SJUartRawSingleRecv(SJT_TRIG_GEN_OUT_MODE, ref Check_Cur_GenMode); Check_Cur_GenMode = Check_Cur_GenMode & 0xff; if ((0 != rtn) | (1 == Check_Cur_GenMode) | (2 == Check_Cur_GenMode)) return ERR_VAL_TRIGDIRECT_GENMODE; rtn = SJUartAsSingleSend(SJT_MB_DATA_TYPE, (uint)3); for (i = 0; i < NumberofMask; i++) { if (0 == i % 4) { SendData[(i / 4) % 255] = (ulong)(0xffff & DirectMask_pt[i]); } else if (1 == i % 4) { SendData[(i / 4) % 255] |= (ulong)(0xffff & DirectMask_pt[i]) << 16; } else if (2 == i % 4) { SendData[(i / 4) % 255] |= (ulong)(0xffff & DirectMask_pt[i]) << 32; } else { //if (3 == i % 4) { SendData[(i / 4) % 255] |= (ulong)(0xffff & DirectMask_pt[i]) << 48; } if (1019 == i % 1020) { rtn = SJUartRawBurstSend(SJT_TRIGPOSDIRECT, ref SendData, 255); if ((DebugMode == 1) && (true != IsConnected())) { // CStringA Tmp; // Tmp.Format("OutMode Direct Mask Setting %d : rtn %x", i, rtn); // Put_DataLog(Tmp, (int*)&DirectMask_pt[i - 1019], 1020, DATA_WR_TYPE_HEX_WRITE, *Connected_COM); Log.D(String.Format("OutMode Direct Mask Setting {0:d} : rtn {1:x}", i, rtn)); //Put_DataLog(temp, (int*)&DirectMask_pt[i - 1019], 1020, DATA_WR_TYPE_HEX_WRITE, *Connected_COM); } if (rtn != OK_RETURN) return rtn; } else if (i == NumberofMask - 1) { rtn = SJUartRawBurstSend(SJT_TRIGPOSDIRECT, ref SendData, (byte)(((i / 4) % 255) + 1)); if ((DebugMode == 1) && (true == IsConnected())) { // CStringA Tmp; // Tmp.Format("OutMode Direct Mask Setting %d : rtn %x", i, rtn); // Put_DataLog(Tmp, (int*)&DirectMask_pt[(unsigned int)(NumberofMask / 1020) * 1020], ((i / 4) % 255) + 1, DATA_WR_TYPE_HEX_WRITE, *Connected_COM); Log.D(String.Format("OutMode Direct Mask Setting {0:} : rtn {1:x}", i, rtn)); //Put_DataLog(temp, (int*)&DirectMask_pt[(unsigned int)(NumberofMask / 1020) * 1020], ((i / 4) % 255) + 1, DATA_WR_TYPE_HEX_WRITE, *Connected_COM); } if (rtn != OK_RETURN) return rtn; } } return rtn; } public ushort GetNextRefCnt(out long Next_RefCnt, out uint RefFF_Dcnt, out bool RefFF_pEmp, out bool RefFF_Empty, out ushort RefFF_OutMask, out byte RefFF_WD) { ushort rtn = 0, rtn1 = 0; uint RefFF_Status = 0; ulong Tmp_RefCnt = 0; // rtn = SJUartSingleRecv(SJT_NEXT_REF_VAL, (unsigned __int64*)Next_RefCnt); rtn = SJUartSingleRecv(SJT_NEXT_REF_VAL, ref Tmp_RefCnt); rtn1 = SJUartSingleRecv(SJT_REF_FF_STATUS, ref RefFF_Status); // RefFF_Dcnt = (unsigned short*) (RefFF_Status & 0x3fff); // RefFF_pEmp = (bool*)((RefFF_Status >> 14) & 0x1); // RefFF_Empty = (bool*)((RefFF_Status >> 15) & 0x1); RefFF_Dcnt = (RefFF_Status & 0x1ffff); RefFF_pEmp = ((RefFF_Status >> 30) & 0x1) == 0x1 ? true : false; RefFF_Empty = ((RefFF_Status >> 31) & 0x1) == 0x1 ? true : false; if (((Tmp_RefCnt >> 44) & 0x1) == 0x1) Next_RefCnt = (long)(((ulong)0x7ffff << 45) + (Tmp_RefCnt & 0x1fffffffffff)); else Next_RefCnt = (long)(Tmp_RefCnt & 0x1fffffffffff); RefFF_OutMask = (ushort)((Tmp_RefCnt >> 48) & 0xffff); RefFF_WD = (byte)((Tmp_RefCnt >> 45) & 0x7); if ((DebugMode == 1) && (true != IsConnected())) { // CStringA Tmp; // Tmp.Format("Get Next Reference Counter %I64d / Ref Buffer Dcnt %d / pEmpty %x / Empty %x : rtn %x \r\n", *Next_RefCnt, *RefFF_Dcnt, *RefFF_pEmp, *RefFF_Empty, rtn | rtn1); // Put_Log(Tmp, *Connected_COM); Log.D(String.Format("Get Next Reference Counter {0:d} / Ref Buffer Dcnt {1:d} / pEmpty {2:x} / Empty {3:x} : rtn {4:x}", Next_RefCnt, RefFF_Dcnt, RefFF_pEmp, RefFF_Empty, rtn | rtn1)); } // if (*RefFF_Empty == true) *Next_RefCnt = -1; return (ushort)(rtn | rtn1); } public ushort SetTrigDirect(uint NumberOfPosData, ref ulong[] TrigPosData, ref ushort[] TrigPosChMask, ref byte[] TrigPosWDSet) { // Trig Gen Mode 1,2; ulong[] SendData = new ulong[256]; uint dir, i, j, divide_share, divide_mod; ushort rtn, left_PosData; uint Check_Cur_GenMode = 0; uint Kintex7chk = 0; rtn = SJUartRawSingleRecv(SJT_70T_160T_CHK, ref Kintex7chk); if (rtn != OK_RETURN) return ERR_NOT_DEVELOPED_YET; if ((70 == Kintex7chk) || (0 == Kintex7chk)) { // data check if (NumberOfPosData > SJT_REFFIFO_MAX_70T) return ERR_OVER_TRIGDIRECT_BUFFER; } else if (160 == Kintex7chk) { if (NumberOfPosData > SJT_REFFIFO_MAX_160T) return ERR_OVER_TRIGDIRECT_BUFFER; } left_PosData = (ushort)NumberOfPosData; divide_share = NumberOfPosData / 255; divide_mod = NumberOfPosData % 255; if (TrigPosData[0] < TrigPosData[1]) dir = 0; else dir = 1; if (dir == 0) { for (i = 0; i < NumberOfPosData - 1; i++) if (TrigPosData[i] >= TrigPosData[i + 1]) return ERR_VAL_TRIGDIRECT_ARRAY; } else { // dir == 1 for (i = 0; i < NumberOfPosData - 1; i++) if (TrigPosData[i] <= TrigPosData[i + 1]) return ERR_VAL_TRIGDIRECT_ARRAY; } for (i = 0; i < NumberOfPosData - 1; i++) { if (TrigPosWDSet[i] > 7) return ERR_VAL_TRIGDIRECT_ARRAY; if ((TrigPosData[i] > ENCODER_MAX) || (TrigPosData[i] < ENCODER_MIN)) return ERR_VAL_TRIGDIRECT_ARRAY; } // Current Trigger Gen mode check rtn = SJUartRawSingleRecv(SJT_TRIG_GEN_OUT_MODE, ref Check_Cur_GenMode); Check_Cur_GenMode = Check_Cur_GenMode & 0xff; if ((0 != rtn) | (1 > Check_Cur_GenMode) | (2 < Check_Cur_GenMode)) return ERR_VAL_TRIGDIRECT_GENMODE; rtn = SJUartAsSingleSend(SJT_MB_DATA_TYPE, (uint)0); for (i = 0; i < divide_share + 1; i++) { if (left_PosData > 255) { for (j = 0; j < 255; j++) { // SendData[j] = (unsigned __int64) ((TrigPosData[i * 255 + j] << 8) + TrigPosChMask[i * 255 + j]) ; SendData[j] = (ulong)((TrigPosData[i * 255 + j] << 19) + ((0x7 & (ulong)TrigPosWDSet[i * 255 + j]) << 16) + TrigPosChMask[i * 255 + j]); } rtn = SJUartRawBurstSend(SJT_TRIGPOSDIRECT, ref SendData, 255); left_PosData -= 255; if ((DebugMode == 1) && (true == IsConnected())) { // CStringA Tmp; // Tmp.Format("Trigger GenMode 1 Trigger Direct Enc Setting %d : rtn %x", i, rtn); // Put_DirectTriggerInLog(Tmp, (unsigned short*)&TrigPosChMask[i*255], (__int64*)&TrigPosData[i * 255], (unsigned char*)&TrigPosWDSet[i * 255], 255, *Connected_COM); Log.D(String.Format("Trigger GenMode 1 Trigger Direct Enc Setting {0:d} : rtn {1:x}", i, rtn)); //Put_DirectTriggerInLog(temp, (unsigned short*) & TrigPosChMask[i * 255], (__int64*)&TrigPosData[i * 255], (unsigned char*)&TrigPosWDSet[i * 255], 255, *Connected_COM); } if (rtn != OK_RETURN) return rtn; } else { for (j = 0; j < divide_mod; j++) { SendData[j] = (ulong)((TrigPosData[i * 255 + j] << 19) + ((0x7 & (ulong)TrigPosWDSet[i * 255 + j]) << 16) + TrigPosChMask[i * 255 + j]); } rtn = SJUartRawBurstSend(SJT_TRIGPOSDIRECT, ref SendData, (byte)divide_mod); if ((DebugMode == 1) && (true == IsConnected())) { // CStringA Tmp; // Tmp.Format("Trigger GenMode 1 Trigger Direct Enc Setting %d : rtn %x", i, rtn); // Put_DirectTriggerInLog(Tmp, (unsigned short*)&TrigPosChMask[i * 255], (__int64*)&TrigPosData[i * 255], (unsigned char*)&TrigPosWDSet[i * 255], divide_mod, *Connected_COM); Log.D(String.Format("Trigger GenMode 1 Trigger Direct Enc Setting {0:d} : rtn {1:x}", i, rtn)); //Put_DirectTriggerInLog(temp, (unsigned short *) & TrigPosChMask[i * 255], (__int64*)&TrigPosData[i * 255], (unsigned char*)&TrigPosWDSet[i * 255], divide_mod, *Connected_COM); } if (rtn != OK_RETURN) return rtn; } } return rtn; } public ushort SetTrigDirect(uint NumberOfPosData, ref double[] TrigPosData, ref ushort[] TrigPosChMask, ref byte[] TrigPosWDSet) { // Trig Gen Mode 1,2; ulong[] SendData = new ulong[256]; uint dir, i, j, divide_share, divide_mod; ushort rtn, left_PosData; uint Check_Cur_GenMode = 0; long[] tmp_PosData = new long[256]; uint Kintex7chk = 0; rtn = SJUartRawSingleRecv(SJT_70T_160T_CHK, ref Kintex7chk); if (rtn != OK_RETURN) return ERR_NOT_DEVELOPED_YET; if ((70 == Kintex7chk) || (0 == Kintex7chk)) { // data check if (NumberOfPosData > SJT_REFFIFO_MAX_70T) return ERR_OVER_TRIGDIRECT_BUFFER; } else if (160 == Kintex7chk) { if (NumberOfPosData > SJT_REFFIFO_MAX_160T) return ERR_OVER_TRIGDIRECT_BUFFER; } left_PosData = (ushort)NumberOfPosData; divide_share = NumberOfPosData / 255; divide_mod = NumberOfPosData % 255; if (TrigPosData[0] < TrigPosData[1]) dir = 0; else dir = 1; if (dir == 0) { for (i = 0; i < NumberOfPosData - 1; i++) if (TrigPosData[i] >= TrigPosData[i + 1]) return ERR_VAL_TRIGDIRECT_ARRAY; } else { // dir == 1 for (i = 0; i < NumberOfPosData - 1; i++) if (TrigPosData[i] <= TrigPosData[i + 1]) return ERR_VAL_TRIGDIRECT_ARRAY; } for (i = 0; i < NumberOfPosData - 1; i++) { if (TrigPosWDSet[i] > 7) return ERR_VAL_TRIGDIRECT_ARRAY; if ((TrigPosData[i] > POSITION_MAX) || (TrigPosData[i] < POSITION_MIN)) return ERR_VAL_TRIGDIRECT_ARRAY; } // Current Trigger Gen mode check rtn = SJUartRawSingleRecv(SJT_TRIG_GEN_OUT_MODE, ref Check_Cur_GenMode); Check_Cur_GenMode = Check_Cur_GenMode & 0xff; if ((0 != rtn) | (1 > Check_Cur_GenMode) | (2 < Check_Cur_GenMode)) return ERR_VAL_TRIGDIRECT_GENMODE; rtn = SJUartAsSingleSend(SJT_MB_DATA_TYPE, (uint)1); for (i = 0; i < divide_share + 1; i++) { if (left_PosData > 255) { for (j = 0; j < 255; j++) { // SendData[j] = (unsigned __int64) ((TrigPosData[i * 255 + j] << 8) + TrigPosChMask[i * 255 + j]) ; if (TrigPosData[i * 255 + j] >= 0.0) tmp_PosData[j] = (long)((TrigPosData[i * 255 + j] + 0.0005) * 1000); else tmp_PosData[j] = (long)((TrigPosData[i * 255 + j] - 0.0005) * 1000); SendData[j] = (ulong)(((0x1fffffffffff & tmp_PosData[j]) << 19) + ((0x7 & TrigPosWDSet[i * 255 + j]) << 16) + TrigPosChMask[i * 255 + j]); } rtn = SJUartRawBurstSend(SJT_TRIGPOSDIRECT, ref SendData, 255); left_PosData -= 255; if ((DebugMode == 1) && (true != IsConnected())) { // CStringA Tmp; // Tmp.Format("Trigger GenMode 1 Trigger Direct Position Setting %d : rtn %x", i, rtn); // Put_DirectTriggerInLog(Tmp, (unsigned short*)&TrigPosChMask[i * 255], (__int64*)&tmp_PosData[0], (unsigned char*)&TrigPosWDSet[i * 255], 255, *Connected_COM); Log.D(String.Format("Trigger GenMode 1 Trigger Direct Position Setting {0:d} : rtn {1:x}", i, rtn)); //Put_DirectTriggerInLog(temp, (unsigned short *) & TrigPosChMask[i * 255], (__int64*)&tmp_PosData[0], (unsigned char*)&TrigPosWDSet[i * 255], 255, *Connected_COM); } if (rtn != OK_RETURN) return rtn; } else { for (j = 0; j < divide_mod; j++) { if (TrigPosData[i * 255 + j] >= 0.0) tmp_PosData[j] = (long)((TrigPosData[i * 255 + j] + 0.0005) * 1000); else tmp_PosData[j] = (long)((TrigPosData[i * 255 + j] - 0.0005) * 1000); SendData[j] = (ulong)(((0x1fffffffffff & tmp_PosData[j]) << 19) + ((0x7 & TrigPosWDSet[i * 255 + j]) << 16) + TrigPosChMask[i * 255 + j]); } rtn = SJUartRawBurstSend(SJT_TRIGPOSDIRECT, ref SendData, (byte)divide_mod); if ((DebugMode == 1) && (true == IsConnected())) { // CStringA Tmp; // Tmp.Format("Trigger GenMode 1 Trigger Direct Position Setting %d : rtn %x", i, rtn); // Put_DirectTriggerInLog(Tmp, (unsigned short*)&TrigPosChMask[i * 255], (__int64*)&tmp_PosData[0], (unsigned char*)&TrigPosWDSet[i * 255], divide_mod, *Connected_COM); Log.D(String.Format("Trigger GenMode 1 Trigger Direct Position Setting {0:d} : rtn {1:x}", i, rtn)); //Put_DirectTriggerInLog(temp, (unsigned short *) & TrigPosChMask[i * 255], (__int64*)&tmp_PosData[0], (unsigned char*)&TrigPosWDSet[i * 255], divide_mod, *Connected_COM); } if (rtn != OK_RETURN) return rtn; } } return rtn; } public ushort SetSimulEnc(long StartEnc, int IntervalPerSec) { ushort rtn; if ((ENCODER_MAX < StartEnc) || (ENCODER_MIN > StartEnc)) return ERR_VAL_ENCSETMAXMIN; if ((BOARD_REF_CLK < IntervalPerSec) || ((-1 * BOARD_REF_CLK) > IntervalPerSec) || (0 == IntervalPerSec)) return ERR_VAL_SIMULENC; double tempfloat; uint itempSign, itempValue, itempValue2; ulong[] SendData = new ulong[2]; byte data_num; if (IntervalPerSec < 0) { itempSign = 1; itempValue = (uint)(-1 * IntervalPerSec); } else { itempSign = 0; itempValue = (uint)IntervalPerSec; } tempfloat = BOARD_REF_CLK / itempValue; itempValue2 = (uint)(tempfloat + 0.5); SendData[0] = ((itempSign & 0x1) << 31) | (itempValue2 & 0x7fffffff); SendData[1] = (ulong)StartEnc; data_num = 2; rtn = SJUartAsBurstSend(SJT_SIM_ENC_CHANGE_FREQ, ref SendData, data_num); if ((DebugMode == 1) && (true == IsConnected())) { // CStringA Tmp; // Tmp.Format("Simul Enc Setting -> Start Enc : %I64d / Interval %d : rtn %x \r\n", StartEnc, IntervalPerSec, rtn); Put_Log(Tmp, *Connected_COM); Log.D(String.Format("Simul Enc Setting -> Start Enc : {0:d} / Interval {1:d} : rtn {2:x}", StartEnc, IntervalPerSec, rtn)); } return rtn; } public ushort SetSimulTrigLimit(uint iTrigLimit_Value) { ushort rtn; rtn = SJUartAsSingleSend(SJT_TRIG_LIMIT_VAL, iTrigLimit_Value); if ((DebugMode == 1) && (true == IsConnected())) { // CStringA Tmp; // Tmp.Format("Simul TriggerLimit Setting --> %d :rtn %x \r\n", m_iTrigLimit_Value, rtn); Put_Log(Tmp, *Connected_COM); Log.D(String.Format("Simul TriggerLimit Setting --> {0:d} :rtn {1:x}", iTrigLimit_Value, rtn)); } return rtn; } public ushort SetCntInType(uint CntInType) { ushort rtn; rtn = SJUartAsSingleSend(SJT_REF_FF_MATCHING_TYPE, (uint)CntInType); if ((DebugMode == 1) && (true == IsConnected())) { // CStringA Tmp; // Tmp.Format("Enc / Timer Setting %d : rtn %x \r\n", CntInType, rtn); Put_Log(Tmp, *Connected_COM); Log.D(String.Format("Enc / Timer Setting {0:d} : rtn {1:x}", CntInType, rtn)); } return rtn; } public ushort SetTrigMode(uint TrigGenMode, uint ChOutMode) { // GenMode, OutMode integration ushort rtn; uint temp; if ((TrigGenMode > 4) || (TrigGenMode < 0)) return ERR_VAL_TRIGGENMODE; if (((ChOutMode & 0x7f) > 3) || ((ChOutMode & 0x7f) < 0)) return ERR_VAL_TRIGOUTMODE; temp = TrigGenMode; temp |= (ChOutMode << 16) & 0xffff0000; rtn = SJUartAsSingleSend(SJT_TRIG_GEN_OUT_MODE, temp); if ((DebugMode == 1) && (true == IsConnected())) { // CStringA Tmp; // Tmp.Format("Trig Gen mode : %d / Trig Out mode : %d : rtn %x \r\n", TrigGenMode, ChOutMode, rtn); Put_Log(Tmp, *Connected_COM); Log.D(String.Format("Trig Gen mode : {0:d} / Trig Out mode : {1:d} : rtn {2:x}", TrigGenMode, ChOutMode, rtn)); } return rtn; } public ushort GetTrigMode(ref uint TrigGenMode, ref uint ChOutMode) { ushort rtn; ulong Tmp_Recv = 0; // rtn = SJUartSingleRecv(SJT_NEXT_REF_VAL, (unsigned __int64*)Next_RefCnt); rtn = SJUartSingleRecv(SJT_TRIG_GEN_OUT_MODE, ref Tmp_Recv); TrigGenMode = (uint)(Tmp_Recv & 0xffff); ChOutMode = (uint)((Tmp_Recv >> 16) & 0xffff); return rtn; } public ushort Debug_RefFF_Change() { ushort rtn = 0; rtn = SJUartAsSingleSend(SJT_REF_FF_CHANGE, (uint)0); if ((DebugMode == 1) && (true == IsConnected())) { // CStringA Tmp; // Tmp.Format("Reference Buffer Flush : rtn %x \r\n", rtn); Put_Log(Tmp, *Connected_COM); Log.D(String.Format("Reference Buffer Flush : rtn {0:x}", rtn)); } return rtn; } public ushort SJT_Trigger_Start() { ushort rtn = 0; uint gen_mode = 0, out_mode = 0; GetTrigMode(ref gen_mode, ref out_mode); if (gen_mode == 0) { } else if (gen_mode == 1) { } else if (gen_mode == 2) { rtn = SJT_Reset(false, false, true, false, false); } else if (gen_mode == 3) { // rtn = SJT_Reset(false, false, true, false, false); rtn = RunTrigTimerMode(); } else if (gen_mode == 4) { } rtn = SJUartSingleSend(SJT_MB_START, (uint)1); if ((DebugMode == 1) && (true == IsConnected())) { // CStringA Tmp; // __int64 m_64iEncWhenStart; // Tmp.Format("Trig Start : rtn %x \r\n", rtn); // rtn = SJUartSingleRecv(SJT_ENC_WHEN_START, (unsigned __int64*)&m_64iEncWhenStart); // Put_Log(Tmp, *Connected_COM); // // if (((m_64iEncWhenStart >> 44) & 0x1)) m_64iEncWhenStart = ((unsigned __int64)0x7ffff << 45) + (m_64iEncWhenStart & 0x1fffffffffff); // else m_64iEncWhenStart = (m_64iEncWhenStart & 0x1fffffffffff); // Tmp.Format("Encoder When Start : %I64d : rtn %x \r\n", m_64iEncWhenStart, rtn); Put_Log(Tmp, *Connected_COM); string temp; long m_64iEncWhenStart = 0; Log.D(String.Format("Trig Start : rtn {0:x}", rtn)); rtn = SJUartSingleRecv(SJT_ENC_WHEN_START, ref m_64iEncWhenStart); if (((m_64iEncWhenStart >> 44) & 0x1) == 0x1) m_64iEncWhenStart = ((long)0x7ffff << 45) + (m_64iEncWhenStart & 0x1fffffffffff); else m_64iEncWhenStart = (m_64iEncWhenStart & 0x1fffffffffff); Log.D(String.Format("Encoder When Start : {0:d} : rtn {1:x}", m_64iEncWhenStart, rtn)); } return rtn; } public ushort SJT_Trigger_Stop() { ushort rtn = 0; uint[] Trig_Count = new uint[17]; //0 -> Total Matched count, 1~8 -> Each Channel Trig Out Count uint[] Error_Count = new uint[16]; float[] MaxFreq = new float[16]; rtn = SJUartSingleSend(SJT_MB_START, Convert.ToUInt32(0)); if (0 == rtn) { // GetTrigNErrCnt(&Trig_Count[0], &Error_Count[0]); GetTrigNErrCnt(Trig_Count, Error_Count, MaxFreq); uint err_cnt = 0; err_cnt = Error_Count[0] + Error_Count[1] + Error_Count[2] + Error_Count[3] + Error_Count[4] + Error_Count[5] + Error_Count[6] + Error_Count[7] + Error_Count[8] + Error_Count[9] + Error_Count[10] + Error_Count[11] + Error_Count[12] + Error_Count[13] + Error_Count[14] + Error_Count[15]; if (0 != err_cnt) rtn = ERR_TRIG_ERR_OCCURED; else rtn = OK_RETURN; } // if ((DebugMode == 1) && (NULL != Connected_COM)) // { // // CStringA Tmp; // // INT16U rtn1 = 0; // // __int64 m_64iEncWhenStop; // // Tmp.Format("Trig Stop : rtn %x \r\n", rtn); // // rtn1 = SJUartSingleRecv(SJT_ENC_WHEN_STOP, (unsigned __int64*)&m_64iEncWhenStop); // // if (((m_64iEncWhenStop >> 44) & 0x1)) m_64iEncWhenStop = ((unsigned __int64)0x7ffff << 45) + (m_64iEncWhenStop & 0x1fffffffffff); // // else m_64iEncWhenStop = (m_64iEncWhenStop & 0x1fffffffffff); // // Put_Log(Tmp, *Connected_COM); // // Tmp.Format("Encoder When Stop : %I64d : rtn %x \r\n", m_64iEncWhenStop, rtn1); Put_Log(Tmp, *Connected_COM); // string temp; // INT16U rtn1 = 0; // __int64 m_64iEncWhenStop; // temp = formatA("Trig Stop : rtn %x \r\n", rtn); // rtn1 = SJUartSingleRecv(SJT_ENC_WHEN_STOP, (unsigned __int64 *) & m_64iEncWhenStop); // if (((m_64iEncWhenStop >> 44) & 0x1)) m_64iEncWhenStop = ((unsigned __int64)0x7ffff << 45) +(m_64iEncWhenStop & 0x1fffffffffff); //else m_64iEncWhenStop = (m_64iEncWhenStop & 0x1fffffffffff); // Put_Log(temp, *Connected_COM); // temp = formatA("Encoder When Stop : %I64d : rtn %x \r\n", m_64iEncWhenStop, rtn1); Put_Log(temp, *Connected_COM); // } if ((DebugMode == 1) && (true == IsConnected())) { string temp; ushort rtn1 = 0; long m_64iEncWhenStop = 0; rtn1 = SJUartSingleRecv(SJT_ENC_WHEN_STOP, ref m_64iEncWhenStop); if (((m_64iEncWhenStop >> 44) & 0x1) == 1) m_64iEncWhenStop = ((long)0x7ffff << 45) + (m_64iEncWhenStop & 0x1fffffffffff); else m_64iEncWhenStop = (m_64iEncWhenStop & 0x1fffffffffff); Log.D(String.Format("Trig Stop : rtn {0:x}", rtn)); Log.D(String.Format("Encoder When Stop : {0:d} : rtn {1:x}", m_64iEncWhenStop, rtn1)); } return rtn; } public ushort SetStrobe(byte Strobe_Ch, uint Mask, ref double[] StrobeData_us_pt) { ushort rtn = 0; uint[] StrobeSet = new uint[17]; StrobeSet[0] = Mask; for (int i = 0; i < 16; i++) { if (StrobeData_us_pt[i] < 0) return ERR_VAL_STROBE_NUM; if ((uint)StrobeData_us_pt[i] > UInt32.MaxValue) return ERR_VAL_STROBE_NUM; StrobeSet[i + 1] = (uint)((StrobeData_us_pt[i] + 0.005) * 100); } rtn = SetStrobe(Strobe_Ch, ref StrobeSet); return rtn; } public ushort SetStrobe(byte StrobeCh, ref uint[] StrobeData_pt) { ushort rtn = 0; int addr; byte Data_Num; byte Trig_OutMode; uint Tmp_Recv = 0; // CStringA Tmp; string temp; if ((StrobeCh > Max_OutCh - 1) || (0 > StrobeCh)) { return ERR_VAL_CHANNEL_NUM; } // rtn = SJUartSingleRecv(SJT_NEXT_REF_VAL, (unsigned __int64*)Next_RefCnt); rtn = SJUartSingleRecv(SJT_TRIG_GEN_OUT_MODE, ref Tmp_Recv); Trig_OutMode = (byte)((Tmp_Recv >> 16) & 0x7f); if (Trig_OutMode == (byte)ChannelOutMode.SeqBy1Trig) { addr = SJT_STROBESET + (StrobeCh * 17); Data_Num = 17; rtn = SJUartBurstSend(addr, ref StrobeData_pt, Data_Num, 0); if ((DebugMode == 1) && (true == IsConnected())) { Log.D(String.Format("Trigger OutMode {0:d}, Ch {1:d} Width & Delay Setting : Mask 0x{2:x2}, DataNum {3:d}, Addr 0x{4:x} : rtn {5:x}", Trig_OutMode, StrobeCh, StrobeData_pt[0], Data_Num, addr, rtn)); //Put_DataLog(temp, (int*)&StrobeData_pt[1], Data_Num - 1, DATA_WR_TYPE_DEC_WRITE, *Connected_COM); } } else if (Trig_OutMode == (byte)ChannelOutMode.DirectMask) { addr = SJT_STROBESET + (StrobeCh * 17) + 1; Data_Num = 2; uint[] tempdata = StrobeData_pt.Skip(1).ToArray(); rtn = SJUartBurstSend(addr, ref tempdata, Data_Num, 0); if ((DebugMode == 1) && (true == IsConnected())) { Log.D(String.Format("Trigger OutMode {0:d}, Ch {1:d} Width & Delay Setting : NoMask, Width {2:d20}, delay {3:d20} / Addr 0x{4:x} : rtn {5:x}", Trig_OutMode, StrobeCh, StrobeData_pt[1], StrobeData_pt[2], addr, rtn)); } } else if (Trig_OutMode == (byte)ChannelOutMode.SequenceMask) { addr = SJT_STROBESET + (StrobeCh * 17) + 1; Data_Num = 16; uint[] tempdata = StrobeData_pt.Skip(1).ToArray(); rtn = SJUartBurstSend(addr, ref tempdata, Data_Num, 0); if ((DebugMode == 1) && (true == IsConnected())) { Log.D(String.Format("Trigger OutMode {0:d}, Ch {1:d} Width & Delay Setting : DataNum {2:d}, Addr 0x{3:x} : rtn {4:x}", Trig_OutMode, StrobeCh, Data_Num, addr, rtn)); //Put_DataLog(temp, (int*)&StrobeData_pt[1], Data_Num - 1, DATA_WR_TYPE_DEC_WRITE, *Connected_COM); } } else if (Trig_OutMode == (byte)ChannelOutMode.Simple) { addr = SJT_STROBESET + (StrobeCh * 17); Data_Num = 3; rtn = SJUartBurstSend(addr, ref StrobeData_pt, Data_Num, 0); if ((DebugMode == 1) && (true == IsConnected())) { Log.D(String.Format("Trigger OutMode {0:d}, Ch {1:d} Width & Delay Setting : Mask 0x{2:x2}, Width {3:d20}, Delay {4:d20} / Addr 0x{5:x} : rtn {6:x}", Trig_OutMode, StrobeCh, StrobeData_pt[0], StrobeData_pt[1], StrobeData_pt[2], addr, rtn)); } } return rtn; } public ushort GetStrobe(byte StrobeCh, ref uint[] StrobeData_pt) { // added by SJ 171123 ushort rtn = 0; int addr; byte Data_Num; if ((StrobeCh > Max_OutCh - 1) || (0 > StrobeCh)) { return ERR_VAL_CHANNEL_NUM; } addr = SJT_STROBESET + (StrobeCh * 17); Data_Num = 17; rtn = SJUartBurstRecv(addr, ref StrobeData_pt, Data_Num); return rtn; } public ushort GetTrigTimeFreq(out uint TrigTimeFreq_10ns) { ushort rtn; uint Tmp_Recv = 0; // rtn = SJUartSingleRecv(SJT_NEXT_REF_VAL, (unsigned __int64*)Next_RefCnt); rtn = SJUartAsSingleRecv(SJT_TRIG_TIMER_FREQ, ref Tmp_Recv); TrigTimeFreq_10ns = Tmp_Recv; return rtn; } public ushort GetTrigTimeLimit(out uint TrigTimeLimit) { ushort rtn; uint Tmp_Recv = 0; // rtn = SJUartSingleRecv(SJT_NEXT_REF_VAL, (unsigned __int64*)Next_RefCnt); rtn = SJUartAsSingleRecv(SJT_TRIG_LIMIT_VAL, ref Tmp_Recv); TrigTimeLimit = Tmp_Recv; return rtn; } public ushort GetEncPosMapTableUse(out EncoderPositionMap encposmapuse) { //position mapping not use check uint RcvTmp = 0; encposmapuse = EncoderPositionMap.Normal; ushort rtn = SJUartRawSingleRecv(SJT_POSENCTABLE_OFF, ref RcvTmp); if (rtn != OK_RETURN) return ERR_NOT_DEVELOPED_YET; encposmapuse = RcvTmp > 1 ? EncoderPositionMap.CustomTable : EncoderPositionMap.Normal; //if (0 == RcvTmp) { // Log.E($"GenMode 0(FPGA Calc) Fail for using Enc/Pos Err map"); // return ERR_NORESPONSE; //} return rtn; } public ushort GetCntInType(out uint CntInType) { ushort rtn; uint RcvTmp = 0; CntInType = 0; rtn = SJUartAsSingleRecv(SJT_REF_FF_MATCHING_TYPE, ref RcvTmp); if (rtn != OK_RETURN) return ERR_NOT_DEVELOPED_YET; CntInType = RcvTmp; //if (0 == RcvTmp) { // Log.E($"GenMode 0(FPGA Calc) Fail for using Enc/Pos Err map"); // return ERR_NORESPONSE; //} return rtn; } public ushort SetTriggerStartdelay(uint startDelay) { return ERR_NOT_DEVELOPED_YET; } public ushort GetTriggerStartdelay(ref uint startDelay) { return ERR_NOT_DEVELOPED_YET; } public ushort SetTriggerWidth(uint triggerWidth) { return ERR_NOT_DEVELOPED_YET; } public ushort GetTriggerWidth(ref uint triggerWidth) { return ERR_NOT_DEVELOPED_YET; } public ushort SetTriggerCnt(uint triggerCnt) { return ERR_NOT_DEVELOPED_YET; } public ushort GetTriggerCnt(ref uint triggerCnt) { return ERR_NOT_DEVELOPED_YET; } public ushort SetEncEnable(byte encEnable) { return ERR_NOT_DEVELOPED_YET; } public ushort GetEncEnable(ref byte encEnable) { return ERR_NOT_DEVELOPED_YET; } public ushort SetRunMode(byte runMode) { return ERR_NOT_DEVELOPED_YET; } public ushort GetRunMode(ref byte runMode) { return ERR_NOT_DEVELOPED_YET; } public ushort SetInputPol(byte inputPol) { return ERR_NOT_DEVELOPED_YET; } public ushort GetInputPol(ref byte inputPol) { return ERR_NOT_DEVELOPED_YET; } public ushort SetTriggerPol(byte triggerPol) { return ERR_NOT_DEVELOPED_YET; } public ushort GetTriggerPol(ref byte triggerPol) { return ERR_NOT_DEVELOPED_YET; } public ushort SetStrobeStartdelay(uint startDelay) { return ERR_NOT_DEVELOPED_YET; } public ushort GetStrobeStartdelay(ref uint startDelay) { return ERR_NOT_DEVELOPED_YET; } public ushort SetStrobeWidth(uint strobeWidth) { return ERR_NOT_DEVELOPED_YET; } public ushort GetStrobeWidth(ref uint strobeWidth) { return ERR_NOT_DEVELOPED_YET; } public ushort SetStrobePol(byte strobePol) { return ERR_NOT_DEVELOPED_YET; } public ushort GetStrobePol(ref byte strobePol) { return ERR_NOT_DEVELOPED_YET; } public ushort GetEndTrigger(ref byte endTrigger) { return ERR_NOT_DEVELOPED_YET; } public ushort GetError(ref byte errorCode) { return ERR_NOT_DEVELOPED_YET; } } }