void SendCAN(uint ID, byte[] Data) { CANMessage message = new CANMessage(ID, false, Data); CANMessage[] messages = { message }; CANDevice.Send(CANPortIndex, messages); lastSendTime = DateTime.Now; if (IsShowSendRecive) { WriteLine("Send:" + message.ToString()); } }
//Executor Process Message public void Executor(CANMessage CANMessage) { lock (this) { if (!IsRunning) { return; } if (CANMessage.ExternFlag) { return; } Job j = JobRunning; //ACK if (j.Type == Job.JobType.ACK) { if (_StepRunning == 1) { if (CheckCANMessage(CANMessage, ID_ACK, DA_ACK)) { RunningNext(); } else if (CheckCANMessage(CANMessage, ID_ACK, DA_NACK)) { RunningNext(); } else { ErrorWriteLine("Unknow Message:" + CANMessage.ToString()); } } } //READ else if (j.Type == Job.JobType.Read) { if (CheckCANMessage(CANMessage, ID_READ, DA_NACK)) { RunningNext(JobEventType.NACK, "NACK"); } int m = (int)Math.Ceiling(j.DataNum / 8f); if (_StepRunning == 1)//ACK { if (CheckCANMessage(CANMessage, ID_READ, DA_ACK)) { _StepRunning++; } else { ErrorWriteLine("Unknow Message:" + CANMessage.ToString()); } } else if (_StepRunning >= 2 && _StepRunning <= m + 1)//DATA { if (CheckCANMessage(CANMessage, ID_READ) && CANMessage.DataLen > 0) { if (_StepRunning == 2) { j.DataReceive = new byte[j.DataNum]; } Array.Copy(CANMessage.Data, 0, j.DataReceive, (_StepRunning - 2) * CANMessage.DataLenMax, CANMessage.DataLen); _StepRunning++; } else { ErrorWriteLine("Unknow Message:" + CANMessage.ToString()); } } else if (_StepRunning == m + 2)//ACK { if (CheckCANMessage(CANMessage, ID_READ, DA_ACK)) { RunningNext(); } else { ErrorWriteLine("Unknow Message:" + CANMessage.ToString()); } } else { TimeoutCheck(); } } //WRITE else if (j.Type == Job.JobType.Write) { if (CheckCANMessage(CANMessage, ID_WRITE, DA_NACK)) { RunningNext(JobEventType.NACK, "NACK"); } int m = (int)Math.Ceiling(j.DataSend.Length / 8f); if (_StepRunning == 2 * m + 2) { if (CheckCANMessage(CANMessage, ID_WRITE, DA_ACK)) { RunningNext(); } else { ErrorWriteLine("Unknow Message:" + CANMessage.ToString()); } } else if (_StepRunning % 2 == 1 && _StepRunning <= 2 * m + 1) { if (CheckCANMessage(CANMessage, ID_WRITE, DA_ACK)) { _StepRunning++; } else { ErrorWriteLine("Unknow Message:" + CANMessage.ToString()); } } } //ERASE else if (j.Type == Job.JobType.Erase) { if (CheckCANMessage(CANMessage, ID_ERASE, DA_NACK)) { RunningNext(JobEventType.NACK, "NACK"); } if (_StepRunning == 1 || _StepRunning == 3) { if (CheckCANMessage(CANMessage, ID_ERASE, DA_ACK)) { _StepRunning++; } else { ErrorWriteLine("Unknow Message:" + CANMessage.ToString()); } } else if (_StepRunning == 4) { if (CheckCANMessage(CANMessage, ID_ERASE, DA_ACK)) { RunningNext(); } else { ErrorWriteLine("Unknow Message:" + CANMessage.ToString()); } } } //GV else if (j.Type == Job.JobType.GetState) { if (CheckCANMessage(CANMessage, ID_GV, DA_NACK)) { RunningNext(JobEventType.NACK, "NACK"); } if (_StepRunning == 1) { if (CheckCANMessage(CANMessage, ID_GV, DA_ACK)) { _StepRunning++; } else { ErrorWriteLine("Unknow Message:" + CANMessage.ToString()); } } else if (_StepRunning == 2) { if (CheckCANMessage(CANMessage, ID_GV, 1)) { j.DataReceive = new byte[3]; j.DataReceive[0] = CANMessage.Data[0]; _StepRunning++; } else { ErrorWriteLine("Unknow Message:" + CANMessage.ToString()); } } else if (_StepRunning == 3) { if (CheckCANMessage(CANMessage, ID_GV, 2)) { j.DataReceive[1] = CANMessage.Data[0]; j.DataReceive[2] = CANMessage.Data[1]; _StepRunning++; } else { ErrorWriteLine("Unknow Message:" + CANMessage.ToString()); } } else if (_StepRunning == 4) { if (CheckCANMessage(CANMessage, ID_GV, DA_ACK)) { RunningNext(); } else { ErrorWriteLine("Unknow Message:" + CANMessage.ToString()); } } } //GO else if (j.Type == Job.JobType.Go) { if (CheckCANMessage(CANMessage, ID_GO, DA_NACK)) { RunningNext(JobEventType.NACK, "NACK"); } if (_StepRunning == 1) { if (CheckCANMessage(CANMessage, ID_GO, DA_ACK)) { RunningNext(); } else { ErrorWriteLine("Unknow Message:" + CANMessage.ToString()); } } } else { ErrorWriteLine("Unsupport Job:" + j.Type.ToString()); } } }