Example #1
0
    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();
        }
    }
Example #2
0
    void RemoveMessageHandler(DieMessageType msgType, MessageReceivedDelegate newDel)
    {
        MessageReceivedDelegate del;

        if (messageDelegates.TryGetValue(msgType, out del))
        {
            del -= newDel;
        }
    }
Example #3
0
    void AddMessageHandler(DieMessageType msgType, MessageReceivedDelegate newDel)
    {
        MessageReceivedDelegate del;

        if (messageDelegates.TryGetValue(msgType, out del))
        {
            del += newDel;
        }
        else
        {
            messageDelegates.Add(msgType, newDel);
        }
    }
Example #4
0
    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);
    }
Example #5
0
    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;
            }
        }
    }
Example #6
0
    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);
    }
Example #7
0
    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);
        }
    }
Example #8
0
    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);
    }
Example #9
0
        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++;
            }
        }
Example #10
0
    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);
    }
Example #11
0
    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);
    }