pxt-microbit 4.1.28 → 4.1.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -728,6 +728,46 @@ declare namespace pxsim {
728
728
  }
729
729
  declare namespace pxsim.info {
730
730
  }
731
+ declare namespace pxsim.multiplayer {
732
+ function postImage(im: pxsim.RefImage, goal: string): void;
733
+ function getCurrentImage(): pxsim.RefImage;
734
+ function setOrigin(origin: "client" | "server" | undefined): void;
735
+ function getOrigin(): string;
736
+ }
737
+ declare namespace pxsim {
738
+ interface MultiplayerBoard extends EventBusBoard {
739
+ multiplayerState: MultiplayerState;
740
+ }
741
+ function getMultiplayerState(): MultiplayerState;
742
+ interface SimulatorMultiplayerMessage extends SimulatorBroadcastMessage {
743
+ broadcast: true;
744
+ type: "multiplayer";
745
+ content: string;
746
+ origin?: "server" | "client";
747
+ clientNumber?: number;
748
+ id?: number;
749
+ }
750
+ interface MultiplayerImageMessage extends SimulatorMultiplayerMessage {
751
+ content: "Image";
752
+ goal: string;
753
+ image: RefImage;
754
+ }
755
+ interface MultiplayerButtonEvent extends SimulatorMultiplayerMessage {
756
+ content: "Button";
757
+ button: number;
758
+ state: "Pressed" | "Released" | "Held";
759
+ }
760
+ class MultiplayerState {
761
+ lastMessageId: number;
762
+ origin: string;
763
+ backgroundImage: RefImage;
764
+ constructor();
765
+ send(msg: SimulatorMultiplayerMessage): void;
766
+ init(origin: string): void;
767
+ setButton(key: number, isPressed: boolean): void;
768
+ protected messageHandler(msg: SimulatorMessage): void;
769
+ }
770
+ }
731
771
  declare namespace pxsim.gamepad {
732
772
  function setButton(index: number, up: boolean): void;
733
773
  function move(index: number, x: number, y: number): void;
@@ -699,7 +699,7 @@ var pxsim;
699
699
  var pxsim;
700
700
  (function (pxsim) {
701
701
  function board() {
702
- return pxsim.runtime.board;
702
+ return pxsim.runtime && pxsim.runtime.board;
703
703
  }
704
704
  pxsim.board = board;
705
705
  })(pxsim || (pxsim = {}));
@@ -2395,6 +2395,98 @@ var pxsim;
2395
2395
  pxsim.ToggleState = ToggleState;
2396
2396
  })(pxsim || (pxsim = {}));
2397
2397
  var pxsim;
2398
+ (function (pxsim) {
2399
+ var multiplayer;
2400
+ (function (multiplayer) {
2401
+ function postImage(im, goal) {
2402
+ const asBuf = pxsim.image.toBuffer(im);
2403
+ pxsim.getMultiplayerState().send({
2404
+ content: "Image",
2405
+ image: asBuf,
2406
+ goal
2407
+ });
2408
+ }
2409
+ multiplayer.postImage = postImage;
2410
+ function getCurrentImage() {
2411
+ return pxsim.getMultiplayerState().backgroundImage;
2412
+ }
2413
+ multiplayer.getCurrentImage = getCurrentImage;
2414
+ function setOrigin(origin) {
2415
+ pxsim.getMultiplayerState().origin = origin;
2416
+ }
2417
+ multiplayer.setOrigin = setOrigin;
2418
+ function getOrigin() {
2419
+ return pxsim.getMultiplayerState().origin;
2420
+ }
2421
+ multiplayer.getOrigin = getOrigin;
2422
+ })(multiplayer = pxsim.multiplayer || (pxsim.multiplayer = {}));
2423
+ })(pxsim || (pxsim = {}));
2424
+ (function (pxsim) {
2425
+ function getMultiplayerState() {
2426
+ return pxsim.board().multiplayerState;
2427
+ }
2428
+ pxsim.getMultiplayerState = getMultiplayerState;
2429
+ class MultiplayerState {
2430
+ constructor() {
2431
+ this.lastMessageId = 0;
2432
+ }
2433
+ send(msg) {
2434
+ pxsim.Runtime.postMessage(Object.assign(Object.assign({}, msg), { broadcast: true, toParentIFrameOnly: true, type: "multiplayer", origin: this.origin, id: this.lastMessageId++ }));
2435
+ }
2436
+ init(origin) {
2437
+ this.origin = origin;
2438
+ pxsim.runtime.board.addMessageListener(msg => this.messageHandler(msg));
2439
+ setInterval(() => {
2440
+ if (this.origin === "server") {
2441
+ const b = pxsim.board();
2442
+ const screenState = b && b.screenState;
2443
+ const lastImage = screenState && screenState.lastImage;
2444
+ lastImage && pxsim.multiplayer.postImage(lastImage, "broadcast-screen");
2445
+ }
2446
+ }, 50);
2447
+ }
2448
+ setButton(key, isPressed) {
2449
+ if (this.origin === "client") {
2450
+ this.send({
2451
+ content: "Button",
2452
+ button: key,
2453
+ state: isPressed ? "Pressed" : "Released"
2454
+ });
2455
+ }
2456
+ }
2457
+ messageHandler(msg) {
2458
+ if (!isMultiplayerMessage(msg)) {
2459
+ return;
2460
+ }
2461
+ if (isImageMessage(msg)) {
2462
+ if (this.origin === "client") {
2463
+ // HACK: peer js can convert Uint8Array into ArrayBuffer when transmitting; fix this.
2464
+ if (!ArrayBuffer.isView(msg.image.data)) {
2465
+ msg.image.data = new Uint8Array(msg.image.data);
2466
+ }
2467
+ this.backgroundImage = pxsim.image.ofBuffer(msg.image);
2468
+ }
2469
+ }
2470
+ else if (isButtonMessage(msg)) {
2471
+ if (this.origin === "server") {
2472
+ pxsim.board().setButton(msg.button + (7 * (msg.clientNumber || 1)), // + 7 to make it player 2 controls,
2473
+ msg.state === "Pressed" || msg.state === "Held");
2474
+ }
2475
+ }
2476
+ }
2477
+ }
2478
+ pxsim.MultiplayerState = MultiplayerState;
2479
+ function isMultiplayerMessage(msg) {
2480
+ return msg && msg.type === "multiplayer";
2481
+ }
2482
+ function isImageMessage(msg) {
2483
+ return msg && msg.content === "Image";
2484
+ }
2485
+ function isButtonMessage(msg) {
2486
+ return msg && msg.content === "Button";
2487
+ }
2488
+ })(pxsim || (pxsim = {}));
2489
+ var pxsim;
2398
2490
  (function (pxsim) {
2399
2491
  var gamepad;
2400
2492
  (function (gamepad) {
package/built/editor.js CHANGED
@@ -3167,6 +3167,7 @@ class DAPWrapper {
3167
3167
  this.pageSize = 1024;
3168
3168
  this.numPages = 256;
3169
3169
  this.usesCODAL = false;
3170
+ this.jacdacInHex = false;
3170
3171
  this.forceFullFlash = /webusbfullflash=1/.test(window.location.href);
3171
3172
  this.onSerial = (buf, isStderr) => { };
3172
3173
  this.onCustomEvent = (type, payload) => { };
@@ -3186,7 +3187,7 @@ class DAPWrapper {
3186
3187
  this.allocDAP();
3187
3188
  }
3188
3189
  get useJACDAC() {
3189
- return this.usesCODAL;
3190
+ return this.jacdacInHex && this.usesCODAL;
3190
3191
  }
3191
3192
  processSerialLine(line) {
3192
3193
  if (this.onSerial) {
@@ -3321,6 +3322,7 @@ class DAPWrapper {
3321
3322
  const binVersion = stringResponse(r);
3322
3323
  log(`bin name: ${this.binName} v:${binVersion}`);
3323
3324
  pxt.tickEvent("hid.flash.connect", { codal: this.usesCODAL ? 1 : 0, daplink: daplinkVersion, bin: binVersion });
3325
+ // set baud rate
3324
3326
  const baud = new Uint8Array(5);
3325
3327
  baud[0] = 0x82; // set baud
3326
3328
  pxt.HF2.write32(baud, 1, 115200);
@@ -3329,6 +3331,7 @@ class DAPWrapper {
3329
3331
  await pxt.Util.delay(200);
3330
3332
  // only init after setting baud rate, in case we got reset
3331
3333
  await this.cortexM.init();
3334
+ await this.cortexM.reset(true);
3332
3335
  const res = await this.readWords(0x10000010, 2);
3333
3336
  this.pageSize = res[0];
3334
3337
  this.numPages = res[1];
@@ -3362,9 +3365,13 @@ class DAPWrapper {
3362
3365
  .then(() => this.io.disconnectAsync());
3363
3366
  }
3364
3367
  reflashAsync(resp) {
3368
+ var _a, _b;
3369
+ pxt.tickEvent("hid.flash.start");
3365
3370
  log("reflash");
3366
3371
  startTime = 0;
3367
- pxt.tickEvent("hid.flash.start");
3372
+ const codalJson = resp.outfiles["codal.json"];
3373
+ // JACDAC_WEBUSB is defined in microsoft/pxt-jacdac/pxt.json
3374
+ this.jacdacInHex = codalJson && !!((_b = (_a = pxt.Util.jsonTryParse(codalJson)) === null || _a === void 0 ? void 0 : _a.definitions) === null || _b === void 0 ? void 0 : _b.JACDAC_WEBUSB);
3368
3375
  this.flashAborted = false;
3369
3376
  this.flashing = true;
3370
3377
  return (this.io.isConnected() ? Promise.resolve() : this.io.reconnectAsync())
@@ -3721,8 +3728,17 @@ class DAPWrapper {
3721
3728
  log(`jacdac: disabled`);
3722
3729
  return;
3723
3730
  }
3724
- await pxt.Util.delay(700); // wait for the program to start and setup memory correctly
3725
- const xchg = await this.findJacdacXchgAddr();
3731
+ // allow jacdac to boot
3732
+ const now = pxt.U.now();
3733
+ await pxt.Util.delay(1000);
3734
+ let xchgRetry = 0;
3735
+ let xchg;
3736
+ while (xchg == null && xchgRetry++ < 2) {
3737
+ log(`jacdac: finding xchg address (retry ${xchgRetry})`);
3738
+ await pxt.Util.delay(100); // wait for the program to start and setup memory correctly
3739
+ xchg = await this.findJacdacXchgAddr();
3740
+ }
3741
+ log(`jacdac: exchange address 0x${xchg ? xchg.toString(16) : "?"}; ${xchgRetry} retries; ${(pxt.U.now() - now) | 0}ms`);
3726
3742
  if (xchg == null) {
3727
3743
  log("jacdac: xchg address not found");
3728
3744
  pxt.tickEvent("hid.flash.jacdac.error.missingxchg");