public static EsysHandheld DeepClone(EsysHandheld EsysHandheldToClone) { EsysHandheld ClonedEsysHandheld = new EsysHandheld(); ClonedEsysHandheld.VIN = EsysHandheldToClone.VIN; //Need to clone over the stem type too!!! ClonedEsysHandheld.StemType = EsysHandheldToClone.StemType; foreach (KeyValuePair<Axle,TPM> kvp in EsysHandheldToClone.TPMInfo) { ClonedEsysHandheld.TPMInfo.Add(kvp.Key,new TPM(kvp.Value.axelLoc,kvp.Value.StemID,kvp.Value.PSI,kvp.Value.StemType)); } return ClonedEsysHandheld; }
public TPMDataReceivedEventArgs(EsysHandheld _TPMData) { TPMData = _TPMData; }
private void preInit() { BufferSize = 1024; //gives the connection thread the OK to connect mblnOKToConnect = true; mCurrentHandheldData = null; mLockCurrentHandheldData = new object(); }
private void CheckConnectionThread() { bool lastConnectState = false; DateTime lastConnectionTry; DateTime.TryParse("1/1/2000", out lastConnectionTry); while (mConnectionThreadActive) { try { //Raise connected event if connected state changed. Need to check before and after the connection section to make sure event gets raised. if (lastConnectState != Connected) { lastConnectState = Connected; DateTime.TryParse("1/1/2000", out mLastResponse); DateTime.TryParse("1/1/2000", out mLastMsgSent); if (lastConnectState == true) { mLastResponse = DateTime.Now; lastConnectionTry = DateTime.Now; if (StateChanged != null) StateChanged(this, new StateChangeEventArgs(StateChange.Connected, "Connected")); } else { if (StateChanged != null) StateChanged(this, new StateChangeEventArgs(StateChange.Disconnected, "Disconnected")); } } TimeSpan ts_LastConnectionTry = DateTime.Now - lastConnectionTry; TimeSpan ts_LastResponse = DateTime.Now - mLastResponse; if (!Connected && mblnOKToConnect) { if (ts_LastConnectionTry.TotalMilliseconds > miConnect * 1000) { if (StateChanged != null) StateChanged(this, new StateChangeEventArgs(StateChange.TryingToConnect, "Trying to connect...")); base.Connect(); lastConnectionTry = DateTime.Now; } } else if (mblnOKToConnect == false) { if (StateChanged != null) StateChanged(this, new StateChangeEventArgs(StateChange.Disconnecting, "Disconnecting...")); base.Disconnect(); lock (mLockCurrentHandheldData) { mCurrentHandheldData = null; } } if (mCurrentHandheldData != null && ts_LastResponse.TotalMilliseconds > 5000) { //Give up on the current message and reset lock (mLockCurrentHandheldData) { mCurrentHandheldData = null; // this was causing bum errors. //if (StateChanged != null) StateChanged(this, new StateChangeEventArgs(StateChange.ErrorHappened, "Error Finishing Upload")); } } //Raise connected event if connected state changed. Need to check before and after the connection section to make sure event gets raised. if (lastConnectState != Connected) { lastConnectState = Connected; DateTime.TryParse("1/1/2000", out mLastMsgSent); DateTime.TryParse("1/1/2000", out mLastResponse); if (lastConnectState == true) { mLastResponse = DateTime.Now; lastConnectionTry = DateTime.Now; if (StateChanged != null) StateChanged(this, new StateChangeEventArgs(StateChange.Connected, "Connected")); } else { if (StateChanged != null) StateChanged(this, new StateChangeEventArgs(StateChange.Disconnected, "Disconnected")); } } Thread.Sleep(1000); } catch (Exception ex) { if (mConnectionThreadActive == true) if (StateChanged != null) StateChanged(this, new StateChangeEventArgs(StateChange.ErrorHappened, ex.ToString())); } } }
/// <summary> /// This routine parses out the TPM stem info and then raises the TPMDataRecevied event when all TPM stem info is received. /// The ATop has to be configured to send out data in entire streams, instead of one character at a time. /// This routine does not buffer the data. /// </summary> /// <param name="e"></param> protected override void OnDataReceived(DataReceivedEventArgs e) { //base.OnSocketDataReceived(socket, e); try { mLastResponse = DateTime.Now; bool InvalidCharacters = false; byte[] data = e.Data; if (e.Data.Length < 2) return; StringBuilder FromHandheld = new StringBuilder(""); for (int i = 0; i < data.Length; i++) { FromHandheld.Append((char)data[i]); if (data[i] > 122) InvalidCharacters = true; } mTPMLog.Write("RECEIVED: " + FromHandheld.ToString()); mMessgaeCount++; if (OKToReceiveData == false) { mTPMLog.Write("Not OK to Recevie Data. Ignoring Message"); if (StateChanged != null) StateChanged(this, new StateChangeEventArgs(StateChange.ErrorHappened, "Handheld will not upload until current vehicle is finished.")); return; } //uncomment out the next two lines to debug the handheld data input. //if (StateChanged != null) StateChanged(this, new StateChangeEventArgs(StateChange.ErrorHappened,"TPM DATA: " + mMessgaeCount + " - ("+ FromHandheld.ToString() + ")")); //return; Message_Upload message; bool Success = Message_Upload.TryParse(data, out message); if (InvalidCharacters == true){ mTPMLog.Write("Invalid characters from handheld - " + message.ParseErrorMsg); //if (MessageReceived != null) MessageReceived(this, new MessageReceivedEventArgs(message)); //if (StateChanged != null) StateChanged(this, new StateChangeEventArgs(StateChange.ErrorHappened, "Could not parse message from TPM handheld.")); }else if (Success == false) { mTPMLog.Write("Error parsing previous Message - " + message.ParseErrorMsg); if (MessageReceived != null) MessageReceived(this, new MessageReceivedEventArgs(message)); if (StateChanged != null) StateChanged(this, new StateChangeEventArgs(StateChange.ErrorHappened, "Could not parse message from TPM handheld.")); } else { if (message.MessageType == TPM_Message_Type.RecordCompleteMessage) { OKToReceiveData = false; //Only process one vehcile at a time. Must be set manually to allow for controlling class to do what it needs to do. //Send an ACK to the handheld mTPMLog.Write("Sending ACK for record complete"); Send(RecordCompleteACK); if (mCurrentHandheldData != null) { //Raise the TPMDataReceved event EsysHandheld EsysHandheldClone = EsysHandheld.DeepClone(mCurrentHandheldData); if (TPMDataReceived != null) TPMDataReceived(this, new TPMDataReceivedEventArgs(EsysHandheldClone)); } lock (mLockCurrentHandheldData) { mCurrentHandheldData = null; } if (StateChanged != null) StateChanged(this, new StateChangeEventArgs(StateChange.Connected, "Finished uploading data.")); } else if (message.MessageType == TPM_Message_Type.DataMessage) { //If this is the first message in the string of messages if (mCurrentHandheldData == null) { mTPMLog.Write("Parsing first data message"); lock (mLockCurrentHandheldData) { mCurrentHandheldData = new EsysHandheld(); mCurrentHandheldData.VIN = message.VIN; mCurrentHandheldData.StemType = message.StemType; mCurrentHandheldData.TPMInfo.Add(message.axelLoc, new TPM(message.axelLoc, message.StemID, message.PSI, message.StemType)); } if (StateChanged != null) StateChanged(this, new StateChangeEventArgs(StateChange.Connected, "Uploading " + message.axelLoc.ToString())); //Send an ACK to the handheld Send(RecordCompleteACK); mTPMLog.Write("Sending ACK for first data message"); } else if (mCurrentHandheldData != null) { //The first 3 or 4 characters get trashed on the next message //if (message.VIN.Length > 4 ) message.VIN = message.VIN.Substring(4); if (mCurrentHandheldData.TPMInfo.ContainsKey(message.axelLoc) == false) { //double check to make sure the vin is the correct vin if (mCurrentHandheldData.VIN.Contains(message.VIN)) { lock (mLockCurrentHandheldData) { mCurrentHandheldData.TPMInfo.Add(message.axelLoc, new TPM(message.axelLoc, message.StemID, message.PSI, message.StemType)); } //Send an ACK to the handheld Send(RecordCompleteACK); mTPMLog.Write("Sending ACK for data message"); } else{ mTPMLog.Write("VIN (" + message.VIN + ") does not match original VIN (" + mCurrentHandheldData.VIN + ")"); } } else { mTPMLog.Write("Already have this axelLoc (" + message.axelLoc.ToString() + ") stored. Ignoring it."); //Send an ACK to the handheld Send(RecordCompleteACK); mTPMLog.Write("Sending ACK for data message"); } } } else if (message.MessageType == TPM_Message_Type.Error) { mTPMLog.Write("Error parsing previous Message! - " + message.ParseErrorMsg); //if (MessageReceived != null) MessageReceived(this, new MessageReceivedEventArgs(message)); //if (StateChanged != null) StateChanged(this, new StateChangeEventArgs(StateChange.ErrorHappened, "Could not parse message from TPM Handheld.")); } } if (MessageReceived != null) MessageReceived(this, new MessageReceivedEventArgs(message)); } catch (Exception ex) { if (StateChanged != null) StateChanged(this, new StateChangeEventArgs(StateChange.ErrorHappened, ex.ToString())); } }
public void SimulateTPMDataReceived() { if (OKToReceiveData == true) { EsysHandheld h = new EsysHandheld(); mSimulatedVIN++; h.VIN = mSimulatedVIN.ToString(); //h.VIN = "******************"; h.TPMInfo.Add(Axle.FL, new TPM(Axle.FL, (mSimulatedTPM1SN++).ToString(), "139", TypeOfStem.Continental)); h.TPMInfo.Add(Axle.RL, new TPM(Axle.RL, (mSimulatedTPM2SN++).ToString(), "239", TypeOfStem.Continental)); h.TPMInfo.Add(Axle.FR, new TPM(Axle.FR, (mSimulatedTPM3SN++).ToString(), "339", TypeOfStem.Continental)); h.TPMInfo.Add(Axle.RR, new TPM(Axle.RR, (mSimulatedTPM4SN++).ToString(), "439", TypeOfStem.Continental)); if (TPMDataReceived != null) TPMDataReceived(null, new TPMDataReceivedEventArgs(h)); } }