コード例 #1
0
        private async Task InstallAppAsyncV3(AppBundle bundle, IProgress <ProgressValue> progress)
        {
            //https://github.com/pebble/libpebble2/blob/master/libpebble2/services/install.py

            var meta = AppMetaData.FromAppBundle(bundle);

            var bytes  = meta.GetBytes();
            var result = await _pebble.BlobDBClient.Delete(BlobDatabase.App, meta.UUID.Data);

            result = await _pebble.BlobDBClient.Insert(BlobDatabase.App, meta.UUID.Data, bytes);

            if (result.Response == BlobStatus.Success)
            {
                var startPacket = new AppRunStatePacket();
                startPacket.Command = AppRunState.Start;
                startPacket.UUID    = meta.UUID;
                //app_fetch = self._pebble.send_and_read(AppRunState(data=AppRunStateStart(uuid=app_uuid)), AppFetchRequest)

                var runStateResult = await _pebble.SendMessageAsync <AppFetchRequestPacket>(Endpoint.AppRunState, startPacket.GetBytes());

                if (!runStateResult.Success)
                {
                    throw new InvalidOperationException("Pebble replied invalid run state");
                }

                if (!meta.UUID.Equals(runStateResult.UUID))
                {
                    var response = new AppFetchResponsePacket();
                    response.Response = AppFetchStatus.InvalidUUID;
                    await _pebble.SendMessageNoResponseAsync(Endpoint.AppFetch, response.GetBytes());

                    throw new InvalidOperationException("The pebble requested the wrong UUID");
                }

                var putBytesResponse = await _pebble.PutBytesClient.PutBytes(bundle.App, TransferType.Binary, appInstallId : (uint)runStateResult.AppId);

                if (!putBytesResponse)
                {
                    throw new InvalidOperationException("Putbytes failed");
                }

                if (bundle.HasResources)
                {
                    putBytesResponse = await _pebble.PutBytesClient.PutBytes(bundle.Resources, TransferType.Resources, appInstallId : (uint)runStateResult.AppId);

                    if (!putBytesResponse)
                    {
                        throw new InvalidOperationException("Putbytes failed");
                    }
                }

                //TODO: add worker to manifest and transfer it if necassary
                //if (bundle.HasWorker)
                //{
                //await PutBytesV3(bundle.Worker, TransferType.Worker, runStateResult.AppId);
                //}
            }
            else
            {
                throw new DataMisalignedException("BlobDB Insert Failed");
            }
        }
コード例 #2
0
ファイル: Program.cs プロジェクト: hashtagchris/PebbleSharp
        private static async Task ShowPebbleMenu(Pebble pebble)
        {
            var menu = new Menu(
                "Disconnect",
                "Get Time",
                "Set Current Time",
                "Get Firmware Info",
                "Send Ping",
                "Media Commands",
                "Install App",
                "Send App Message",
                "Get currently running app");

            while (true)
            {
                switch (menu.ShowMenu())
                {
                case 0:
                    pebble.Disconnect();
                    return;

                case 1:
                    var timeResult = await pebble.GetTimeAsync();

                    DisplayResult(timeResult, x => string.Format("Pebble Time: " + x.Time.ToString("G")));
                    break;

                case 2:
                    await pebble.SetTimeAsync(DateTime.Now);

                    goto case 1;

                case 3:
                    var firmwareResult = await pebble.GetFirmwareVersionAsync();

                    DisplayResult(firmwareResult,
                                  x => string.Join(Environment.NewLine, "Firmware", x.Firmware.ToString(),
                                                   "Recovery Firmware", x.RecoveryFirmware.ToString()));
                    break;

                case 4:
                    var pingResult = await pebble.PingAsync();

                    DisplayResult(pingResult, x => "Received Ping Response");
                    break;

                case 5:
                    ShowMediaCommands(pebble);
                    break;

                case 6:
                    InstallApp(pebble);
                    break;

                case 7:
                    SendAppMessage(pebble);
                    break;

                case 8:
                    var requestPacket = new AppRunStatePacket
                    {
                        Command = AppRunState.Request,
                    };
                    var appRunStateResult = await pebble.SendMessageAsync <AppRunStateResponse>(Endpoint.AppRunState, requestPacket.GetBytes());

                    DisplayResult(appRunStateResult, x => $"Current app: {x.UUID.ToString()}");
                    break;
                }
            }
        }