void OnDebugLogMessage(DieMessage message) { var dlm = (DieMessageDebugLog)message; string text = System.Text.Encoding.UTF8.GetString(dlm.data, 0, dlm.data.Length); Debug.Log(name + ": " + text); }
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 OnTelemetryMessage(DieMessage message) { // Don't bother doing anything with the message if we don't have // anybody interested in telemetry data. if (_OnTelemetry != null) { // Notify anyone who cares var telem = (DieMessageAcc)message; _OnTelemetry.Invoke(this, telem.data); } }
void OnStateMessage(DieMessage message) { // Handle the message var stateMsg = (DieMessageState)message; state = (State)stateMsg.face; // Notify anyone who cares if (OnStateChanged != null) { OnStateChanged.Invoke(this, state); } }
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 OnNotifyUserMessage(DieMessage message) { var notifyUserMsg = (DieMessageNotifyUser)message; bool ok = notifyUserMsg.ok != 0; bool cancel = notifyUserMsg.cancel != 0; float timeout = (float)notifyUserMsg.timeout_s; string text = System.Text.Encoding.UTF8.GetString(notifyUserMsg.data, 0, notifyUserMsg.data.Length); PixelsApp.Instance.ShowDialogBox("Message from " + name, text, "Ok", cancel ? "Cancel" : null, (res) => { PostMessage(new DieMessageNotifyUserAck() { okCancel = (byte)(res ? 1 : 0) }); }); }
void OnStateMessage(DieMessage message) { // Handle the message var stateMsg = (DieMessageState)message; Debug.Log("State: " + ((State)(stateMsg.state)).ToString() + ", " + stateMsg.face); var newState = (State)stateMsg.state; var newFace = stateMsg.face; if (newState != state || newFace != face) { state = newState; face = newFace; // Notify anyone who cares OnStateChanged?.Invoke(this, state); } }
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); } }
void OnNotifyUserMessage(DieMessage message) { var notifyUserMsg = (DieMessageNotifyUser)message; bool ok = notifyUserMsg.ok != 0; bool cancel = notifyUserMsg.cancel != 0; float timeout = (float)notifyUserMsg.timeout_s; string text = System.Text.Encoding.UTF8.GetString(notifyUserMsg.data, 0, notifyUserMsg.data.Length); var uiInstance = NotificationUI.Instance; if (uiInstance != null) { // Show the message and tell the die when user clicks Ok! uiInstance.Show(text, ok, cancel, timeout, (res) => { PostMessage(new DieMessageNotifyUserAck() { okCancel = (byte)(res ? 1 : 0) }); }); } }
void OnTelemetryMessage(DieMessage message) { // Don't bother doing anything with the message if we don't have // anybody interested in telemetry data. if (_OnTelemetry != null) { var telem = (DieMessageAcc)message; for (int i = 0; i < 2; ++i) { // Compute actual accelerometer readings (in Gs) float cx = (float)telem.data[i].X / (float)(1 << 11) * (float)(scale); float cy = (float)telem.data[i].Y / (float)(1 << 11) * (float)(scale); float cz = (float)telem.data[i].Z / (float)(1 << 11) * (float)(scale); Vector3 acc = new Vector3(cx, cy, cz); lastSampleTime += telem.data[i].DeltaTime; // Notify anyone who cares _OnTelemetry.Invoke(this, acc, lastSampleTime); } } }
void OnWhoAreYouMessage(DieMessage msg) { coroutineManager.StartCoroutine(OnWhoAreMessageCr()); }
void OnRequestStateMessage(DieMessage msg) { coroutineManager.StartCoroutine(SendStateCr()); }
void OnPlayAudioClip(DieMessage message) { var playClipMessage = (DieMessagePlaySound)message; AudioClipManager.Instance.PlayAudioClip((uint)playClipMessage.clipId); }
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); }