Move buttons to TS
This commit is contained in:
parent
17488b5c6b
commit
768e8c60f5
@ -1,225 +0,0 @@
|
|||||||
#include "pxt.h"
|
|
||||||
#include "ev3.h"
|
|
||||||
#include <pthread.h>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* User interaction on buttons
|
|
||||||
*/
|
|
||||||
enum class ButtonEvent {
|
|
||||||
//% block="click"
|
|
||||||
Click = 1,
|
|
||||||
//% block="long click"
|
|
||||||
LongClick = 2,
|
|
||||||
//% block="up"
|
|
||||||
Up = 3,
|
|
||||||
//% block="down"
|
|
||||||
Down = 4,
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Patterns for lights under the buttons.
|
|
||||||
*/
|
|
||||||
enum class LightsPattern {
|
|
||||||
Off = LED_BLACK,
|
|
||||||
Green = LED_GREEN,
|
|
||||||
Red = LED_RED,
|
|
||||||
Orange = LED_ORANGE,
|
|
||||||
GreenFlash = LED_GREEN_FLASH,
|
|
||||||
RedFlash = LED_RED_FLASH,
|
|
||||||
OrangeFlash = LED_ORANGE_FLASH,
|
|
||||||
GreenPulse = LED_GREEN_PULSE,
|
|
||||||
RedPulse = LED_RED_PULSE,
|
|
||||||
OrangePulse = LED_ORANGE_PULSE,
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace pxt {
|
|
||||||
|
|
||||||
void *buttonPoll(void *);
|
|
||||||
|
|
||||||
class Button {
|
|
||||||
public:
|
|
||||||
void *ptr;
|
|
||||||
int id;
|
|
||||||
bool wasPressed;
|
|
||||||
bool isPressed;
|
|
||||||
int timePressed;
|
|
||||||
Button(int ev3id) {
|
|
||||||
ptr = 0; // make sure we're not treated as ref-counted object
|
|
||||||
id = ev3id;
|
|
||||||
wasPressed = false;
|
|
||||||
isPressed = false;
|
|
||||||
timePressed = 0;
|
|
||||||
}
|
|
||||||
void raise(ButtonEvent ev) { raiseEvent(ID_BUTTON_BASE + id, (int)ev); }
|
|
||||||
void setPressed(bool pr) {
|
|
||||||
if (pr == isPressed)
|
|
||||||
return;
|
|
||||||
isPressed = pr;
|
|
||||||
if (isPressed) {
|
|
||||||
wasPressed = true;
|
|
||||||
timePressed = current_time_ms();
|
|
||||||
raise(ButtonEvent::Down);
|
|
||||||
} else {
|
|
||||||
raise(ButtonEvent::Up);
|
|
||||||
auto isLong = current_time_ms() - timePressed > 500;
|
|
||||||
raise(isLong ? ButtonEvent::LongClick : ButtonEvent::Click);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class WButtons {
|
|
||||||
public:
|
|
||||||
Button buttons[0];
|
|
||||||
//% indexedInstanceNS=input indexedInstanceShim=pxt::getButton
|
|
||||||
/**
|
|
||||||
* Left button.
|
|
||||||
*/
|
|
||||||
//% block="button left" weight=95
|
|
||||||
Button buttonLeft;
|
|
||||||
/**
|
|
||||||
* Right button.
|
|
||||||
*/
|
|
||||||
//% block="button right" weight=94
|
|
||||||
Button buttonRight;
|
|
||||||
/**
|
|
||||||
* Up button.
|
|
||||||
*/
|
|
||||||
//% block="button up" weight=95
|
|
||||||
Button buttonUp;
|
|
||||||
/**
|
|
||||||
* Down button.
|
|
||||||
*/
|
|
||||||
//% block="button down" weight=95
|
|
||||||
Button buttonDown;
|
|
||||||
/**
|
|
||||||
* Enter button.
|
|
||||||
*/
|
|
||||||
//% block="button enter" weight=95
|
|
||||||
Button buttonEnter;
|
|
||||||
|
|
||||||
WButtons()
|
|
||||||
: buttonLeft(BUTTON_ID_LEFT), buttonRight(BUTTON_ID_RIGHT), buttonUp(BUTTON_ID_UP),
|
|
||||||
buttonDown(BUTTON_ID_DOWN), buttonEnter(BUTTON_ID_ENTER) {
|
|
||||||
pthread_t pid;
|
|
||||||
pthread_create(&pid, NULL, buttonPoll, this);
|
|
||||||
pthread_detach(pid);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
SINGLETON(WButtons);
|
|
||||||
|
|
||||||
const int LastButtonID = (Button *)&((WButtons *)0)->buttonEnter - ((WButtons *)0)->buttons;
|
|
||||||
|
|
||||||
extern "C" uint16_t readButtons();
|
|
||||||
|
|
||||||
void *buttonPoll(void *arg) {
|
|
||||||
auto wb = (WButtons *)arg;
|
|
||||||
auto prevState = 0;
|
|
||||||
while (true) {
|
|
||||||
sleep_core_us(50000);
|
|
||||||
auto state = readButtons();
|
|
||||||
if (state == prevState)
|
|
||||||
continue;
|
|
||||||
if ((prevState & BUTTON_ID_ESCAPE) && !(state & BUTTON_ID_ESCAPE))
|
|
||||||
target_reset();
|
|
||||||
prevState = state;
|
|
||||||
for (int i = 0; i <= LastButtonID; ++i) {
|
|
||||||
auto btn = &wb->buttons[i];
|
|
||||||
btn->setPressed(!!(state & btn->id));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//%
|
|
||||||
Button *getButton(int id) {
|
|
||||||
if (!(0 <= id && id <= LastButtonID))
|
|
||||||
target_panic(42);
|
|
||||||
return &getWButtons()->buttons[id];
|
|
||||||
}
|
|
||||||
|
|
||||||
void target_init() {
|
|
||||||
OutputInit();
|
|
||||||
ButtonLedInit();
|
|
||||||
SoundInit();
|
|
||||||
|
|
||||||
getWButtons(); // always on - handles ESCAPE key
|
|
||||||
DMESG("runtime started [%s]", HardwareVersionString());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace control {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Determine the version of system software currently running.
|
|
||||||
*/
|
|
||||||
//%
|
|
||||||
String deviceFirmwareVersion() {
|
|
||||||
return mkString(HardwareVersionString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO rename this? move it somewhere?
|
|
||||||
namespace output {
|
|
||||||
/**
|
|
||||||
* Set lights.
|
|
||||||
*/
|
|
||||||
//% blockId=setLights block="set lights %pattern"
|
|
||||||
void setLights(LightsPattern pattern) {
|
|
||||||
SetLedPattern((uint8_t)pattern);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//% fixedInstances
|
|
||||||
namespace ButtonMethods {
|
|
||||||
/**
|
|
||||||
* Do something when a button (`A`, `B` or both `A` + `B`) is clicked, double clicked, etc...
|
|
||||||
* @param button the button that needs to be clicked or used
|
|
||||||
* @param event the kind of button gesture that needs to be detected
|
|
||||||
* @param body code to run when the event is raised
|
|
||||||
*/
|
|
||||||
//% help=input/button/on-event weight=99 blockGap=8
|
|
||||||
//% blockId=buttonEvent block="on %button|%event"
|
|
||||||
//% parts="buttonpair"
|
|
||||||
//% blockNamespace=input
|
|
||||||
//% button.fieldEditor="gridpicker"
|
|
||||||
//% button.fieldOptions.width=220
|
|
||||||
//% button.fieldOptions.columns=3
|
|
||||||
void onEvent(Button_ button, ButtonEvent ev, Action body) {
|
|
||||||
registerWithDal(button->id + ID_BUTTON_BASE, (int)ev, body);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if a button is pressed or not.
|
|
||||||
* @param button the button to query the request
|
|
||||||
*/
|
|
||||||
//% help=input/button/is-pressed weight=79
|
|
||||||
//% block="%button|is pressed"
|
|
||||||
//% blockId=buttonIsPressed
|
|
||||||
//% blockGap=8
|
|
||||||
//% parts="buttonpair"
|
|
||||||
//% blockNamespace=input
|
|
||||||
//% button.fieldEditor="gridpicker"
|
|
||||||
//% button.fieldOptions.width=220
|
|
||||||
//% button.fieldOptions.columns=3
|
|
||||||
bool isPressed(Button_ button) {
|
|
||||||
return button->isPressed;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* See if the button was pressed again since the last time you checked.
|
|
||||||
* @param button the button to query the request
|
|
||||||
*/
|
|
||||||
//% help=input/button/was-pressed weight=78
|
|
||||||
//% block="%button|was pressed"
|
|
||||||
//% blockId=buttonWasPressed
|
|
||||||
//% parts="buttonpair" blockGap=8
|
|
||||||
//% blockNamespace=input advanced=true
|
|
||||||
//% button.fieldEditor="gridpicker"
|
|
||||||
//% button.fieldOptions.width=220
|
|
||||||
//% button.fieldOptions.columns=3
|
|
||||||
bool wasPressed(Button_ button) {
|
|
||||||
auto res = button->wasPressed;
|
|
||||||
button->wasPressed = false;
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
}
|
|
129
libs/core/buttons.ts
Normal file
129
libs/core/buttons.ts
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
|
||||||
|
/**
|
||||||
|
* Patterns for lights under the buttons.
|
||||||
|
*/
|
||||||
|
const enum LightsPattern {
|
||||||
|
Off = 0, // LED_BLACK
|
||||||
|
Green = 1, // LED_GREEN
|
||||||
|
Red = 2, // LED_RED
|
||||||
|
Orange = 3, // LED_ORANGE
|
||||||
|
GreenFlash = 4, // LED_GREEN_FLASH
|
||||||
|
RedFlash = 5, // LED_RED_FLASH
|
||||||
|
OrangeFlash = 6, // LED_ORANGE_FLASH
|
||||||
|
GreenPulse = 7, // LED_GREEN_PULSE
|
||||||
|
RedPulse = 8, // LED_RED_PULSE
|
||||||
|
OrangePulse = 9, // LED_ORANGE_PULSE
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace input {
|
||||||
|
let btnsMM: MMap
|
||||||
|
let buttons: DevButton[]
|
||||||
|
|
||||||
|
export namespace internal {
|
||||||
|
export function getBtnsMM() {
|
||||||
|
initBtns()
|
||||||
|
return btnsMM;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function readButtons() {
|
||||||
|
let sl = btnsMM.slice(0, LMS.NUM_BUTTONS)
|
||||||
|
let ret = 0
|
||||||
|
for (let i = 0; i < sl.length; ++i) {
|
||||||
|
if (sl[i])
|
||||||
|
ret |= 1 << i
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
function initBtns() {
|
||||||
|
if (btnsMM) return
|
||||||
|
btnsMM = control.mmap("/dev/lms_ui", LMS.NUM_BUTTONS, 0)
|
||||||
|
if (!btnsMM) control.fail("no buttons?")
|
||||||
|
buttons = []
|
||||||
|
input.internal.unsafePollForChanges(50, readButtons, (prev, curr) => {
|
||||||
|
if (curr & LMS.BUTTON_ID_ESCAPE)
|
||||||
|
control.reset()
|
||||||
|
for (let b of buttons)
|
||||||
|
b.update(!!(curr & b.mask))
|
||||||
|
})
|
||||||
|
control.dmesg("runtime started, " + control.deviceFirmwareVersion())
|
||||||
|
}
|
||||||
|
|
||||||
|
class DevButton extends Button {
|
||||||
|
mask: number
|
||||||
|
constructor(mask: number) {
|
||||||
|
super()
|
||||||
|
this.mask = mask
|
||||||
|
initBtns()
|
||||||
|
buttons.push(this)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
initBtns() // always ON as it handles ESCAPE button
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Left button.
|
||||||
|
*/
|
||||||
|
//% whenUsed block="button left" weight=95 fixedInstance
|
||||||
|
export const buttonLeft: Button = new DevButton(LMS.BUTTON_ID_LEFT)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Right button.
|
||||||
|
*/
|
||||||
|
//% whenUsed block="button right" weight=94 fixedInstance
|
||||||
|
export const buttonRight: Button = new DevButton(LMS.BUTTON_ID_RIGHT)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Up button.
|
||||||
|
*/
|
||||||
|
//% whenUsed block="button up" weight=95 fixedInstance
|
||||||
|
export const buttonUp: Button = new DevButton(LMS.BUTTON_ID_UP)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Down button.
|
||||||
|
*/
|
||||||
|
//% whenUsed block="button down" weight=95 fixedInstance
|
||||||
|
export const buttonDown: Button = new DevButton(LMS.BUTTON_ID_DOWN)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enter button.
|
||||||
|
*/
|
||||||
|
//% whenUsed block="button enter" weight=95 fixedInstance
|
||||||
|
export const buttonEnter: Button = new DevButton(LMS.BUTTON_ID_ENTER)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
namespace control {
|
||||||
|
/**
|
||||||
|
* Determine the version of system software currently running.
|
||||||
|
*/
|
||||||
|
export function deviceFirmwareVersion(): string {
|
||||||
|
let buf = output.createBuffer(6)
|
||||||
|
input.internal.getBtnsMM().read(buf)
|
||||||
|
let r = ""
|
||||||
|
for (let i = 0; i < buf.length; ++i) {
|
||||||
|
let c = buf[i]
|
||||||
|
if (c == 0) break
|
||||||
|
r += String.fromCharCode(c)
|
||||||
|
}
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace output {
|
||||||
|
let currPattern: LightsPattern
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set lights.
|
||||||
|
*/
|
||||||
|
//% blockId=setLights block="set lights %pattern"
|
||||||
|
export function setLights(pattern: LightsPattern): void {
|
||||||
|
if (currPattern === pattern)
|
||||||
|
return
|
||||||
|
currPattern = pattern
|
||||||
|
let cmd = output.createBuffer(2)
|
||||||
|
cmd[0] = pattern + 48
|
||||||
|
input.internal.getBtnsMM().write(cmd)
|
||||||
|
}
|
||||||
|
}
|
@ -18,6 +18,7 @@ const enum LMS {
|
|||||||
NUM_INPUTS = 4,
|
NUM_INPUTS = 4,
|
||||||
LCD_WIDTH = 178,
|
LCD_WIDTH = 178,
|
||||||
LCD_HEIGHT = 128,
|
LCD_HEIGHT = 128,
|
||||||
|
NUM_BUTTONS = 6,
|
||||||
|
|
||||||
DEVICE_TYPE_NXT_TOUCH = 1,
|
DEVICE_TYPE_NXT_TOUCH = 1,
|
||||||
DEVICE_TYPE_NXT_LIGHT = 2,
|
DEVICE_TYPE_NXT_LIGHT = 2,
|
||||||
@ -81,5 +82,12 @@ const enum LMS {
|
|||||||
DEVICE_EVT_ANY = 0,
|
DEVICE_EVT_ANY = 0,
|
||||||
DEVICE_ID_NOTIFY = 10000,
|
DEVICE_ID_NOTIFY = 10000,
|
||||||
DEVICE_ID_NOTIFY_ONE = 10001,
|
DEVICE_ID_NOTIFY_ONE = 10001,
|
||||||
|
|
||||||
|
BUTTON_ID_UP = 0x01,
|
||||||
|
BUTTON_ID_ENTER = 0x02,
|
||||||
|
BUTTON_ID_DOWN = 0x04,
|
||||||
|
BUTTON_ID_RIGHT = 0x08,
|
||||||
|
BUTTON_ID_LEFT = 0x10,
|
||||||
|
BUTTON_ID_ESCAPE = 0x20,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
34
libs/core/enums.d.ts
vendored
34
libs/core/enums.d.ts
vendored
@ -1,40 +1,6 @@
|
|||||||
// Auto-generated. Do not edit.
|
// Auto-generated. Do not edit.
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* User interaction on buttons
|
|
||||||
*/
|
|
||||||
|
|
||||||
declare enum ButtonEvent {
|
|
||||||
//% block="click"
|
|
||||||
Click = 1,
|
|
||||||
//% block="long click"
|
|
||||||
LongClick = 2,
|
|
||||||
//% block="up"
|
|
||||||
Up = 3,
|
|
||||||
//% block="down"
|
|
||||||
Down = 4,
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Patterns for lights under the buttons.
|
|
||||||
*/
|
|
||||||
|
|
||||||
declare enum LightsPattern {
|
|
||||||
Off = 0, // LED_BLACK
|
|
||||||
Green = 1, // LED_GREEN
|
|
||||||
Red = 2, // LED_RED
|
|
||||||
Orange = 3, // LED_ORANGE
|
|
||||||
GreenFlash = 4, // LED_GREEN_FLASH
|
|
||||||
RedFlash = 5, // LED_RED_FLASH
|
|
||||||
OrangeFlash = 6, // LED_ORANGE_FLASH
|
|
||||||
GreenPulse = 7, // LED_GREEN_PULSE
|
|
||||||
RedPulse = 8, // LED_RED_PULSE
|
|
||||||
OrangePulse = 9, // LED_ORANGE_PULSE
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Drawing modes
|
* Drawing modes
|
||||||
*/
|
*/
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
namespace input.internal {
|
namespace input.internal {
|
||||||
//% shim=pxt::unsafePollForChanges
|
//% shim=pxt::unsafePollForChanges
|
||||||
function unsafePollForChanges(
|
export function unsafePollForChanges(
|
||||||
periodMs: int32,
|
periodMs: int32,
|
||||||
query: () => int32,
|
query: () => int32,
|
||||||
changeHandler: (prev: int32, curr: int32) => void
|
changeHandler: (prev: int32, curr: int32) => void
|
||||||
@ -423,8 +423,23 @@ namespace input.internal {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* User interaction on buttons
|
||||||
|
*/
|
||||||
|
const enum ButtonEvent {
|
||||||
|
//% block="click"
|
||||||
|
Click = 1,
|
||||||
|
//% block="long click"
|
||||||
|
LongClick = 2,
|
||||||
|
//% block="up"
|
||||||
|
Up = 3,
|
||||||
|
//% block="down"
|
||||||
|
Down = 4,
|
||||||
|
}
|
||||||
|
|
||||||
namespace input {
|
namespace input {
|
||||||
export class ButtonTS extends control.Component {
|
//% fixedInstances
|
||||||
|
export class Button extends control.Component {
|
||||||
private downTime: number;
|
private downTime: number;
|
||||||
private _isPressed: boolean;
|
private _isPressed: boolean;
|
||||||
private _wasPressed: boolean;
|
private _wasPressed: boolean;
|
||||||
@ -451,15 +466,34 @@ namespace input {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if button is currently pressed.
|
* Check if button is currently pressed or not.
|
||||||
|
* @param button the button to query the request
|
||||||
*/
|
*/
|
||||||
|
//% help=input/button/is-pressed weight=79
|
||||||
|
//% block="%button|is pressed"
|
||||||
|
//% blockId=buttonIsPressed
|
||||||
|
//% blockGap=8
|
||||||
|
//% parts="buttonpair"
|
||||||
|
//% blockNamespace=input
|
||||||
|
//% button.fieldEditor="gridpicker"
|
||||||
|
//% button.fieldOptions.width=220
|
||||||
|
//% button.fieldOptions.columns=3
|
||||||
isPressed() {
|
isPressed() {
|
||||||
return this._isPressed
|
return this._isPressed
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if button was pressed since last check.
|
* See if the button was pressed again since the last time you checked.
|
||||||
|
* @param button the button to query the request
|
||||||
*/
|
*/
|
||||||
|
//% help=input/button/was-pressed weight=78
|
||||||
|
//% block="%button|was pressed"
|
||||||
|
//% blockId=buttonWasPressed
|
||||||
|
//% parts="buttonpair" blockGap=8
|
||||||
|
//% blockNamespace=input advanced=true
|
||||||
|
//% button.fieldEditor="gridpicker"
|
||||||
|
//% button.fieldOptions.width=220
|
||||||
|
//% button.fieldOptions.columns=3
|
||||||
wasPressed() {
|
wasPressed() {
|
||||||
const r = this._wasPressed
|
const r = this._wasPressed
|
||||||
this._wasPressed = false
|
this._wasPressed = false
|
||||||
@ -467,13 +501,21 @@ namespace input {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Do something when a touch sensor is clicked, double clicked, etc...
|
* Do something when a button or sensor is clicked, double clicked, etc...
|
||||||
* @param button the button that needs to be clicked or used
|
* @param button the button that needs to be clicked or used
|
||||||
* @param event the kind of button gesture that needs to be detected
|
* @param event the kind of button gesture that needs to be detected
|
||||||
* @param body code to run when the event is raised
|
* @param body code to run when the event is raised
|
||||||
*/
|
*/
|
||||||
|
//% help=input/button/on-event weight=99 blockGap=8
|
||||||
|
//% blockId=buttonEvent block="on %button|%event"
|
||||||
|
//% parts="buttonpair"
|
||||||
|
//% blockNamespace=input
|
||||||
|
//% button.fieldEditor="gridpicker"
|
||||||
|
//% button.fieldOptions.width=220
|
||||||
|
//% button.fieldOptions.columns=3
|
||||||
onEvent(ev: ButtonEvent, body: () => void) {
|
onEvent(ev: ButtonEvent, body: () => void) {
|
||||||
control.onEvent(this._id, ev, body)
|
control.onEvent(this._id, ev, body)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ namespace input {
|
|||||||
export class IrSensor extends internal.UartSensor {
|
export class IrSensor extends internal.UartSensor {
|
||||||
private channel: IrRemoteChannel
|
private channel: IrRemoteChannel
|
||||||
private pollRunning: boolean
|
private pollRunning: boolean
|
||||||
private buttons: ButtonTS[];
|
private buttons: Button[];
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
super()
|
super()
|
||||||
@ -52,7 +52,7 @@ namespace input {
|
|||||||
// otherwise button events won't work
|
// otherwise button events won't work
|
||||||
this.mode = IrSensorMode.RemoteControl
|
this.mode = IrSensorMode.RemoteControl
|
||||||
for (let i = 0; i < 5; ++i) {
|
for (let i = 0; i < 5; ++i) {
|
||||||
this.buttons.push(new ButtonTS())
|
this.buttons.push(new Button())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,8 +93,22 @@ int length(MMap *s) {
|
|||||||
|
|
||||||
/** Perform ioctl(2) on the underlaying file */
|
/** Perform ioctl(2) on the underlaying file */
|
||||||
//%
|
//%
|
||||||
void ioctl(MMap *mmap, uint32_t id, Buffer data) {
|
int ioctl(MMap *mmap, uint32_t id, Buffer data) {
|
||||||
::ioctl(mmap->fd, id, data->data);
|
return ::ioctl(mmap->fd, id, data->data);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** Perform write(2) on the underlaying file */
|
||||||
|
//%
|
||||||
|
int write(MMap *mmap, Buffer data) {
|
||||||
|
return ::write(mmap->fd, data->data, data->length);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** Perform read(2) on the underlaying file */
|
||||||
|
//%
|
||||||
|
int read(MMap *mmap, Buffer data) {
|
||||||
|
return ::read(mmap->fd, data->data, data->length);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -16,6 +16,14 @@ extern "C" int WriteToPWMDevice(char *bytes, int num_bytes);
|
|||||||
|
|
||||||
//%
|
//%
|
||||||
void writePWM(Buffer buf) {
|
void writePWM(Buffer buf) {
|
||||||
WriteToPWMDevice((char*)buf->data, buf->length);
|
WriteToPWMDevice((char *)buf->data, buf->length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace pxt {
|
||||||
|
|
||||||
|
void target_init() {
|
||||||
|
OutputInit();
|
||||||
|
SoundInit();
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -9,7 +9,7 @@
|
|||||||
"linux.cpp",
|
"linux.cpp",
|
||||||
"mmap.cpp",
|
"mmap.cpp",
|
||||||
"control.cpp",
|
"control.cpp",
|
||||||
"buttons.cpp",
|
"buttons.ts",
|
||||||
"screen.cpp",
|
"screen.cpp",
|
||||||
"screen.ts",
|
"screen.ts",
|
||||||
"output.cpp",
|
"output.cpp",
|
||||||
|
108
libs/core/shims.d.ts
vendored
108
libs/core/shims.d.ts
vendored
@ -32,7 +32,15 @@ declare interface MMap {
|
|||||||
|
|
||||||
/** Perform ioctl(2) on the underlaying file */
|
/** Perform ioctl(2) on the underlaying file */
|
||||||
//% shim=MMapMethods::ioctl
|
//% shim=MMapMethods::ioctl
|
||||||
ioctl(id: uint32, data: Buffer): void;
|
ioctl(id: uint32, data: Buffer): int32;
|
||||||
|
|
||||||
|
/** Perform write(2) on the underlaying file */
|
||||||
|
//% shim=MMapMethods::write
|
||||||
|
write(data: Buffer): int32;
|
||||||
|
|
||||||
|
/** Perform read(2) on the underlaying file */
|
||||||
|
//% shim=MMapMethods::read
|
||||||
|
read(data: Buffer): int32;
|
||||||
}
|
}
|
||||||
declare namespace control {
|
declare namespace control {
|
||||||
|
|
||||||
@ -62,104 +70,6 @@ declare namespace serial {
|
|||||||
//% shim=serial::writeDmesg
|
//% shim=serial::writeDmesg
|
||||||
function writeDmesg(): void;
|
function writeDmesg(): void;
|
||||||
}
|
}
|
||||||
declare namespace input {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Left button.
|
|
||||||
*/
|
|
||||||
//% indexedInstanceNS=input indexedInstanceShim=pxt::getButton
|
|
||||||
//% block="button left" weight=95 fixedInstance shim=pxt::getButton(0)
|
|
||||||
const buttonLeft: Button;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Right button.
|
|
||||||
*/
|
|
||||||
//% block="button right" weight=94 fixedInstance shim=pxt::getButton(1)
|
|
||||||
const buttonRight: Button;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Up button.
|
|
||||||
*/
|
|
||||||
//% block="button up" weight=95 fixedInstance shim=pxt::getButton(2)
|
|
||||||
const buttonUp: Button;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Down button.
|
|
||||||
*/
|
|
||||||
//% block="button down" weight=95 fixedInstance shim=pxt::getButton(3)
|
|
||||||
const buttonDown: Button;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Enter button.
|
|
||||||
*/
|
|
||||||
//% block="button enter" weight=95 fixedInstance shim=pxt::getButton(4)
|
|
||||||
const buttonEnter: Button;
|
|
||||||
}
|
|
||||||
declare namespace control {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Determine the version of system software currently running.
|
|
||||||
*/
|
|
||||||
//% shim=control::deviceFirmwareVersion
|
|
||||||
function deviceFirmwareVersion(): string;
|
|
||||||
}
|
|
||||||
declare namespace output {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set lights.
|
|
||||||
*/
|
|
||||||
//% blockId=setLights block="set lights %pattern" shim=output::setLights
|
|
||||||
function setLights(pattern: LightsPattern): void;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//% fixedInstances
|
|
||||||
declare interface Button {
|
|
||||||
/**
|
|
||||||
* Do something when a button (`A`, `B` or both `A` + `B`) is clicked, double clicked, etc...
|
|
||||||
* @param button the button that needs to be clicked or used
|
|
||||||
* @param event the kind of button gesture that needs to be detected
|
|
||||||
* @param body code to run when the event is raised
|
|
||||||
*/
|
|
||||||
//% help=input/button/on-event weight=99 blockGap=8
|
|
||||||
//% blockId=buttonEvent block="on %button|%event"
|
|
||||||
//% parts="buttonpair"
|
|
||||||
//% blockNamespace=input
|
|
||||||
//% button.fieldEditor="gridpicker"
|
|
||||||
//% button.fieldOptions.width=220
|
|
||||||
//% button.fieldOptions.columns=3 shim=ButtonMethods::onEvent
|
|
||||||
onEvent(ev: ButtonEvent, body: () => void): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if a button is pressed or not.
|
|
||||||
* @param button the button to query the request
|
|
||||||
*/
|
|
||||||
//% help=input/button/is-pressed weight=79
|
|
||||||
//% block="%button|is pressed"
|
|
||||||
//% blockId=buttonIsPressed
|
|
||||||
//% blockGap=8
|
|
||||||
//% parts="buttonpair"
|
|
||||||
//% blockNamespace=input
|
|
||||||
//% button.fieldEditor="gridpicker"
|
|
||||||
//% button.fieldOptions.width=220
|
|
||||||
//% button.fieldOptions.columns=3 shim=ButtonMethods::isPressed
|
|
||||||
isPressed(): boolean;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* See if the button was pressed again since the last time you checked.
|
|
||||||
* @param button the button to query the request
|
|
||||||
*/
|
|
||||||
//% help=input/button/was-pressed weight=78
|
|
||||||
//% block="%button|was pressed"
|
|
||||||
//% blockId=buttonWasPressed
|
|
||||||
//% parts="buttonpair" blockGap=8
|
|
||||||
//% blockNamespace=input advanced=true
|
|
||||||
//% button.fieldEditor="gridpicker"
|
|
||||||
//% button.fieldOptions.width=220
|
|
||||||
//% button.fieldOptions.columns=3 shim=ButtonMethods::wasPressed
|
|
||||||
wasPressed(): boolean;
|
|
||||||
}
|
|
||||||
declare namespace screen {
|
declare namespace screen {
|
||||||
|
|
||||||
/** Draw text. */
|
/** Draw text. */
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
namespace input {
|
namespace input {
|
||||||
export class TouchSensor extends internal.AnalogSensor {
|
export class TouchSensor extends internal.AnalogSensor {
|
||||||
button: ButtonTS;
|
button: Button;
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
super()
|
super()
|
||||||
this.button = new ButtonTS()
|
this.button = new Button()
|
||||||
}
|
}
|
||||||
|
|
||||||
_query() {
|
_query() {
|
||||||
|
Loading…
Reference in New Issue
Block a user