IEnumerator SendMessageWithAckOrTimeoutCr <T>(T message, DieMessageType ackType, float timeOut, System.Action <DieMessage> ackAction, System.Action timeoutAction) where T : DieMessage { DieMessage ackMessage = null; float startTime = Time.time; MessageReceivedDelegate callback = (ackMsg) => { ackMessage = ackMsg; }; AddMessageHandler(ackType, callback); byte[] msgBytes = DieMessages.ToByteArray(message); DicePool.Instance.WriteDie(this, msgBytes, msgBytes.Length, null); while (ackMessage == null && Time.time < startTime + timeOut) { yield return(null); } RemoveMessageHandler(ackType, callback); if (ackMessage != null) { ackAction?.Invoke(ackMessage); } else { timeoutAction?.Invoke(); } }
void RemoveMessageHandler(DieMessageType msgType, MessageReceivedDelegate newDel) { MessageReceivedDelegate del; if (messageDelegates.TryGetValue(msgType, out del)) { del -= newDel; } }
void AddMessageHandler(DieMessageType msgType, MessageReceivedDelegate newDel) { MessageReceivedDelegate del; if (messageDelegates.TryGetValue(msgType, out del)) { del += newDel; } else { messageDelegates.Add(msgType, newDel); } }
IEnumerator SendMessageWithAckRetryCr <T>(T message, DieMessageType ackType, System.Action <DieMessage> ackAction) where T : DieMessage { DieMessage msgReceived = null; System.Action <DieMessage> msgAction = (msg) => { msgReceived = msg; }; while (msgReceived == null) { // Retry every half second if necessary yield return(StartCoroutine(SendMessageWithAckOrTimeoutCr(message, ackType, 0.5f, msgAction, null))); } ackAction?.Invoke(msgReceived); }
void RemoveMessageHandler(DieMessageType msgType, MessageReceivedDelegate newDel) { MessageReceivedDelegate del; if (messageDelegates.TryGetValue(msgType, out del)) { del -= newDel; if (del == null) { messageDelegates.Remove(msgType); } else { messageDelegates[msgType] = del; } } }
IEnumerator SendMessageWithAck <T>(T message, DieMessageType ackType) where T : DieMessage { bool msgReceived = false; MessageReceivedDelegate callback = (ackMsg) => { msgReceived = true; }; AddMessageHandler(ackType, callback); byte[] msgBytes = DieMessages.ToByteArray(message); _sendBytes.SendBytes(this, msgBytes, msgBytes.Length, null); yield return(new WaitUntil(() => msgReceived)); RemoveMessageHandler(ackType, callback); }
IEnumerator WaitForMessageCr(DieMessageType msgType, System.Action <DieMessage> msgReceivedCallback) { bool msgReceived = false; DieMessage msg = default(DieMessage); MessageReceivedDelegate callback = (ackMsg) => { msgReceived = true; msg = ackMsg; }; AddMessageHandler(msgType, callback); yield return(new WaitUntil(() => msgReceived)); RemoveMessageHandler(msgType, callback); if (msgReceivedCallback != null) { msgReceivedCallback.Invoke(msg); } }
IEnumerator SendMessageWithAckOrTimeout <T>(T message, DieMessageType ackType, float timeOut) where T : DieMessage { bool msgReceived = false; float startTime = Time.time; MessageReceivedDelegate callback = (ackMsg) => { msgReceived = true; }; AddMessageHandler(ackType, callback); byte[] msgBytes = DieMessages.ToByteArray(message); _sendBytes.SendBytes(this, msgBytes, msgBytes.Length, null); while (!msgReceived && Time.time < startTime + timeOut) { yield return(null); } RemoveMessageHandler(ackType, callback); }
IEnumerator SendMessageWithAckRetryCr <T>(T message, DieMessageType ackType, int retryCount, System.Action <DieMessage> ackAction, System.Action timeoutAction, System.Action errorAction) where T : DieMessage { bool msgReceived = false; System.Action <DieMessage> msgAction = (msg) => { msgReceived = true; ackAction?.Invoke(msg); }; int count = 0; while (!msgReceived && count < retryCount) { // Retry every half second if necessary yield return(StartCoroutine(SendMessageWithAckOrTimeoutCr(message, ackType, 10.0f, msgAction, timeoutAction, errorAction))); count++; } }
public static DieMessage FromByteArray(byte[] data) { DieMessage ret = null; if (data.Length > 0) { DieMessageType type = (DieMessageType)data[0]; switch (type) { case DieMessageType.State: ret = FromByteArray <DieMessageState>(data); break; case DieMessageType.Telemetry: ret = FromByteArray <DieMessageAcc>(data); break; case DieMessageType.BulkSetup: ret = FromByteArray <DieMessageBulkSetup>(data); break; case DieMessageType.BulkData: ret = FromByteArray <DieMessageBulkData>(data); break; case DieMessageType.BulkSetupAck: ret = FromByteArray <DieMessageBulkSetupAck>(data); break; case DieMessageType.BulkDataAck: ret = FromByteArray <DieMessageBulkDataAck>(data); break; case DieMessageType.TransferAnimSet: ret = FromByteArray <DieMessageTransferAnimSet>(data); break; case DieMessageType.TransferAnimSetAck: ret = FromByteArray <DieMessageTransferAnimSetAck>(data); break; case DieMessageType.TransferSettings: ret = FromByteArray <DieMessageTransferSettings>(data); break; case DieMessageType.TransferSettingsAck: ret = FromByteArray <DieMessageTransferSettingsAck>(data); break; case DieMessageType.DebugLog: ret = FromByteArray <DieMessageDebugLog>(data); break; case DieMessageType.PlayAnim: ret = FromByteArray <DieMessagePlayAnim>(data); break; case DieMessageType.RequestAnimSet: ret = FromByteArray <DieMessageRequestAnimSet>(data); break; case DieMessageType.RequestSettings: ret = FromByteArray <DieMessageRequestSettings>(data); break; case DieMessageType.RequestTelemetry: ret = FromByteArray <DieMessageRequestTelemetry>(data); break; case DieMessageType.RenameFinished: ret = FromByteArray <DieMessageRenameFinished>(data); break; case DieMessageType.FlashFinished: ret = FromByteArray <DieMessageFlashFinished>(data); break; case DieMessageType.ProgramDefaultAnimSetFinished: ret = FromByteArray <DieMessageProgramDefaultAnimSetFinished>(data); break; case DieMessageType.DefaultAnimSetColor: ret = FromByteArray <DieMessageDefaultAnimSetColor>(data); break; default: break; } } return(ret); }
public static DieMessage FromByteArray(byte[] data) { DieMessage ret = null; if (data.Length > 0) { DieMessageType type = (DieMessageType)data[0]; switch (type) { case DieMessageType.State: ret = FromByteArray <DieMessageState>(data); break; case DieMessageType.WhoAreYou: ret = FromByteArray <DieMessageWhoAreYou>(data); break; case DieMessageType.IAmADie: ret = FromByteArray <DieMessageIAmADie>(data); break; case DieMessageType.Telemetry: ret = FromByteArray <DieMessageAcc>(data); break; case DieMessageType.BulkSetup: ret = FromByteArray <DieMessageBulkSetup>(data); break; case DieMessageType.BulkData: ret = FromByteArray <DieMessageBulkData>(data); break; case DieMessageType.BulkSetupAck: ret = FromByteArray <DieMessageBulkSetupAck>(data); break; case DieMessageType.BulkDataAck: ret = FromByteArray <DieMessageBulkDataAck>(data); break; case DieMessageType.TransferAnimSet: ret = FromByteArray <DieMessageTransferAnimSet>(data); break; case DieMessageType.TransferAnimSetAck: ret = FromByteArray <DieMessageTransferAnimSetAck>(data); break; case DieMessageType.TransferSettings: ret = FromByteArray <DieMessageTransferSettings>(data); break; case DieMessageType.TransferSettingsAck: ret = FromByteArray <DieMessageTransferSettingsAck>(data); break; case DieMessageType.DebugLog: ret = FromByteArray <DieMessageDebugLog>(data); break; case DieMessageType.PlayAnim: ret = FromByteArray <DieMessagePlayAnim>(data); break; case DieMessageType.PlayAnimEvent: ret = FromByteArray <DieMessagePlayAnimEvent>(data); break; case DieMessageType.StopAnim: ret = FromByteArray <DieMessageStopAnim>(data); break; case DieMessageType.RequestState: ret = FromByteArray <DieMessageRequestState>(data); break; case DieMessageType.RequestAnimSet: ret = FromByteArray <DieMessageRequestAnimSet>(data); break; case DieMessageType.RequestSettings: ret = FromByteArray <DieMessageRequestSettings>(data); break; case DieMessageType.RequestTelemetry: ret = FromByteArray <DieMessageRequestTelemetry>(data); break; case DieMessageType.FlashFinished: ret = FromByteArray <DieMessageFlashFinished>(data); break; case DieMessageType.ProgramDefaultAnimSetFinished: ret = FromByteArray <DieMessageProgramDefaultAnimSetFinished>(data); break; case DieMessageType.DefaultAnimSetColor: ret = FromByteArray <DieMessageDefaultAnimSetColor>(data); break; case DieMessageType.BatteryLevel: ret = FromByteArray <DieMessageBatteryLevel>(data); break; case DieMessageType.RequestBatteryLevel: ret = FromByteArray <DieMessageRequestBatteryLevel>(data); break; case DieMessageType.Calibrate: ret = FromByteArray <DieMessageCalibrate>(data); break; case DieMessageType.CalibrateFace: ret = FromByteArray <DieMessageCalibrateFace>(data); break; case DieMessageType.NotifyUser: ret = FromByteArray <DieMessageNotifyUser>(data); break; case DieMessageType.NotifyUserAck: ret = FromByteArray <DieMessageNotifyUserAck>(data); break; case DieMessageType.TestHardware: ret = FromByteArray <DieMessageTestHardware>(data); break; case DieMessageType.SetStandardState: ret = FromByteArray <DieMessageSetStandardState>(data); break; case DieMessageType.SetLEDAnimState: ret = FromByteArray <DieMessageSetLEDAnimState>(data); break; case DieMessageType.SetBattleState: ret = FromByteArray <DieMessageSetBattleState>(data); break; case DieMessageType.AttractMode: ret = FromByteArray <DieMessageAttractMode>(data); break; case DieMessageType.PrintNormals: ret = FromByteArray <DieMessagePrintNormals>(data); break; default: throw new System.Exception("Unhandled Message type " + type.ToString() + " for marshalling"); } } return(ret); }