Bump V3.0.22 (#110)

* change simulator svg

* change radio image

* Remove google fonts cdn

* change color of 'advanced' button

* font fix

* font fix 2

* display fix

* change fullsceen simulator bg

* Continuous servo

* handle continuous state

* adding shims

* update rendering for continuous servos

* fixing sim

* fix sig

* typo

* fix sim

* bump pxt

* bump pxt

* rerun travis

* Input blocks revision

- add Button and Pin event types
- merge onPinPressed & onPinReleased in new onPinEvent function
- create new onButtonEvent function

* update input blocks in docs and tests

* remove device_pin_release block

* Hide DAL.x behind Enum

* bring back deprecated blocks, but hide them

* shims and locales files

* fix input.input. typing

* remove buildpr

* bump V3

* update simulator aspect ratio

* add Loudness Block

* revoke loudness block

* Adds soundLevel

To be replaced by pxt-common-packages when DAL is updated.

* Remove P0 & P3 from AnalogPin

Co-authored-by: Juri <gitkraken@juriwolf.de>
This commit is contained in:
Amerlander
2020-09-08 11:04:25 +02:00
committed by GitHub
parent 98d8b2977b
commit 918af4f3ac
233 changed files with 9391 additions and 2739 deletions

View File

@ -16,6 +16,7 @@ namespace pxsim.input {
export function isGesture(gesture: number): boolean {
const b = accForGesture(gesture);
b.accelerometer.activate();
return b.accelerometer.getGesture() == gesture;
}
@ -33,28 +34,25 @@ namespace pxsim.input {
acc.activate(AccelerometerFlag.Z);
return acc.getZ();
default:
acc.activate();
return Math.floor(Math.sqrt(acc.instantaneousAccelerationSquared()));
acc.activate(AccelerometerFlag.Strength);
return acc.getStrength();
}
}
export function rotation(kind: number): number {
const b = board().accelerometerState;
const acc = b.accelerometer;
acc.activate();
const x = acc.getX(MicroBitCoordinateSystem.NORTH_EAST_DOWN);
const y = acc.getY(MicroBitCoordinateSystem.NORTH_EAST_DOWN);
const z = acc.getZ(MicroBitCoordinateSystem.NORTH_EAST_DOWN);
const roll = Math.atan2(y, z);
const pitch = Math.atan(-x / (y * Math.sin(roll) + z * Math.cos(roll)));
let r = 0;
switch (kind) {
case 0: r = pitch; break;
case 1: r = roll; break;
case 0: {
acc.activate(AccelerometerFlag.Pitch);
return acc.getPitch();
}
case 1: {
acc.activate(AccelerometerFlag.Roll);
return acc.getRoll();
}
default: return 0;
}
return Math.floor(r / Math.PI * 180);
}
export function setAccelerometerRange(range: number) {
@ -117,8 +115,11 @@ namespace pxsim {
export enum AccelerometerFlag {
X = 1,
Y = 2,
Z = 4
Y = 1 << 1,
Z = 1 << 2,
Strength = 1 << 3,
Pitch = 1 << 4,
Roll = 1 << 5
}
export class Accelerometer {
@ -148,7 +149,7 @@ namespace pxsim {
this.isActive = true;
this.runtime.queueDisplayUpdate();
}
if (flags)
if (!!flags)
this.flags |= flags;
}
@ -169,7 +170,29 @@ namespace pxsim {
board().bus.queue(this.id, DAL.MICROBIT_ACCELEROMETER_EVT_DATA_UPDATE)
}
public instantaneousAccelerationSquared() {
public getStrength() {
return Math.floor(Math.sqrt(this.instantaneousAccelerationSquared()));
}
updateEnvironmentGlobals() {
// update debugger
if (this.isActive) {
if (this.flags & AccelerometerFlag.X)
this.runtime.environmentGlobals[pxsim.localization.lf("acceleration.x")] = this.sample.x;
if (this.flags & AccelerometerFlag.Y)
this.runtime.environmentGlobals[pxsim.localization.lf("acceleration.y")] = this.sample.y;
if (this.flags & AccelerometerFlag.Z)
this.runtime.environmentGlobals[pxsim.localization.lf("acceleration.z")] = this.sample.z;
if (this.flags & AccelerometerFlag.Strength)
this.runtime.environmentGlobals[pxsim.localization.lf("acceleration.strength")] = Math.sqrt(this.instantaneousAccelerationSquared());
if (this.flags & AccelerometerFlag.Pitch)
this.runtime.environmentGlobals[pxsim.localization.lf("acceleration.pitch")] = this.getPitch();
if (this.flags & AccelerometerFlag.Roll)
this.runtime.environmentGlobals[pxsim.localization.lf("acceleration.roll")] = this.getRoll();
}
}
private instantaneousAccelerationSquared() {
// Use pythagoras theorem to determine the combined force acting on the device.
return this.sample.x * this.sample.x + this.sample.y * this.sample.y + this.sample.z * this.sample.z;
}
@ -294,7 +317,6 @@ namespace pxsim {
* @endcode
*/
public getX(system: MicroBitCoordinateSystem = MicroBitCoordinateSystem.SIMPLE_CARTESIAN): number {
this.activate();
switch (system) {
case MicroBitCoordinateSystem.SIMPLE_CARTESIAN:
return -this.sample.x;
@ -319,7 +341,6 @@ namespace pxsim {
* @endcode
*/
public getY(system: MicroBitCoordinateSystem = MicroBitCoordinateSystem.SIMPLE_CARTESIAN): number {
this.activate();
switch (system) {
case MicroBitCoordinateSystem.SIMPLE_CARTESIAN:
return -this.sample.y;
@ -344,7 +365,6 @@ namespace pxsim {
* @endcode
*/
public getZ(system: MicroBitCoordinateSystem = MicroBitCoordinateSystem.SIMPLE_CARTESIAN): number {
this.activate();
switch (system) {
case MicroBitCoordinateSystem.NORTH_EAST_DOWN:
return -this.sample.z;
@ -365,7 +385,6 @@ namespace pxsim {
* @endcode
*/
public getPitch(): number {
this.activate();
return Math.floor((360 * this.getPitchRadians()) / (2 * Math.PI));
}
@ -384,7 +403,6 @@ namespace pxsim {
* @endcode
*/
public getRoll(): number {
this.activate();
return Math.floor((360 * this.getRollRadians()) / (2 * Math.PI));
}

View File

@ -47,7 +47,7 @@ namespace pxsim.pins {
export function setPull(pinId: number, pull: number) {
let pin = getPin(pinId);
if (!pin) return;
pin.pull = pull;
pin.setPull(pull);
}
export function analogReadPin(pinId: number): number {
@ -61,7 +61,7 @@ namespace pxsim.pins {
let pin = getPin(pinId);
if (!pin) return;
pin.mode = PinFlags.Analog | PinFlags.Output;
pin.value = value ? value : 0;
pin.value = value | 0;
runtime.queueDisplayUpdate();
}
@ -101,22 +101,38 @@ namespace pxsim.pins {
pin.pitch = true;
}
export function analogSetPitchVolume(volume: number) {
const ec = board().edgeConnectorState;
ec.pitchVolume = Math.max(0, Math.min(0xff, volume | 0));
}
export function analogPitchVolume() {
const ec = board().edgeConnectorState;
return ec.pitchVolume;
}
export function analogPitch(frequency: number, ms: number) {
// update analog output
let pins = board().edgeConnectorState.pins;
let pin = pins.filter(pin => !!pin && pin.pitch)[0] || pins[0];
const b = board();
if (!b) return;
const ec = b.edgeConnectorState;
const pins = ec.pins;
const pin = pins.filter(pin => !!pin && pin.pitch)[0] || pins[0];
const pitchVolume = ec.pitchVolume | 0;
pin.mode = PinFlags.Analog | PinFlags.Output;
if (frequency <= 0) {
if (frequency <= 0 || pitchVolume <= 0) {
pin.value = 0;
pin.period = 0;
} else {
pin.value = 512;
const v = 1 << (pitchVolume >> 5);
pin.value = v;
pin.period = 1000000 / frequency;
}
runtime.queueDisplayUpdate();
let cb = getResume();
AudioContextManager.tone(frequency, 1);
const v = pitchVolume / 0xff;
AudioContextManager.tone(frequency, v);
if (ms <= 0) cb();
else {
setTimeout(() => {
@ -129,4 +145,11 @@ namespace pxsim.pins {
}, ms);
}
}
export function pushButton(pinId: number) {
const b = board();
if (!b) return;
const ec = b.edgeConnectorState;
// TODO support buttons here
}
}

View File

@ -86,9 +86,11 @@ namespace pxsim {
export class EdgeConnectorState {
pins: Pin[];
pitchVolume: number;
constructor(public props: EdgeConnectorProps) {
this.pins = props.pins.map(id => id != undefined ? new Pin(id) : null);
this.pitchVolume = 0xff
}
public getPin(id: number) {

View File

@ -19,51 +19,52 @@ namespace pxsim {
}
export class Image extends RefObject {
public static height: number = 5;
public height: number;
public width: number;
public data: number[];
constructor(width: number, data: number[]) {
super();
this.width = width;
this.data = data;
this.height = (this.data.length / this.width) | 0;
}
public print() {
console.debug(`Image id:${this.id} size:${this.width}x${Image.height}`)
console.debug(`Image id:${this.id} size:${this.width}x${this.height}`)
}
public get(x: number, y: number): number {
x = x >> 0;
y = y >> 0;
if (x < 0 || x >= this.width || y < 0 || y >= 5) return 0;
x = x | 0;
y = y | 0;
if (x < 0 || x >= this.width || y < 0 || y >= this.height) return 0;
return this.data[y * this.width + x];
}
public set(x: number, y: number, v: number) {
x = x >> 0;
y = y >> 0;
if (x < 0 || x >= this.width || y < 0 || y >= 5) return;
x = x | 0;
y = y | 0;
if (x < 0 || x >= this.width || y < 0 || y >= this.height) return;
this.data[y * this.width + x] = Math.max(0, Math.min(255, v));
}
public copyTo(xSrcIndex: number, length: number, target: Image, xTargetIndex: number): void {
xSrcIndex = xSrcIndex >> 0;
length = length >> 0;
xTargetIndex = xTargetIndex >> 0;
xSrcIndex = xSrcIndex | 0;
length = length | 0;
xTargetIndex = xTargetIndex | 0;
for (let x = 0; x < length; x++) {
for (let y = 0; y < 5; y++) {
for (let y = 0; y < this.height; y++) {
let value = this.get(xSrcIndex + x, y);
target.set(xTargetIndex + x, y, value);
}
}
}
public shiftLeft(cols: number) {
cols = cols >> 0;
cols = cols | 0;
for (let x = 0; x < this.width; ++x)
for (let y = 0; y < 5; ++y)
for (let y = 0; y < this.height; ++y)
this.set(x, y, x < this.width - cols ? this.get(x + cols, y) : 0);
}
public shiftRight(cols: number) {
cols = cols >> 0;
for (let x = this.width - 1; x >= 0; --x)
for (let y = 0; y < 5; ++y)
for (let y = 0; y < this.height; ++y)
this.set(x, y, x >= cols ? this.get(x - cols, y) : 0);
}
@ -85,7 +86,7 @@ namespace pxsim {
}
export function createImageFromBuffer(data: number[]): Image {
return new Image(data.length / 5, data);
return new Image((data.length / 5) | 0, data);
}
export function createImageFromString(text: string): Image {
@ -110,15 +111,14 @@ namespace pxsim {
return sprite;
}
export const FONT_DATA = [0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x8, 0x8, 0x0, 0x8, 0xa, 0x4a, 0x40, 0x0, 0x0, 0xa, 0x5f, 0xea, 0x5f, 0xea, 0xe, 0xd9, 0x2e, 0xd3, 0x6e, 0x19, 0x32, 0x44, 0x89, 0x33, 0xc, 0x92, 0x4c, 0x92, 0x4d, 0x8, 0x8, 0x0, 0x0, 0x0, 0x4, 0x88, 0x8, 0x8, 0x4, 0x8, 0x4, 0x84, 0x84, 0x88, 0x0, 0xa, 0x44, 0x8a, 0x40, 0x0, 0x4, 0x8e, 0xc4, 0x80, 0x0, 0x0, 0x0, 0x4, 0x88, 0x0, 0x0, 0xe, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x0, 0x1, 0x22, 0x44, 0x88, 0x10, 0xc, 0x92, 0x52, 0x52, 0x4c, 0x4, 0x8c, 0x84, 0x84, 0x8e, 0x1c, 0x82, 0x4c, 0x90, 0x1e, 0x1e, 0xc2, 0x44, 0x92, 0x4c, 0x6, 0xca, 0x52, 0x5f, 0xe2, 0x1f, 0xf0, 0x1e, 0xc1, 0x3e, 0x2, 0x44, 0x8e, 0xd1, 0x2e, 0x1f, 0xe2, 0x44, 0x88, 0x10, 0xe, 0xd1, 0x2e, 0xd1, 0x2e, 0xe, 0xd1, 0x2e, 0xc4, 0x88, 0x0, 0x8, 0x0, 0x8, 0x0, 0x0, 0x4, 0x80, 0x4, 0x88, 0x2, 0x44, 0x88, 0x4, 0x82, 0x0, 0xe, 0xc0, 0xe, 0xc0, 0x8, 0x4, 0x82, 0x44, 0x88, 0xe, 0xd1, 0x26, 0xc0, 0x4, 0xe, 0xd1, 0x35, 0xb3, 0x6c, 0xc, 0x92, 0x5e, 0xd2, 0x52, 0x1c, 0x92, 0x5c, 0x92, 0x5c, 0xe, 0xd0, 0x10, 0x10, 0xe, 0x1c, 0x92, 0x52, 0x52, 0x5c, 0x1e, 0xd0, 0x1c, 0x90, 0x1e, 0x1e, 0xd0, 0x1c, 0x90, 0x10, 0xe, 0xd0, 0x13, 0x71, 0x2e, 0x12, 0x52, 0x5e, 0xd2, 0x52, 0x1c, 0x88, 0x8, 0x8, 0x1c, 0x1f, 0xe2, 0x42, 0x52, 0x4c, 0x12, 0x54, 0x98, 0x14, 0x92, 0x10, 0x10, 0x10, 0x10, 0x1e, 0x11, 0x3b, 0x75, 0xb1, 0x31, 0x11, 0x39, 0x35, 0xb3, 0x71, 0xc, 0x92, 0x52, 0x52, 0x4c, 0x1c, 0x92, 0x5c, 0x90, 0x10, 0xc, 0x92, 0x52, 0x4c, 0x86, 0x1c, 0x92, 0x5c, 0x92, 0x51, 0xe, 0xd0, 0xc, 0x82, 0x5c, 0x1f, 0xe4, 0x84, 0x84, 0x84, 0x12, 0x52, 0x52, 0x52, 0x4c, 0x11, 0x31, 0x31, 0x2a, 0x44, 0x11, 0x31, 0x35, 0xbb, 0x71, 0x12, 0x52, 0x4c, 0x92, 0x52, 0x11, 0x2a, 0x44, 0x84, 0x84, 0x1e, 0xc4, 0x88, 0x10, 0x1e, 0xe, 0xc8, 0x8, 0x8, 0xe, 0x10, 0x8, 0x4, 0x82, 0x41, 0xe, 0xc2, 0x42, 0x42, 0x4e, 0x4, 0x8a, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8, 0x4, 0x80, 0x0, 0x0, 0x0, 0xe, 0xd2, 0x52, 0x4f, 0x10, 0x10, 0x1c, 0x92, 0x5c, 0x0, 0xe, 0xd0, 0x10, 0xe, 0x2, 0x42, 0x4e, 0xd2, 0x4e, 0xc, 0x92, 0x5c, 0x90, 0xe, 0x6, 0xc8, 0x1c, 0x88, 0x8, 0xe, 0xd2, 0x4e, 0xc2, 0x4c, 0x10, 0x10, 0x1c, 0x92, 0x52, 0x8, 0x0, 0x8, 0x8, 0x8, 0x2, 0x40, 0x2, 0x42, 0x4c, 0x10, 0x14, 0x98, 0x14, 0x92, 0x8, 0x8, 0x8, 0x8, 0x6, 0x0, 0x1b, 0x75, 0xb1, 0x31, 0x0, 0x1c, 0x92, 0x52, 0x52, 0x0, 0xc, 0x92, 0x52, 0x4c, 0x0, 0x1c, 0x92, 0x5c, 0x90, 0x0, 0xe, 0xd2, 0x4e, 0xc2, 0x0, 0xe, 0xd0, 0x10, 0x10, 0x0, 0x6, 0xc8, 0x4, 0x98, 0x8, 0x8, 0xe, 0xc8, 0x7, 0x0, 0x12, 0x52, 0x52, 0x4f, 0x0, 0x11, 0x31, 0x2a, 0x44, 0x0, 0x11, 0x31, 0x35, 0xbb, 0x0, 0x12, 0x4c, 0x8c, 0x92, 0x0, 0x11, 0x2a, 0x44, 0x98, 0x0, 0x1e, 0xc4, 0x88, 0x1e, 0x6, 0xc4, 0x8c, 0x84, 0x86, 0x8, 0x8, 0x8, 0x8, 0x8, 0x18, 0x8, 0xc, 0x88, 0x18, 0x0, 0x0, 0xc, 0x83, 0x60];
export function createFont(): Image {
const data = [0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x8, 0x8, 0x0, 0x8, 0xa, 0x4a, 0x40, 0x0, 0x0, 0xa, 0x5f, 0xea, 0x5f, 0xea, 0xe, 0xd9, 0x2e, 0xd3, 0x6e, 0x19, 0x32, 0x44, 0x89, 0x33, 0xc, 0x92, 0x4c, 0x92, 0x4d, 0x8, 0x8, 0x0, 0x0, 0x0, 0x4, 0x88, 0x8, 0x8, 0x4, 0x8, 0x4, 0x84, 0x84, 0x88, 0x0, 0xa, 0x44, 0x8a, 0x40, 0x0, 0x4, 0x8e, 0xc4, 0x80, 0x0, 0x0, 0x0, 0x4, 0x88, 0x0, 0x0, 0xe, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x0, 0x1, 0x22, 0x44, 0x88, 0x10, 0xc, 0x92, 0x52, 0x52, 0x4c, 0x4, 0x8c, 0x84, 0x84, 0x8e, 0x1c, 0x82, 0x4c, 0x90, 0x1e, 0x1e, 0xc2, 0x44, 0x92, 0x4c, 0x6, 0xca, 0x52, 0x5f, 0xe2, 0x1f, 0xf0, 0x1e, 0xc1, 0x3e, 0x2, 0x44, 0x8e, 0xd1, 0x2e, 0x1f, 0xe2, 0x44, 0x88, 0x10, 0xe, 0xd1, 0x2e, 0xd1, 0x2e, 0xe, 0xd1, 0x2e, 0xc4, 0x88, 0x0, 0x8, 0x0, 0x8, 0x0, 0x0, 0x4, 0x80, 0x4, 0x88, 0x2, 0x44, 0x88, 0x4, 0x82, 0x0, 0xe, 0xc0, 0xe, 0xc0, 0x8, 0x4, 0x82, 0x44, 0x88, 0xe, 0xd1, 0x26, 0xc0, 0x4, 0xe, 0xd1, 0x35, 0xb3, 0x6c, 0xc, 0x92, 0x5e, 0xd2, 0x52, 0x1c, 0x92, 0x5c, 0x92, 0x5c, 0xe, 0xd0, 0x10, 0x10, 0xe, 0x1c, 0x92, 0x52, 0x52, 0x5c, 0x1e, 0xd0, 0x1c, 0x90, 0x1e, 0x1e, 0xd0, 0x1c, 0x90, 0x10, 0xe, 0xd0, 0x13, 0x71, 0x2e, 0x12, 0x52, 0x5e, 0xd2, 0x52, 0x1c, 0x88, 0x8, 0x8, 0x1c, 0x1f, 0xe2, 0x42, 0x52, 0x4c, 0x12, 0x54, 0x98, 0x14, 0x92, 0x10, 0x10, 0x10, 0x10, 0x1e, 0x11, 0x3b, 0x75, 0xb1, 0x31, 0x11, 0x39, 0x35, 0xb3, 0x71, 0xc, 0x92, 0x52, 0x52, 0x4c, 0x1c, 0x92, 0x5c, 0x90, 0x10, 0xc, 0x92, 0x52, 0x4c, 0x86, 0x1c, 0x92, 0x5c, 0x92, 0x51, 0xe, 0xd0, 0xc, 0x82, 0x5c, 0x1f, 0xe4, 0x84, 0x84, 0x84, 0x12, 0x52, 0x52, 0x52, 0x4c, 0x11, 0x31, 0x31, 0x2a, 0x44, 0x11, 0x31, 0x35, 0xbb, 0x71, 0x12, 0x52, 0x4c, 0x92, 0x52, 0x11, 0x2a, 0x44, 0x84, 0x84, 0x1e, 0xc4, 0x88, 0x10, 0x1e, 0xe, 0xc8, 0x8, 0x8, 0xe, 0x10, 0x8, 0x4, 0x82, 0x41, 0xe, 0xc2, 0x42, 0x42, 0x4e, 0x4, 0x8a, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8, 0x4, 0x80, 0x0, 0x0, 0x0, 0xe, 0xd2, 0x52, 0x4f, 0x10, 0x10, 0x1c, 0x92, 0x5c, 0x0, 0xe, 0xd0, 0x10, 0xe, 0x2, 0x42, 0x4e, 0xd2, 0x4e, 0xc, 0x92, 0x5c, 0x90, 0xe, 0x6, 0xc8, 0x1c, 0x88, 0x8, 0xe, 0xd2, 0x4e, 0xc2, 0x4c, 0x10, 0x10, 0x1c, 0x92, 0x52, 0x8, 0x0, 0x8, 0x8, 0x8, 0x2, 0x40, 0x2, 0x42, 0x4c, 0x10, 0x14, 0x98, 0x14, 0x92, 0x8, 0x8, 0x8, 0x8, 0x6, 0x0, 0x1b, 0x75, 0xb1, 0x31, 0x0, 0x1c, 0x92, 0x52, 0x52, 0x0, 0xc, 0x92, 0x52, 0x4c, 0x0, 0x1c, 0x92, 0x5c, 0x90, 0x0, 0xe, 0xd2, 0x4e, 0xc2, 0x0, 0xe, 0xd0, 0x10, 0x10, 0x0, 0x6, 0xc8, 0x4, 0x98, 0x8, 0x8, 0xe, 0xc8, 0x7, 0x0, 0x12, 0x52, 0x52, 0x4f, 0x0, 0x11, 0x31, 0x2a, 0x44, 0x0, 0x11, 0x31, 0x35, 0xbb, 0x0, 0x12, 0x4c, 0x8c, 0x92, 0x0, 0x11, 0x2a, 0x44, 0x98, 0x0, 0x1e, 0xc4, 0x88, 0x1e, 0x6, 0xc4, 0x8c, 0x84, 0x86, 0x8, 0x8, 0x8, 0x8, 0x8, 0x18, 0x8, 0xc, 0x88, 0x18, 0x0, 0x0, 0xc, 0x83, 0x60];
let nb = data.length;
let nb = FONT_DATA.length;
let n = nb / 5;
let font = createInternalImage(nb);
for (let c = 0; c < n; c++) {
for (let row = 0; row < 5; row++) {
let char = data[c * 5 + row];
let char = FONT_DATA[c * 5 + row];
for (let col = 0; col < 5; col++) {
if ((char & (1 << col)) != 0)
font.set((c * 5 + 4) - col, row, 255);
@ -129,6 +129,24 @@ namespace pxsim {
}
}
namespace pxsim.fonts {
export function charCodeBuffer(charCode: number): RefBuffer {
if (charCode < DAL.MICROBIT_FONT_ASCII_START || charCode > DAL.MICROBIT_FONT_ASCII_END)
return undefined;
const b = board();
const led = b.ledMatrixState;
const font = led.font;
const h = font.height;
const w = font.width;
const buf = control.createBuffer(h);
const offset = (charCode - DAL.MICROBIT_FONT_ASCII_START) * h;
for (let row = 0; row < h; ++row)
buf.data[row] = FONT_DATA[offset + row];
return buf;
}
}
namespace pxsim.images {
export function createImage(img: Image) {
return img
@ -177,7 +195,7 @@ namespace pxsim.ImageMethods {
export function height(leds: Image): number {
pxtrt.nullCheck(leds)
return Image.height;
return leds.height;
}
export function width(leds: Image): number {
@ -186,11 +204,11 @@ namespace pxsim.ImageMethods {
}
export function plotFrame(leds: Image, frame: number) {
ImageMethods.plotImage(leds, frame * Image.height);
ImageMethods.plotImage(leds, frame * leds.height);
}
export function showFrame(leds: Image, frame: number, interval: number) {
ImageMethods.showImage(leds, frame * Image.height, interval);
ImageMethods.showImage(leds, frame * leds.height, interval);
}
export function pixel(leds: Image, x: number, y: number): number {
@ -268,7 +286,7 @@ namespace pxsim.ImageMethods {
namespace pxsim.basic {
export function showNumber(x: number, interval: number) {
interval = interval >> 0;
interval |= 0;
if (interval <= 0)
interval = 1;
let leds = createImageFromString(x.toString());
@ -277,7 +295,7 @@ namespace pxsim.basic {
}
export function showString(s: string, interval: number) {
interval = interval >> 0;
interval |= 0;
if (interval <= 0)
interval = 1;
if (s.length == 0) {
@ -291,6 +309,7 @@ namespace pxsim.basic {
}
export function showLeds(leds: Image, interval: number): void {
interval |= 0;
showAnimation(leds, interval);
}
@ -300,6 +319,7 @@ namespace pxsim.basic {
}
export function showAnimation(leds: Image, interval: number): void {
interval |= 0;
ImageMethods.scrollImage(leds, 5, interval);
}
@ -310,13 +330,17 @@ namespace pxsim.basic {
namespace pxsim.led {
export function plot(x: number, y: number) {
x |= 0;
y |= 0;
board().ledMatrixState.image.set(x, y, 0xff);
runtime.queueDisplayUpdate()
}
export function plotBrightness(x: number, y: number, brightness: number) {
x |= 0;
y |= 0;
const state = board().ledMatrixState;
brightness = brightness >> 0;
brightness |= 0;
brightness = Math.max(0, Math.min(led.brightness(), brightness));
if (brightness != 0 && brightness != 0xff && state.displayMode != DisplayMode.greyscale)
state.displayMode = DisplayMode.greyscale;
@ -325,12 +349,16 @@ namespace pxsim.led {
}
export function unplot(x: number, y: number) {
x |= 0;
y |= 0;
board().ledMatrixState.image.set(x, y, 0);
runtime.queueDisplayUpdate()
}
export function point(x: number, y: number): boolean {
return !!board().ledMatrixState.image.get(x, y);
export function pointBrightness(x: number, y: number): number {
x |= 0;
y |= 0;
return board().ledMatrixState.image.get(x, y);
}
export function brightness(): number {
@ -338,7 +366,7 @@ namespace pxsim.led {
}
export function setBrightness(value: number): void {
value = value >> 0;
value |= 0;
board().ledMatrixState.brigthness = Math.max(0, Math.min(255, value));
runtime.queueDisplayUpdate()
}

View File

@ -136,6 +136,10 @@ namespace pxsim.pins {
return 0;
}
export function spiTransfer(cmd: RefBuffer, resp: RefBuffer): void {
// TODO
}
export function spiFrequency(f: number): void {
// TODO
}
@ -219,7 +223,7 @@ namespace pxsim.bluetooth {
}
export function uartReadBuffer(): RefBuffer {
return pins.createBuffer(0);
return pins.createBuffer(0);
}
export function uartReadUntil(del: string): string {
@ -241,3 +245,14 @@ namespace pxsim.bluetooth {
export function setTransmitPower(power: number) { }
}
namespace pxsim.light {
export function sendWS2812Buffer(buffer: RefBuffer, pin: number) {
pxsim.sendBufferAsm(buffer, pin)
}
export function setMode(pin: number, mode: number) {
const lp = neopixelState(pin);
if (!lp) return;
lp.mode = mode & 0xff;
}
}

View File

@ -1,13 +0,0 @@
namespace pxsim {
export function sendBufferAsm(buffer: RefBuffer, pin: DigitalPin) {
let b = board();
if (b) {
let np = b.neopixelState;
if (np) {
let buf = buffer.data;
np.updateBuffer(buf as any, pin); // TODO this is wrong
runtime.queueDisplayUpdate();
}
}
}
}

View File

@ -73,8 +73,13 @@ namespace pxsim.serial {
}
export function readBuffer(length: number) {
length |= 0;
if (length <= 0)
length = 64;
return pins.createBuffer(length);
}
export function setBaudRate(rate: number) {
// TODO
}
}