using System; using Microsoft.SPOT; using Microsoft.SPOT.Hardware; using GHI.Premium.System; using UTILS; namespace LOGGER { [Serializable] public class LogEntry : ICloneable { public enum LogEntryType { EventType, CommentType, TBA }; private enum _members { TimeStamp, MessageType, Comment, Y1, Y2, Pid_I, V_SetPoint, P_SetPoint, Current_P, Previous_P, Platform_V, Unclipped_PID, Clipped_PID, Elmo_CPS, Bellows_MM }; private DateTime _timeStamp; private BitArray _fieldValid; private double _y1; private double _y2; private double _pid_I; private double _velocitySetpoint; private double _pressureSetpoint; private double _currentPressure; private double _previousPressure; private double _platformVelocity; private double _unclipped_PID_Output_V; private double _clipped_PID_Output_U; private double _elmoSpeed_CPS; private double _bellowsPosition; private LogEntryType _logEntryType; private byte[] _comment; private static StringBuilder _sb; public LogEntry() { _fieldValid = new BitArray(); _comment = new byte[152]; _sb = new StringBuilder(256); Init(); } public void Init() { _fieldValid.ClearAll(); _timeStamp = DateTime.Now; _fieldValid.Set((int) _members.TimeStamp); _y1 = Double.NaN; _y2 = Double.NaN; _pid_I = Double.NaN; _velocitySetpoint = Double.NaN; _pressureSetpoint = Double.NaN; _currentPressure = Double.NaN; _previousPressure = Double.NaN; _platformVelocity = Double.NaN; _unclipped_PID_Output_V = Double.NaN; _clipped_PID_Output_U = Double.NaN; _elmoSpeed_CPS = Double.NaN; _bellowsPosition = Double.NaN; } public object Clone() { return this.MemberwiseClone(); } public void Serialize(ref byte[] data) { BitDiddle.InsertValueIntoArray(data, 0, _timeStamp); BitDiddle.InsertValueIntoArray(data, 8, (int) _logEntryType); BitDiddle.InsertValueIntoArray(data, 12, _fieldValid.Serialize()); BitDiddle.InsertValueIntoArray(data, 16, _y1); BitDiddle.InsertValueIntoArray(data, 24, _y2); BitDiddle.InsertValueIntoArray(data, 32, _pid_I); BitDiddle.InsertValueIntoArray(data, 40, _velocitySetpoint); BitDiddle.InsertValueIntoArray(data, 48, _pressureSetpoint); BitDiddle.InsertValueIntoArray(data, 56, _currentPressure); BitDiddle.InsertValueIntoArray(data, 64, _previousPressure); BitDiddle.InsertValueIntoArray(data, 72, _platformVelocity); BitDiddle.InsertValueIntoArray(data, 80, _unclipped_PID_Output_V); BitDiddle.InsertValueIntoArray(data, 88, _clipped_PID_Output_U); BitDiddle.InsertValueIntoArray(data, 96, _elmoSpeed_CPS); BitDiddle.InsertValueIntoArray(data, 104, _bellowsPosition); for (int i = 0; i < _comment.Length; i++) data[i + 112] = _comment[i]; } public void Deserialize(ref LogEntry e, byte[] data) { e._timeStamp = BitDiddle.ToDateTime(data, 0); e._logEntryType = (LogEntryType) Utility.ExtractValueFromArray(data, 8, 4); e._fieldValid.DeSerialize(Utility.ExtractValueFromArray(data, 12, 4)); ; e._y1 = BitDiddle.ToDouble(data, 16); e._y2 = BitDiddle.ToDouble(data, 24); e._pid_I = BitDiddle.ToDouble(data, 32); e._velocitySetpoint = BitDiddle.ToDouble(data, 40); e._pressureSetpoint = BitDiddle.ToDouble(data, 48); e._currentPressure = BitDiddle.ToDouble(data, 56); e._previousPressure = BitDiddle.ToDouble(data, 64); e._platformVelocity = BitDiddle.ToDouble(data, 72); e._unclipped_PID_Output_V = BitDiddle.ToDouble(data, 80); e._clipped_PID_Output_U = BitDiddle.ToDouble(data, 88); e._elmoSpeed_CPS = BitDiddle.ToDouble(data, 96); e._bellowsPosition = BitDiddle.ToDouble(data, 104); for (int i = 0; i < _comment.Length; i++) e._comment[i] = data[i + 112]; } public override string ToString() { _sb.Append("\t"); if (_fieldValid.IsSet((int)_members.TimeStamp)) _sb.Append(_timeStamp.ToString()); _sb.Append("\t"); if (_fieldValid.IsSet((int)_members.MessageType)) _sb.Append(EventToString(_logEntryType)); _sb.Append("\t"); if (_fieldValid.IsSet((int)_members.Comment)) _sb.Append(new String(System.Text.Encoding.UTF8.GetChars(_comment))); _sb.Append("\t"); if (_fieldValid.IsSet((int) _members.V_SetPoint)) _sb.AppendFormat("1) {0}", _velocitySetpoint); _sb.Append("\t"); if (_fieldValid.IsSet((int)_members.P_SetPoint)) _sb.AppendFormat("1) {0}", _pressureSetpoint); _sb.Append("\t"); if (_fieldValid.IsSet((int)_members.Current_P)) _sb.AppendFormat("1) {0}", _currentPressure); _sb.Append("\t"); if (_fieldValid.IsSet((int)_members.Platform_V)) _sb.AppendFormat("1) {0}", _platformVelocity); _sb.Append("\t"); if (_fieldValid.IsSet((int)_members.Y1)) _sb.AppendFormat("1) {0}", _y1); _sb.Append("\t"); if (_fieldValid.IsSet((int)_members.Y2)) _sb.AppendFormat("1) {0}", _y2); _sb.Append("\t"); if (_fieldValid.IsSet((int)_members.Unclipped_PID)) _sb.AppendFormat("1) {0}", _unclipped_PID_Output_V); _sb.Append("\t"); if (_fieldValid.IsSet((int)_members.Clipped_PID)) _sb.AppendFormat("1) {0}", _clipped_PID_Output_U); _sb.Append("\t"); if (_fieldValid.IsSet((int)_members.Elmo_CPS)) _sb.AppendFormat("1) {0}", _elmoSpeed_CPS); _sb.Append("\t"); if (_fieldValid.IsSet((int)_members.Pid_I)) _sb.AppendFormat("1) {0}", _pid_I); _sb.Append("\t"); if (_fieldValid.IsSet((int)_members.Previous_P)) _sb.AppendFormat("1) {0}", _previousPressure); _sb.Append("\t"); if (_fieldValid.IsSet((int)_members.Bellows_MM)) _sb.AppendFormat("1) {0}", _bellowsPosition); _sb.Append("\r\n"); return _sb.ToString(); } public DateTime TimeStamp { get { return _timeStamp; } set { _fieldValid.Set((int) _members.TimeStamp); _timeStamp = value; } } public LogEntryType TypeOfLogEntry { get { return _logEntryType; } set { _fieldValid.Set((int)_members.MessageType); _logEntryType = value; } } public double Y1 { get { return _y1; } set { _fieldValid.Set((int) _members.Y1); _y1 = value; } } public double Y2 { get { return _y2; } set { _fieldValid.Set((int)_members.Y2); _y2 = value; } } public double PID_I { get { return _pid_I; } set { _fieldValid.Set((int)_members.Pid_I); _pid_I = value; } } public double VelocitySetpoint { get { return _velocitySetpoint; } set { _fieldValid.Set((int)_members.V_SetPoint); _velocitySetpoint = value; } } public double PressureSetpoint { get { return _pressureSetpoint; } set { _fieldValid.Set((int)_members.P_SetPoint); _pressureSetpoint = value; } } public double CurrentPressure { get { return _currentPressure; } set { _fieldValid.Set((int)_members.Current_P); _currentPressure = value; } } public double PreviousPressure { get { return _previousPressure; } set { _fieldValid.Set((int)_members.Previous_P); _previousPressure = value; } } public double PlatformVelocity { get { return _platformVelocity; } set { _fieldValid.Set((int)_members.Platform_V); _platformVelocity = value; } } public double Unclipped_PID_Output_V { get { return _unclipped_PID_Output_V; } set { _fieldValid.Set((int)_members.Unclipped_PID); _unclipped_PID_Output_V = value; } } public double Clipped_PID_Output_U { get { return _clipped_PID_Output_U; } set { _fieldValid.Set((int)_members.Clipped_PID); _clipped_PID_Output_U = value; } } public double ElmoSpeed_CPS { get { return _elmoSpeed_CPS; } set { _fieldValid.Set((int)_members.Elmo_CPS); _elmoSpeed_CPS = value; } } public double BellowsPosition { get { return _bellowsPosition; } set { _fieldValid.Set((int)_members.Bellows_MM); _bellowsPosition = value; } } public String Comment { get { return _comment.ToString(); } set { _fieldValid.Set((int)_members.Comment); _comment = System.Text.Encoding.UTF8.GetBytes(value); } } private string EventToString(LogEntryType ev) { switch (ev) { case LogEntryType.EventType: return "Event"; case LogEntryType.CommentType: return "Comment"; case LogEntryType.TBA: return "TBA"; default: return "WTF"; } } } }