178 lines
5.4 KiB
TypeScript
178 lines
5.4 KiB
TypeScript
|
|
||
|
namespace pxsim.pins {
|
||
|
export class CommonPin extends Pin {
|
||
|
used: boolean;
|
||
|
}
|
||
|
|
||
|
export class DigitalPin extends CommonPin {
|
||
|
}
|
||
|
|
||
|
export class AnalogPin extends CommonPin {
|
||
|
|
||
|
}
|
||
|
|
||
|
export function markUsed(name: CommonPin) {
|
||
|
if (!name.used) {
|
||
|
name.used = true;
|
||
|
runtime.queueDisplayUpdate();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
namespace pxsim.DigitalPinMethods {
|
||
|
export function digitalRead(name: pins.DigitalPin): number {
|
||
|
return name.digitalReadPin();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set a pin or connector value to either 0 or 1.
|
||
|
* @param value value to set on the pin, 1 eg,0
|
||
|
*/
|
||
|
export function digitalWrite(name: pins.DigitalPin, value: number): void {
|
||
|
name.digitalWritePin(value);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Configures this pin to a digital input, and generates events where the timestamp is the duration
|
||
|
* that this pin was either ``high`` or ``low``.
|
||
|
*/
|
||
|
export function onPulsed(name: pins.DigitalPin, pulse: number, body: RefAction): void {
|
||
|
// TODO
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the duration of a pulse in microseconds
|
||
|
* @param value the value of the pulse (default high)
|
||
|
* @param maximum duration in micro-seconds
|
||
|
*/
|
||
|
export function pulseIn(name: pins.DigitalPin, pulse: number, maxDuration = 2000000): number {
|
||
|
// TODO
|
||
|
return 500;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Configures the pull of this pin.
|
||
|
* @param pull one of the mbed pull configurations: PullUp, PullDown, PullNone
|
||
|
*/
|
||
|
export function setPull(name: pins.DigitalPin, pull: number): void {
|
||
|
name.setPull(pull);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Do something when a pin is pressed.
|
||
|
* @param body the code to run when the pin is pressed
|
||
|
*/
|
||
|
export function onPressed(name: pins.DigitalPin, body: RefAction): void {
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Do something when a pin is released.
|
||
|
* @param body the code to run when the pin is released
|
||
|
*/
|
||
|
export function onReleased(name: pins.DigitalPin, body: RefAction): void {
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the pin state (pressed or not). Requires to hold the ground to close the circuit.
|
||
|
* @param name pin used to detect the touch
|
||
|
*/
|
||
|
export function isPressed(name: pins.DigitalPin): boolean {
|
||
|
return name.isTouched();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
namespace pxsim.AnalogPinMethods {
|
||
|
/**
|
||
|
* Read the connector value as analog, that is, as a value comprised between 0 and 1023.
|
||
|
*/
|
||
|
export function analogRead(name: pins.AnalogPin): number {
|
||
|
pins.markUsed(name);
|
||
|
return name.analogReadPin();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the connector value as analog. Value must be comprised between 0 and 1023.
|
||
|
* @param value value to write to the pin between ``0`` and ``1023``. eg:1023,0
|
||
|
*/
|
||
|
export function analogWrite(name: pins.AnalogPin, value: number): void {
|
||
|
pins.markUsed(name);
|
||
|
name.analogWritePin(value);
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Configures the Pulse-width modulation (PWM) of the analog output to the given value in
|
||
|
* **microseconds** or `1/1000` milliseconds.
|
||
|
* If this pin is not configured as an analog output (using `analog write pin`), the operation has
|
||
|
* no effect.
|
||
|
* @param micros period in micro seconds. eg:20000
|
||
|
*/
|
||
|
export function analogSetPeriod(name: pins.AnalogPin, micros: number): void {
|
||
|
pins.markUsed(name);
|
||
|
name.analogSetPeriod(micros);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Writes a value to the servo, controlling the shaft accordingly. On a standard servo, this will
|
||
|
* set the angle of the shaft (in degrees), moving the shaft to that orientation. On a continuous
|
||
|
* rotation servo, this will set the speed of the servo (with ``0`` being full-speed in one
|
||
|
* direction, ``180`` being full speed in the other, and a value near ``90`` being no movement).
|
||
|
* @param value angle or rotation speed, eg:180,90,0
|
||
|
*/
|
||
|
export function servoWrite(name: pins.AnalogPin, value: number): void {
|
||
|
pins.markUsed(name);
|
||
|
name.servoWritePin(value);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Configures this IO pin as an analog/pwm output, configures the period to be 20 ms, and sets the
|
||
|
* pulse width, based on the value it is given **microseconds** or `1/1000` milliseconds.
|
||
|
* @param micros pulse duration in micro seconds, eg:1500
|
||
|
*/
|
||
|
export function servoSetPulse(name: pins.AnalogPin, micros: number): void {
|
||
|
pins.markUsed(name);
|
||
|
// TODO fix pxt
|
||
|
// name.servoSetPulse(micros);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
namespace pxsim.PwmPinMethods {
|
||
|
export function analogSetPeriod(name: pins.AnalogPin, micros: number): void {
|
||
|
name.analogSetPeriod(micros);
|
||
|
}
|
||
|
|
||
|
export function servoWrite(name: pins.AnalogPin, value: number): void {
|
||
|
name.servoWritePin(value);
|
||
|
}
|
||
|
|
||
|
export function servoSetPulse(name: pins.AnalogPin, micros: number): void {
|
||
|
name.servoSetPulse(name.id, micros);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
namespace pxsim.pins {
|
||
|
export function pulseDuration(): number {
|
||
|
// bus last event timestamp
|
||
|
return 500;
|
||
|
}
|
||
|
|
||
|
export function createBuffer(sz: number) {
|
||
|
return pxsim.BufferMethods.createBuffer(sz)
|
||
|
}
|
||
|
|
||
|
export function spiWrite(value: number): number {
|
||
|
// TODO
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
export function i2cReadBuffer(address: number, size: number, repeat?: boolean): RefBuffer {
|
||
|
// fake reading zeros
|
||
|
return createBuffer(size)
|
||
|
}
|
||
|
|
||
|
export function i2cWriteBuffer(address: number, buf: RefBuffer, repeat?: boolean): void {
|
||
|
// fake - noop
|
||
|
}
|
||
|
}
|
||
|
|