public void SendWorkoutStatusNotification()
    {
        if (controlState == BLEProtocol.WorkoutControlState.Stop)
        {
            timestamp = 0;
            count     = 0;
            rpm       = 0;
            heartrate = 0;
        }
        else if (controlState == BLEProtocol.WorkoutControlState.Start)
        {
            ++timestamp;
            count    += 2;
            rpm       = 120;
            heartrate = 0;
        }

        BLEDebug.LogInfo("Sending WorkoutStatusNotification");
        BLEPluginInstance.SendMessage("ReceivePluginMessage",
                                      BLEProtocol.ConvertBytesToString(
                                          BLENotify.PrepareWorkoutStatusBytes(
                                              timestamp,
                                              count,
                                              rpm,
                                              heartrate
                                              )
                                          )
                                      );
    }
    public void ReceiveUnityMessage(string message)
    {
        byte[] messageData = BLEProtocol.ConvertStringToBytes(message);
        if (!BLEProtocol.ValidateData(messageData))
        {
            BLEDebug.LogError("Received Message Failed Validation - Ignoring");
        }
        byte actionCode = BLEProtocol.GetActionCode(messageData);

        switch (actionCode)
        {
        case BLEProtocol.ActionCode.Acknowledge:
            // Factory doesn't use this so we shouldn't be using it either
            BLEDebug.LogWarning("Acknowledge Received");
            break;

        case BLEProtocol.ActionCode.GetDeviceInformation:
            BLEPluginInstance.SendMessage("ReceivePluginMessage",
                                          BLEProtocol.ConvertBytesToString(
                                              BLEResponse.PrepareDeviceInformationBytes(
                                                  modelID,
                                                  hardwareMajor,
                                                  hardwareMinor,
                                                  firmwareMajor,
                                                  firmwareMinor,
                                                  firmwarePatch
                                                  )
                                              )
                                          );
            break;

        case BLEProtocol.ActionCode.GetErrorLog:
            // TODO - Low Priority
            break;

        case BLEProtocol.ActionCode.GetResistanceLevelRange:
            BLEPluginInstance.SendMessage("ReceivePluginMessage",
                                          BLEProtocol.ConvertBytesToString(
                                              BLEResponse.PrepareResistanceLevelRangeBytes(
                                                  resistanceLevelMin,
                                                  resitanceLevelMax
                                                  )
                                              )
                                          );
            break;

        case BLEProtocol.ActionCode.GetWorkoutControlState:
            BLEPluginInstance.SendMessage("ReceivePluginMessage",
                                          BLEProtocol.ConvertBytesToString(
                                              BLEResponse.PrepareWorkoutControlStateBytes(
                                                  controlState
                                                  )
                                              )
                                          );
            break;

        case BLEProtocol.ActionCode.GetResistanceLevel:
            BLEPluginInstance.SendMessage("ReceivePluginMessage",
                                          BLEProtocol.ConvertBytesToString(
                                              BLEResponse.PrepareResistanceLevelBytes(
                                                  resistanceLevel
                                                  )
                                              )
                                          );
            break;

        case BLEProtocol.ActionCode.SetWorkoutControlState:
            controlState = messageData[BLEProtocol.Index.WorkoutControlState];
            BLEPluginInstance.SendMessage("ReceivePluginMessage",
                                          BLEProtocol.ConvertBytesToString(
                                              BLENotify.PrepareWorkoutControlStateBytes(
                                                  controlState
                                                  )
                                              )
                                          );
            break;

        case BLEProtocol.ActionCode.SetResistanceLevel:
            resistanceLevel = messageData[BLEProtocol.Index.ResistanceLevel];
            BLEPluginInstance.SendMessage("ReceivePluginMessage",
                                          BLEProtocol.ConvertBytesToString(
                                              BLENotify.PrepareResistanceLevelBytes(
                                                  resistanceLevel
                                                  )
                                              )
                                          );
            break;

        default:
            BLEDebug.LogError("Error: Received Invalid ActionCode");
            break;
        }
    }