private static TorqueEventArgs ParseOpenProtocal(byte[] data)
        {
            string str;
            Int32 ival;

            TorqueEventArgs args = new TorqueEventArgs();
            str = ASCIIEncoding.ASCII.GetString(data, 2, 4);
            args.mCellID = Convert.ToInt32(str);

            str = ASCIIEncoding.ASCII.GetString(data, 8, 2);
            args.mChannelID = Convert.ToInt32(str);

            args.mControllerName = ASCIIEncoding.ASCII.GetString(data, 12, 25);
            args.mVIN = ASCIIEncoding.ASCII.GetString(data, 39, 25);

            str = ASCIIEncoding.ASCII.GetString(data, 66, 2);
            args.mJobNo = Convert.ToInt32(str);

            str = ASCIIEncoding.ASCII.GetString(data, 70, 3);
            args.mPSetNo = Convert.ToInt32(str);

            str = ASCIIEncoding.ASCII.GetString(data, 75, 4);
            args.mBatchSize = Convert.ToInt32(str);

            str = ASCIIEncoding.ASCII.GetString(data, 81, 4);
            args.mBatchCount = Convert.ToInt32(str);

            args.mTorqueStatus = (StatusType)(data[90] - 48);
            args.mAngleStatus = (StatusType)(data[93] - 48);

            //data[87] return 53 ... should be 48 or 49 ... need to investigate
            args.mSuccess = (args.mTorqueStatus == StatusType.OK && args.mAngleStatus == StatusType.OK);

            str = ASCIIEncoding.ASCII.GetString(data, 96, 6);
            ival = Convert.ToInt32(str);
            args.mTorqueMin = ival / 100.0F;

            str = ASCIIEncoding.ASCII.GetString(data, 104, 6);
            ival = Convert.ToInt32(str);
            args.mTorqueMax = ival / 100.0F;

            str = ASCIIEncoding.ASCII.GetString(data, 112, 6);
            ival = Convert.ToInt32(str);
            args.mTorqueTarget = ival / 100.0F;

            str = ASCIIEncoding.ASCII.GetString(data, 120, 6);
            ival = Convert.ToInt32(str);
            args.mTorque = ival / 100.0F;

            str = ASCIIEncoding.ASCII.GetString(data, 128, 5);
            ival = Convert.ToInt32(str);
            args.mAngleMin = ival / 100.0F;

            str = ASCIIEncoding.ASCII.GetString(data, 135, 5);
            ival = Convert.ToInt32(str);
            args.mAngleMax = ival / 100.0F;

            str = ASCIIEncoding.ASCII.GetString(data, 142, 5);
            ival = Convert.ToInt32(str);
            args.mAngleTarget = ival / 100.0F;

            str = ASCIIEncoding.ASCII.GetString(data, 149, 5);
            ival = Convert.ToInt32(str);
            args.mAngle = ival / 100.0F;

            str = ASCIIEncoding.ASCII.GetString(data, 156, 10);
            str += " ";
            str += ASCIIEncoding.ASCII.GetString(data, 167, 8);
            args.mTimestamp = Convert.ToDateTime(str);

            str = ASCIIEncoding.ASCII.GetString(data, 177, 10);
            str += " ";
            str += ASCIIEncoding.ASCII.GetString(data, 188, 8);
            args.mLastPSetChange = Convert.ToDateTime(str);

            args.mBatchStatus = (BatchStatusType)(data[198] - 48);

            str = ASCIIEncoding.ASCII.GetString(data, 201, 10);
            args.mTighteningID = Convert.ToInt32(str.Trim());

            return args;
        }
 public static bool TryParse(Protocal protocal, byte[] data, out TorqueEventArgs args)
 {
     args = null;
     try {
         switch (protocal) {
             case Protocal.OpenProtocal:
                 args = ParseOpenProtocal(data);
                 return true;
             default:
                 return false;
         }
     } catch {
         return false;
     }
 }