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"); } }
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; } } }