void NSend(N_Message nmsg) { CAN_Message msg = new CAN_Message(); msg.Ext = false; if (nmsg.State == N_State.TX_SEND) { msg.id = (uint)(0x600 + nmsg.TA); msg.data[0] = (byte)nmsg.MsgType; msg.data[1] = (byte)nmsg.Index; msg.data[2] = (byte)(nmsg.Index >> 8); msg.data[3] = (byte)nmsg.MsgNum; msg.data[4] = (byte)nmsg.data[((nmsg.MsgNum + 1) * 4) - 4]; msg.data[5] = (byte)(nmsg.data[((nmsg.MsgNum + 1) * 4) - 3]); msg.data[6] = (byte)(nmsg.data[((nmsg.MsgNum + 1) * 4) - 2]); msg.data[7] = (byte)(nmsg.data[((nmsg.MsgNum + 1) * 4) - 1]); can.SendMessage(msg); nmsg.State = N_State.IDLE; rxTimer.Start(); } else if (nmsg.State == N_State.IDLE) { } }
void ProcessMessage(CAN_Message msg) { lock (locker) { if ((msg.id == (0x580 + nmsg.TA))) { rxTimer.Stop(); RequestCnt = 0; nmsg.MsgType = (N_Types)(msg.data[0] & 0x0F); nmsg.Result = (N_Res)((msg.data[0] >> 4) & 0x0F); nmsg.MsgNum = msg.data[3]; nmsg.Index = (ushort)((((msg.data[2]) << 8) + msg.data[1])); switch (nmsg.MsgType) { case N_Types.ecan_profile_fun_write: if (nmsg.Result == N_Res.OK_UPDATE_PROFILE) { nmsg.MsgNum++; nmsg.State = N_State.TX_SEND; } else if (nmsg.Result == N_Res.UPDATE_PROFILE_FINISIHED) { nmsg.MsgNum = 0; nmsg.State = N_State.IDLE; OnTxComplete?.Invoke(nmsg); } else if (nmsg.Result == N_Res.SERIES_ERROR) { nmsg.MsgNum = 0; nmsg.State = N_State.IDLE; OnTxError?.Invoke(nmsg); } else if (nmsg.Result == N_Res.CRC_MISTMATCH_ERROR) { nmsg.MsgNum = 0; nmsg.State = N_State.IDLE; OnTxError?.Invoke(nmsg); } NSend(nmsg); break; case N_Types.ecan_profile_fun_read: if (nmsg.Result == N_Res.OK_UPDATE_PROFILE) { nmsg.data[((nmsg.MsgNum + 1) * 4) - 1] = msg.data[7]; nmsg.data[((nmsg.MsgNum + 1) * 4) - 2] = msg.data[6]; nmsg.data[((nmsg.MsgNum + 1) * 4) - 3] = msg.data[5]; nmsg.data[((nmsg.MsgNum + 1) * 4) - 4] = msg.data[4]; nmsg.MsgNum++; nmsg.State = N_State.TX_SEND; NSend(nmsg); } else if (nmsg.Result == N_Res.END_OF_COMMUNICATION) { nmsg.MsgNum = 0; nmsg.State = N_State.IDLE; OnRxComplete?.Invoke(nmsg); } else if (nmsg.Result == N_Res.SERIES_ERROR) { nmsg.MsgNum = 0; nmsg.State = N_State.IDLE; } else if (nmsg.Result == N_Res.CRC_MISTMATCH_ERROR) { nmsg.MsgNum = 0; nmsg.State = N_State.IDLE; } break; case N_Types.ecan_diag_value_read: if (nmsg.Result == N_Res.OK_UPDATE_PROFILE) { nmsg.data[((nmsg.MsgNum + 1) * 4) - 1] = msg.data[7]; nmsg.data[((nmsg.MsgNum + 1) * 4) - 2] = msg.data[6]; nmsg.data[((nmsg.MsgNum + 1) * 4) - 3] = msg.data[5]; nmsg.data[((nmsg.MsgNum + 1) * 4) - 4] = msg.data[4]; nmsg.MsgNum++; nmsg.State = N_State.TX_SEND; } else if (nmsg.Result == N_Res.END_OF_COMMUNICATION) { //nmsg.MsgNum = 0; nmsg.State = N_State.IDLE; OnRxComplete?.Invoke(nmsg); } else if (nmsg.Result == N_Res.SERIES_ERROR) { nmsg.State = N_State.TX_SEND; } else if (nmsg.Result == N_Res.CRC_MISTMATCH_ERROR) { int a = 5; } NSend(nmsg); //if (nmsg.Result == N_Res.END_OF_COMMUNICATION) //{ // nmsg.data[1] = msg.data[5]; // nmsg.data[0] = msg.data[4]; // nmsg.State = N_State.IDLE; // OnRxComplete?.Invoke(nmsg); //} break; } } else if ((msg.id & ~0x7F) == 0x700) { uint id = msg.id & 0x7F; if (lstIDs.ContainsKey(id)) { lstIDs[id] = Convert.ToInt32(DateTime.Now.TimeOfDay.TotalSeconds); } else { lstIDs.Add(id, Convert.ToInt32(DateTime.Now.TimeOfDay.TotalSeconds)); } uint old_key = UInt32.MaxValue; foreach (var item in lstIDs) { old_key = (Convert.ToInt32(DateTime.Now.TimeOfDay.TotalSeconds) - item.Value > 5) ? item.Key : old_key; } if (old_key < Byte.MaxValue) { lstIDs.Remove(old_key); } //if (OnRxIDsComplete != null) //{ // N_Message loc_msg = new N_Message(); // loc_msg.Result = N_Res.OK_UPDATE_PROFILE; // loc_msg.TA = (byte)(msg.id & 0x7F); // OnRxIDsComplete?.Invoke(loc_msg); //} } } }