private static void ProcessReceivedData(byte[] recvBuf) { for (int i = 0; i < 124; i += 4) { if (recvBuf[i + 3] == EndOfDataTrunk) { DataTrunk dta = new DataTrunk(recvBuf[i], recvBuf[i + 1], recvBuf[i + 2]); switch (dta.type) { case DataType.ResetDataTag: break; case DataType.HandlebarDataTag: break; case DataType.WheelDataTag: break; case DataType.ButtonDataTag: break; default: break; } } } }
void ReceiveData() { byte[] recvBuf = new byte[128]; try { port.Read(recvBuf, 0, 128); for (int i = 0; i < 124; i += 4) { if (recvBuf[i + 3] == EndOfDataTrunk) { DataTrunk dta = new DataTrunk(recvBuf[i], recvBuf[i + 1], recvBuf[i + 2]); switch (dta.type) { case DataType.ResetDataTag: return; case DataType.HandlebarDataTag: { short angle = (short)(dta.byte1 | (dta.byte2 << 8)); float val = MathEx.PiOver2 * (float)angle / 256f; float lstval = MathEx.PiOver2 * (float)lastAngle / 256f; if (lastAngle != angle) { Manager.OnHandlebarRotated(val, val - lstval); lastAngle = angle; } float SlowSwitchAngle = MathEx.Degree2Radian(20); float FastSwitchAngle = MathEx.Degree2Radian(45); if (val > SlowSwitchAngle && val < FastSwitchAngle) { if (itemLeftCoolDown-- <= 0) { Manager.OnItemMoveRight(); itemLeftCoolDown = 30; } } else if (val < -SlowSwitchAngle && val > -FastSwitchAngle) { if (itemRightCoolDown-- <= 0) { Manager.OnItemMoveLeft(); itemRightCoolDown = 30; } } else if (val >= FastSwitchAngle) { if (lstval > SlowSwitchAngle && lstval < FastSwitchAngle) { itemLeftCoolDown = 0; } if (itemLeftCoolDown-- <= 0) { Manager.OnItemMoveRight(); itemLeftCoolDown = 10; } } else if (val <= -FastSwitchAngle) { if (lstval < -SlowSwitchAngle && lstval > -FastSwitchAngle) { itemRightCoolDown = 0; } if (itemRightCoolDown-- <= 0) { Manager.OnItemMoveLeft(); itemRightCoolDown = 10; } } else { itemLeftCoolDown = 0; itemRightCoolDown = 0; } break; } case DataType.WheelDataTag: if (dataDt > float.Epsilon) { ushort wheel = (ushort)(dta.byte1 | (dta.byte2 << 8)); if (lastWheel != wheel) { if (wheel < lastWheel) { lastWheel = 0; wheel = 0; } float deltaS = 0.001f * (wheel - lastWheel) * 1.75f; if (deltaS > 0) { float v = deltaS / dataDt; float actV; qVelocity.Enqueue(v); if (qVelocity.Count > 15) { qVelocity.Dequeue(); } if (qVelocity.Count > 0) { actV = 0; foreach (float lean in qVelocity) { actV += lean; } actV /= qVelocity.Count; } else { actV = v; } v = actV; Manager.OnWheelSpeedChanged(v, v - lastSpeed, false); //if (v > 1f) //{ // if (lastEnterTime > 2) // { // Manager.OnEnter(); // lastEnterTime = 0; // } //} //else //{ // lastEnterTime += dataDt; //} lastSpeed = v; lastWheel = wheel; } } dataDt = 0; } break; case DataType.ButtonDataTag: int hp = dta.byte2 & (1 << 5); if (hp != lastHPulse) { Manager.OnHeartPulse(); lastHPulse = hp; } if ((dta.byte2 & (0x80)) == 1) { short angle = 0; if (lastAngle != angle) { float val = MathEx.PiOver2 * (float)angle / 256f; float lstval = MathEx.PiOver2 * (float)lastAngle / 256f; Manager.OnHandlebarRotated(val, val - lstval); lastAngle = angle; } } if ((dta.byte2 & ButtonTLId) == 0) { if (!isEnterPressed) { Manager.OnEnter(); isEnterPressed = true; } } else { isEnterPressed = false; } if ((dta.byte2 & ButtonTRId) == 0) { if (!isEscPressed) { Manager.OnEscape(); isEscPressed = true; } } else { isEscPressed = false; } if ((dta.byte2 & ButtonMLId) == 0) { if (!isVPressed) { Manager.OnViewChanged(); isVPressed = true; } } else { isVPressed = false; } if ((dta.byte2 & ButtonMRId) != 0) { if (!isResetPressed) { //port.Write(ResetDataTag); Manager.OnReset(); isResetPressed = true; } } else { isResetPressed = false; } break; default: return; } } } } catch (TimeoutException) { } }