pxt-calliope/libs/core/pins.cpp
Amerlander f6388ae7ab Update Pins ()
* add windows and mac icons for offline app ()

* Don't overwrite electron deploy ()

* remove baud rate as it is not support on HW ()

* add blocks for serial set tx/rx buffer size ()

* support flag argument ()

* support flag argument

* enable drop semantics

* add reentrant

* updated shims

* Bumping pxt-core to 5.15.3

* 1.4.13

* Bumping pxt-core to 5.15.4

* 1.4.14

* bump setgroup on top of radio ()

* bump setgroup on top of radio

* move group up

* Update name-tag.md ()

* add API to disable serial padding. ()

* add API to desiable serial padding.

* renamed api

* Set serial help paths for blocks ()

* Shrink the link in firmware version hint ()

* Shrink the link in firmware version hint

* fix a translation quibble

* Fix Black and White Typo ()

* Fixed typo: Back->Black

* Added Upgrade Rules to fix spelling

* Removed extra isEmpty

* Added previous BackAndWhite to allow for compilation of old scripts

* always shake when button is pressed ()

* add PLENbit ()

* Bumping pxt-core to 5.15.5

* 1.4.15

* stop background before foreground ()

* Bumping pxt-core to 5.15.6

* 1.4.16

* Bumping pxt-core to 5.15.7

* 1.4.17

* Bumping pxt-core to 5.15.8

* 1.4.18

* add backgrounds for use with .dmg ()

* add normal size and 2x size backgrounds for dmg

* update arrow color to dark gray

* Bumping pxt-core  to 5.15.9

* 1.4.19

* Adding v1-ref.json pointing to 1.2.13

* Bumping microbit to 2.0.0

* 2.0.1

* Pointing beta-ref to v2

* Bumping pxt-core to 5.15.10

* 2.0.2

* this repo is empty ()

* Update radio event parm usage descriptions ()

* add browser db prefix for v2 ()

* 2.0.3

* Releasing 2.0.3 to live ()

* dynamically sniff offline app version ()

* Revert "dynamically sniff offline app version ()" ()

This reverts commit b480b34f7e.

* Updating electron to 2.0.3 ()

* Updating offline reference to 2.0.3 ()

* Bumping version to 2.1.0

* 2.1.1

* Spelling ()

* Update write-received-packet-to-serial.md ()

A support ticket pointed out issues that they'd encountered when trying to follow this document:

- `sendValue` only supports an 8 character string. This is documented in the `sendValue` docs but a longer string had been used here
- Only `radio.onReceivedNumber` is used so the sample output is not consistent with the users experience. I've changed it so that all packets are handled

* Use gcPreAllocateBlock() to fix ,  ()

* Use gcPreAllocateBlock() to fix , 
* bump pcp 6.9.4

* 2.1.2

* Correct dice example ()

Changed random(6) to random(5) so the number reflect real dice.

* add 4tronix minibit ()

* Update targetconfig.json ()

remove mock-iot-extension as it is just an experimental development by The Foundation

* Update calibrate-compass.md ()

Based on user feedback in Slack https://microbit-community.slack.com/archives/C1ZMKRFHD/p1563274019078400?thread_ts=1563268925.077500&cid=C1ZMKRFHD

* add wukong ()

* Decrease size of GC heap to allow more DAL allocs ()

* 2.1.3

* add Kitronik view text ()

* Release 2.0.6 to live ()

* Update nexus:bit entry  ()

* update nexus:bit entry

* update nexus:bit entry

* Logic Lab mini-course ()

* Logic Lab mini-course

* example syntax

* Updating Readme with branch information.

* bump pxt for ios <=9 fix ()

* Update pxt/common-packages and fix build ()

* fix build off of pxt/ and pxt-common-packages master

* check in generated files

* add-pxt-bmp280 ()

* Bumping pxt-core to 5.19.8 & common-packages to 6.14.9

* 2.1.4

* Error codes page update ()

* Start adding new codes

* few tiny edits

* Add more errors and rearrange

* Update docs/device/error-codes.md

Co-Authored-By: Michał Moskal <michal@moskal.me>

* juggle category

* set error range in hint

Co-Authored-By: Michał Moskal <michal@moskal.me>

* Update docs/device/error-codes.md

Co-Authored-By: Mark <mark@microbit.org>

* fix build ()

* fix broken build

* just try the more 'official' fix if possible

* back to the way that actually works..

* bump pxt to include accessibility changes ()

* 2.1.5

* make hc mode sim color have higher contrast ()

* Show project settings ()

* markdown link fix ()

* add HTS221 ()

* Editor controllers fixes ()

* updated strings

* bump pxt

* anotehr attempt

* 2.1.6

* turn on samples when reading accelerometer ()

* 2.1.7

* hide pin p19/p20 ()

* Fix remove life animation causing microbit stuck ()

On the real microbit board, if the program execute other game blocks while
the remove life animation is playing, it would cause strange behavior or
even make the game stuck.

* Port of Programmable Logic lesson for Logic Lab course ()

* port of programmable logic lesson

* trigger rebuild

* express as logical equation in snippet

* go logical for snippet inputs

* emit enum as bitmask ()

* 2.1.8

* add alt attributes to download screens ()

* add alt attributes to download screens, fixes 

* better descriptions

* fixing links in translate page

* Modify the LED coordinates to be between 0 and 4. ()

Without this change, there is a 11/36 chance no LED lights as [`Math.random(a,b)`](https://docs.python.org/2/library/random.html#random.uniform) (thus the `pick random` block) chooses a number in the (inclusive, closed) interval `[a, b]`.

* Set LED plot row/column ranges for 'Reaction Time' ()

* add LIS2MDL ()

* add LIS2DW12 ()

* add LPS22 ()

* add LSM6DSO ()

* add gator environment ()

* add STTS751 ()

* add inventura extension ()

* add new sparkfun extensions ()

* add new sparkfun extensions

* remove gator environment pending fixes

* add dfplayer mini extension ()

* Update 'servo calibrator' link ()

* I2C Addressing Note ()

* I2C on-board sensor address note

* note for 7bit to 8bit shift

* Add nested summaries for newer courses ()

* bump pxt ()

* bump pxt

* bump

* bump

* fix version

* 2.1.9

* bump package.json ()

* 2.1.10

* bump pxt ()

* 2.1.11

* bump for diff3 ()

* enable experiment

* bump pxt

* 2.1.12

* Add the Stu Lowe coding cards ()

* Add the Stu Lowe coding cards

* Move 'Coding Cards' below 'Hardware'

* Add isDeleted ()

* add xinabox OD01 and breakout display section ()

* add xinabox OD01 and breakout display section

* Update targetconfig.json

* Update extensions.md

* Link to power supply limitations ()

Fixes: 

* Pxt v5.23.17 ()

* bump pxt

* regen docs

* fix version syntax

* restore extension

* removed dup

* 2.1.13

* add-sw01 ()

* Locking old issues

* add Keyestudio robot car ()

* Allow globals in reclaimed bluetooth memory ()

* isTouchingEdge() should not return true for deleted sprite ()

* add query variant to hide toolbar ()

* Adding link to stable refs ()

* Update extensions.md ()

Move the :VIEW Text32 from other to Display now there is a display sections

* 2.1.14

* fixing radio stack ()

* fixing radio stack

* updated shims

* 2.1.15

* Stable points to latest 2.0.9 ()

* Releasing 2.0.9 to live ()

* Fixing signal strength ()

* Pointing to 2.0.10

* Releasing 2.0.10 ()

With radio strength signal fix for hot or cold

* Removing old bitbot as we have a new bitbot package ()

* updated pxt ()

* updated pxt

* bump pxt

* updated react

* updated ptx

* Remove empty variable element from XML

* Bump pxt-core to 5.25.15

* bump pxt

* Bump pxt to 5.25.17

* Add precision to music slider

* 2.1.16

* add drive:bit ()

* micro:bit RSSI fix ()

* read rssi from packet

* updated shims

* fix build

* fix help

* move deprecated function to ts

* some formatting

* restore rssi block

* restory notations

* actually copy bytes

* removing logging code

* simpler wake up code

* comment

* fix build

* bump pxt

* go back to safety

* bump microbit

* restor package.json

* revert jquery v

* use macro

* check length

* bump pxt ()

* 2.1.17

* Use default resize function for microbit gesture dropdown ()

* Name Badge project page ()

* Name Bagde project page

* gotta please the summary check

* link typo, ugh

* Revert "Name Badge project page ()"

This reverts commit 2e2860632b.

* add freenove starter kit ()

* radio.setFrequencyBand support ()

* setfrequencyband support

* revert line change

* add bounds check

* Name Badge project page ()

* Name Bagde project page

* gotta please the summary check

* link typo, ugh

* get rid of the pptx

* Simplify the Fahrenheit from Celsius computation. ()

As the micro:bit introduces floating point arithmetic for both the existing `f = 18 * c / 10 + 32` computation and the new `f = 1.8 * c + 32` computation, there isn't any benefit for the former.

* Enable Polish localization ()

* bump package

* 2.1.18

* shrink maintenance gif

* 2.1.19

* Rotary phone dial ()

* some write up

* adding images

* text

* more text

* adding vids

* adding escape room

* remove newer lesson

* remove .mp4

* Card page edits

* adding image

* adding to toys

* rotary edits

* fix typo

* bump pxt 5.28.7 ()

* bump pxt

* bump to pxt 5.28.8

* 2.1.20

* bump pxt 5.28.9 ()

* 2.1.21

* bump pxt 5.28.10

* 2.1.22

* bump pxt 5.28.11

* 2.1.23

* bump pxt 5.28.12

* 2.1.24

* Update README.md

* robot unicorn ()

* robot unicorn

* Edits to the unicorn

* fix missing radio and boardname

* bump pxt 5.28.18 ()

* bump pxt 5.28.18

* updated summary

* 2.1.25

* bump pxt 5.28.21

* 2.1.26

* bump to pxt5.28.23

* 2.1.27

* Add redirect to pins info to serial heading ()

* Add redirect to pins info to serial heading

* adding links

* vump to pxt 5.28.24

* 2.1.28

* bump to pxt 5.28.26

* 2.1.29

* add build instructions

* updated build notes

* bump pxt 5.28.27

* 2.1.30

* missing svg

* remove crowdin project to disable upload from master branch

* reeanble crowdin, no upload

* 2.1.31

* bump pxt common to 6.16.25

* missing radio package

* Fix GC heap reclamation ()

* bump to pxt 5.28.31

* bump pxt 5.28.32

* 2.1.32

* 2.1.33

* fix typo

* pxt-microbit-next? ()

Since the repo https://github.com/microsoft/pxt-microbit-next doesn't exist, I am assuming that the word `next` is not meant to be here.

* Extensions: Add Inksmith Climate Action Kit ()

* Fixes for typos found in Crowdin - 11252019 ()

* Extension: add Kitronik Halo HD ()

* Extension: Add EBOTICS MIBO ()

* add Bright Wearables Brightboard ()

* Docs: Change default value in Javascript. ()

* Change default value in Javascript.

Per @microbit-mark 's suggestion, add an example of how to change the default interval value by switching to Javascript.

* edits to new example

* bump pxt 5.30.6

* 2.1.34

* update git and vscode settings

* revert changes to 2.1.28

* package-lock

* v2.1.34

* Change Hero Image

* add RVR ()

* Extension: add minicruise ()

* Fix minutes display for 'Digital Watch' project ()

* Fix minutes display for 'Digital Watch' project

* minutes less than 10

* bump pxt

* 2.1.35

* updated pxt

* 2.1.36

* package lock

* Tutorial Typo Fix

* bumppxt

* 2.1.37

* update error guide link ()

* adding radio firefly ()

* Update 'Metal Detector' example ()

* bump pxt

* 2.1.38

* typoFix

* Update Pins

* Add C7, C8 and C9 Serial Pins

* Add C7, C8 and C9 Serial Pins

* Pins update

* Add maqueen ()

* Extensions: Add DFRobot Maqueen

* fix

* revert pin C7, C8 and C9

* add extension doc file

* revert pxt bump

* Docs: Extensions remove headliner

* Remove outdated #ifdef ()

* Extensions: add servobit ()

Co-authored-by: Abhijith Chatra <abchatra@microsoft.com>

* bump to pxt 5.31.8, common 6.18.2

* 2.1.39

Co-authored-by: Joey Wunderlich <jwunderl@users.noreply.github.com>
Co-authored-by: Richard Knoll <riknoll@users.noreply.github.com>
Co-authored-by: Peli de Halleux <pelikhan@users.noreply.github.com>
Co-authored-by: Abhijith Chatra <abchatra@microsoft.com>
Co-authored-by: kimprice <kimberlymprice@ufl.edu>
Co-authored-by: Galen Nickel <v-gani@microsoft.com>
Co-authored-by: Chase Mortensen <C_Mortensen@live.com>
Co-authored-by: Mark <mark@microbit.org>
Co-authored-by: shakao <34112083+shakao@users.noreply.github.com>
Co-authored-by: Danny Yates <danny@codeaholics.org>
Co-authored-by: Sam Kent <32453267+microbit-sam@users.noreply.github.com>
Co-authored-by: Michał Moskal <michal@moskal.me>
Co-authored-by: Daryl Zuniga <Daryl.Zuniga@gmail.com>
Co-authored-by: Eric Kimsey <ekimsey@users.noreply.github.com>
Co-authored-by: Peter Brodersen <peter@ter.dk>
Co-authored-by: Leo <leo881003@gmail.com>
Co-authored-by: Asher Kach <asher.kach@gmail.com>
Co-authored-by: Franklin Tse <FranklinWhale@users.noreply.github.com>
Co-authored-by: Neal McBurnett <nealmcb@gmail.com>
Co-authored-by: Kitronik Ltd  <design@kitronik.co.uk>
Co-authored-by: Helen Leigh <48659173+helenleigh@users.noreply.github.com>
Co-authored-by: Gerard Braad <me@gbraad.nl>
Co-authored-by: Nicole Parrot <cleoqc1124@gmail.com>
2020-01-07 13:31:47 -08:00

439 lines
16 KiB
C++

#include "pxt.h"
enum class DigitalPin {
P0 = MICROBIT_ID_IO_P12, // edge connector 0
P1 = MICROBIT_ID_IO_P0, // edge connector 1
P2 = MICROBIT_ID_IO_P1, // edge connector 2
P3 = MICROBIT_ID_IO_P16, // edge connector 3
C4 = MICROBIT_ID_IO_P3, // LED matrix C1
C5 = MICROBIT_ID_IO_P4, // LED matrix C2
C6 = MICROBIT_ID_IO_P10, // LED matrix C3
C7 = MICROBIT_ID_IO_P13, // LED matrix C4
C8 = MICROBIT_ID_IO_P14, // LED matrix C5
C9 = MICROBIT_ID_IO_P15, // LED matrix C6
C10 = MICROBIT_ID_IO_P9, // LED matrix C7
C11 = MICROBIT_ID_IO_P7, // LED matrix C8
C12 = MICROBIT_ID_IO_P6, // LED matrix C9
C16 = MICROBIT_ID_IO_P2, // RX
C17 = MICROBIT_ID_IO_P8, // TX
C18 = MICROBIT_ID_IO_P20, // SDA
C19 = MICROBIT_ID_IO_P19 // SCL
};
enum class AnalogPin {
P1 = MICROBIT_ID_IO_P0, // edge connector 1
P2 = MICROBIT_ID_IO_P1, // edge connector 2
C4 = MICROBIT_ID_IO_P3, // LED matrix C1
C5 = MICROBIT_ID_IO_P4, // LED matrix C2
C6 = MICROBIT_ID_IO_P10, // LED matrix C3
C16 = MICROBIT_ID_IO_P2, // RX
C17 = MICROBIT_ID_IO_P8, // TX
MIC = MICROBIT_ID_IO_P21 // microphone
};
enum class PulseValue {
//% block=high
High = MICROBIT_PIN_EVT_PULSE_HI,
//% block=low
Low = MICROBIT_PIN_EVT_PULSE_LO
};
enum class PinPullMode {
//% block="down"
PullDown = 0,
//% block="up"
PullUp = 1,
//% block="none"
PullNone = 2
};
enum class PinEventType {
//% block="edge"
Edge = MICROBIT_PIN_EVENT_ON_EDGE,
//% block="pulse"
Pulse = MICROBIT_PIN_EVENT_ON_PULSE,
//% block="touch"
Touch = MICROBIT_PIN_EVENT_ON_TOUCH,
//% block="none"
None = MICROBIT_PIN_EVENT_NONE
};
namespace pxt
{
MicroBitPin *getPin(int id) {
switch (id) {
case MICROBIT_ID_IO_P0: return &uBit.io.P0;
case MICROBIT_ID_IO_P1: return &uBit.io.P1;
case MICROBIT_ID_IO_P2: return &uBit.io.P2;
case MICROBIT_ID_IO_P3: return &uBit.io.P3;
case MICROBIT_ID_IO_P4: return &uBit.io.P4;
case MICROBIT_ID_IO_P5: return &uBit.io.P5;
case MICROBIT_ID_IO_P6: return &uBit.io.P6;
case MICROBIT_ID_IO_P7: return &uBit.io.P7;
case MICROBIT_ID_IO_P8: return &uBit.io.P8;
case MICROBIT_ID_IO_P9: return &uBit.io.P9;
case MICROBIT_ID_IO_P10: return &uBit.io.P10;
case MICROBIT_ID_IO_P11: return &uBit.io.P11;
case MICROBIT_ID_IO_P12: return &uBit.io.P12;
case MICROBIT_ID_IO_P13: return &uBit.io.P13;
case MICROBIT_ID_IO_P14: return &uBit.io.P14;
case MICROBIT_ID_IO_P15: return &uBit.io.P15;
case MICROBIT_ID_IO_P16: return &uBit.io.P16;
case MICROBIT_ID_IO_P19: return &uBit.io.P19;
case MICROBIT_ID_IO_P20: return &uBit.io.P20;
case MICROBIT_ID_IO_P21: return &uBit.io.P21;
default: return NULL;
}
}
} // pxt
namespace pins {
#define PINOP(op) \
MicroBitPin *pin = getPin((int)name); \
if (!pin) return; \
pin->op
#define PINREAD(op) \
MicroBitPin *pin = getPin((int)name); \
if (!pin) return 0; \
return pin->op
//%
MicroBitPin *getPinAddress(int id) {
return getPin(id);
}
/**
* Read the specified pin or connector as either 0 or 1
* @param name pin to read from, eg: DigitalPin.P0
*/
//% help=pins/digital-read-pin weight=30
//% blockId=device_get_digital_pin block="digital read|pin %name" blockGap=8
//% name.fieldEditor="gridpicker" name.fieldOptions.columns=4
//% name.fieldOptions.tooltips="false" name.fieldOptions.width="300"
int digitalReadPin(DigitalPin name) {
PINREAD(getDigitalValue());
}
/**
* Set a pin or connector value to either 0 or 1.
* @param name pin to write to, eg: DigitalPin.P0
* @param value value to set on the pin, 1 eg,0
*/
//% help=pins/digital-write-pin weight=29
//% blockId=device_set_digital_pin block="digital write|pin %name|to %value"
//% value.min=0 value.max=1
//% name.fieldEditor="gridpicker" name.fieldOptions.columns=4
//% name.fieldOptions.tooltips="false" name.fieldOptions.width="300"
void digitalWritePin(DigitalPin name, int value) {
PINOP(setDigitalValue(value));
}
/**
* Read the connector value as analog, that is, as a value comprised between 0 and 1023.
* @param name pin to write to, eg: AnalogPin.P1
*/
//% help=pins/analog-read-pin weight=25
//% blockId=device_get_analog_pin block="analog read|pin %name" blockGap="8"
//% name.fieldEditor="gridpicker" name.fieldOptions.columns=4
//% name.fieldOptions.tooltips="false" name.fieldOptions.width="250"
int analogReadPin(AnalogPin name) {
PINREAD(getAnalogValue());
}
/**
* Set the connector value as analog. Value must be comprised between 0 and 1023.
* @param name pin name to write to, eg: AnalogPin.P1
* @param value value to write to the pin between ``0`` and ``1023``. eg:1023,0
*/
//% help=pins/analog-write-pin weight=24
//% blockId=device_set_analog_pin block="analog write|pin %name|to %value" blockGap=8
//% value.min=0 value.max=1023
//% name.fieldEditor="gridpicker" name.fieldOptions.columns=4
//% name.fieldOptions.tooltips="false" name.fieldOptions.width="250"
void analogWritePin(AnalogPin name, int value) {
PINOP(setAnalogValue(value));
}
/**
* Configure the pulse-width modulation (PWM) period of the analog output in microseconds.
* If this pin is not configured as an analog output (using `analog write pin`), the operation has no effect.
* @param name analog pin to set period to, eg: AnalogPin.P1
* @param micros period in micro seconds. eg:20000
*/
//% help=pins/analog-set-period weight=23 blockGap=8
//% blockId=device_set_analog_period block="analog set period|pin %pin|to (µs)%micros"
//% pin.fieldEditor="gridpicker" pin.fieldOptions.columns=4
//% pin.fieldOptions.tooltips="false"
void analogSetPeriod(AnalogPin name, int micros) {
PINOP(setAnalogPeriodUs(micros));
}
/**
* Configure the pin as a digital input and generate an event when the pin is pulsed either high or low.
* @param name digital pin to register to, eg: DigitalPin.P0
* @param pulse the value of the pulse, eg: PulseValue.High
*/
//% help=pins/on-pulsed weight=22 blockGap=16 advanced=true
//% blockId=pins_on_pulsed block="on|pin %pin|pulsed %pulse"
//% pin.fieldEditor="gridpicker" pin.fieldOptions.columns=4
//% pin.fieldOptions.tooltips="false" pin.fieldOptions.width="300"
void onPulsed(DigitalPin name, PulseValue pulse, Action body) {
MicroBitPin* pin = getPin((int)name);
if (!pin) return;
pin->eventOn(MICROBIT_PIN_EVENT_ON_PULSE);
registerWithDal((int)name, (int)pulse, body);
}
/**
* Get the duration of the last pulse in microseconds. This function should be called from a ``onPulsed`` handler.
*/
//% help=pins/pulse-duration advanced=true
//% blockId=pins_pulse_duration block="pulse duration (µs)"
//% weight=21 blockGap=8
int pulseDuration() {
return pxt::lastEvent.timestamp;
}
/**
* Return the duration of a pulse at a pin in microseconds.
* @param name the pin which measures the pulse, eg: DigitalPin.P0
* @param value the value of the pulse, eg: PulseValue.High
* @param maximum duration in microseconds
*/
//% blockId="pins_pulse_in" block="pulse in (µs)|pin %name|pulsed %value"
//% weight=20 advanced=true
//% help=pins/pulse-in
//% name.fieldEditor="gridpicker" name.fieldOptions.columns=4
//% name.fieldOptions.tooltips="false" name.fieldOptions.width="300"
int pulseIn(DigitalPin name, PulseValue value, int maxDuration = 2000000) {
MicroBitPin* pin = getPin((int)name);
if (!pin) return 0;
int pulse = value == PulseValue::High ? 1 : 0;
uint64_t tick = system_timer_current_time_us();
uint64_t maxd = (uint64_t)maxDuration;
while(pin->getDigitalValue() != pulse) {
if(system_timer_current_time_us() - tick > maxd)
return 0;
}
uint64_t start = system_timer_current_time_us();
while(pin->getDigitalValue() == pulse) {
if(system_timer_current_time_us() - tick > maxd)
return 0;
}
uint64_t end = system_timer_current_time_us();
return end - start;
}
// TODO FIX THIS IN THE DAL!
inline void fixMotorIssue(AnalogPin name) {
NRF_TIMER2->SHORTS = TIMER_SHORTS_COMPARE3_CLEAR_Msk;
NRF_TIMER2->INTENCLR = TIMER_INTENCLR_COMPARE3_Msk;
NRF_TIMER2->PRESCALER = 4;
NRF_TIMER2->CC[3] = 20000;
NRF_TIMER2->TASKS_START = 1;
NRF_TIMER2->EVENTS_COMPARE[3] = 0;
PINOP(getDigitalValue());
}
/**
* Write 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 name pin to write to, eg: AnalogPin.P1
* @param value angle or rotation speed, eg:180,90,0
*/
//% help=pins/servo-write-pin weight=20
//% blockId=device_set_servo_pin block="servo write|pin %name|to %value" blockGap=8
//% parts=microservo trackArgs=0
//% value.min=0 value.max=180
//% name.fieldEditor="gridpicker" name.fieldOptions.columns=4
//% name.fieldOptions.tooltips="false" name.fieldOptions.width="250"
void servoWritePin(AnalogPin name, int value) {
fixMotorIssue(name);
PINOP(setServoValue(value));
}
/**
* Configure the IO pin as an analog/pwm output and set a pulse width. The period is 20 ms period and the pulse width is set based on the value given in **microseconds** or `1/1000` milliseconds.
* @param name pin name
* @param micros pulse duration in micro seconds, eg:1500
*/
//% help=pins/servo-set-pulse weight=19
//% blockId=device_set_servo_pulse block="servo set pulse|pin %value|to (µs) %micros"
//% value.fieldEditor="gridpicker" value.fieldOptions.columns=4
//% value.fieldOptions.tooltips="false" value.fieldOptions.width="250"
void servoSetPulse(AnalogPin name, int micros) {
fixMotorIssue(name);
PINOP(setServoPulseUs(micros));
}
MicroBitPin* pitchPin = NULL;
/**
* Set the pin used when using analog pitch or music.
* @param name pin to modulate pitch from
*/
//% blockId=device_analog_set_pitch_pin block="analog set pitch pin %name"
//% help=pins/analog-set-pitch-pin weight=3 advanced=true
//% name.fieldEditor="gridpicker" name.fieldOptions.columns=4
//% name.fieldOptions.tooltips="false" name.fieldOptions.width="250"
void analogSetPitchPin(AnalogPin name) {
pitchPin = getPin((int)name);
}
/**
* Emit a plse-width modulation (PWM) signal to the current pitch pin. Use `analog set pitch pin` to define the pitch pin.
* @param frequency frequency to modulate in Hz.
* @param ms duration of the pitch in milli seconds.
*/
//% blockId=device_analog_pitch block="analog pitch %frequency|for (ms) %ms"
//% help=pins/analog-pitch weight=4 async advanced=true blockGap=8
void analogPitch(int frequency, int ms) {
if (pitchPin == NULL)
analogSetPitchPin(AnalogPin::P1);
if (frequency <= 0) {
pitchPin->setAnalogValue(0);
} else {
pitchPin->setAnalogValue(512);
pitchPin->setAnalogPeriodUs(1000000/frequency);
}
if (ms > 0) {
fiber_sleep(ms);
pitchPin->setAnalogValue(0);
// TODO why do we use wait_ms() here? it's a busy wait I think
wait_ms(5);
}
}
/**
* Configure the pull directiion of of a pin.
* @param name pin to set the pull mode on, eg: DigitalPin.P0
* @param pull one of the mbed pull configurations, eg: PinPullMode.PullUp
*/
//% help=pins/set-pull weight=3 advanced=true
//% blockId=device_set_pull block="set pull|pin %pin|to %pull"
//% pin.fieldEditor="gridpicker" pin.fieldOptions.columns=4
//% pin.fieldOptions.tooltips="false" pin.fieldOptions.width="300"
void setPull(DigitalPin name, PinPullMode pull) {
PinMode m = pull == PinPullMode::PullDown
? PinMode::PullDown
: pull == PinPullMode::PullUp ? PinMode::PullUp
: PinMode::PullNone;
PINOP(setPull(m));
}
/**
* Configure the events emitted by this pin. Events can be subscribed to
* using ``control.onEvent()``.
* @param name pin to set the event mode on, eg: DigitalPin.P0
* @param type the type of events for this pin to emit, eg: PinEventType.Edge
*/
//% help=pins/set-events weight=4 advanced=true
//% blockId=device_set_pin_events block="set pin %pin|to emit %type|events"
//% pin.fieldEditor="gridpicker" pin.fieldOptions.columns=4
//% pin.fieldOptions.tooltips="false" pin.fieldOptions.width="300"
void setEvents(DigitalPin name, PinEventType type) {
getPin((int)name)->eventOn((int)type);
}
/**
* Create a new zero-initialized buffer.
* @param size number of bytes in the buffer
*/
//%
Buffer createBuffer(int size)
{
return mkBuffer(NULL, size);
}
/**
* Read `size` bytes from a 7-bit I2C `address`.
*/
//%
Buffer i2cReadBuffer(int address, int size, bool repeat = false)
{
Buffer buf = createBuffer(size);
uBit.i2c.read(address << 1, (char*)buf->data, size, repeat);
return buf;
}
/**
* Write bytes to a 7-bit I2C `address`.
*/
//%
int i2cWriteBuffer(int address, Buffer buf, bool repeat = false)
{
return uBit.i2c.write(address << 1, (char*)buf->data, buf->length, repeat);
}
SPI* spi = NULL;
SPI* allocSPI() {
if (NULL == spi)
spi = new SPI(MOSI, MISO, SCK);
return spi;
}
/**
* Write to the SPI slave and return the response
* @param value Data to be sent to the SPI slave
*/
//% help=pins/spi-write weight=5 advanced=true
//% blockId=spi_write block="spi write %value"
int spiWrite(int value) {
auto p = allocSPI();
return p->write(value);
}
/**
* Set the SPI frequency
* @param frequency the clock frequency, eg: 1000000
*/
//% help=pins/spi-frequency weight=4 advanced=true
//% blockId=spi_frequency block="spi frequency %frequency"
void spiFrequency(int frequency) {
auto p = allocSPI();
p->frequency(frequency);
}
/**
* Set the SPI bits and mode
* @param bits the number of bits, eg: 8
* @param mode the mode, eg: 3
*/
//% help=pins/spi-format weight=3 advanced=true
//% blockId=spi_format block="spi format|bits %bits|mode %mode"
void spiFormat(int bits, int mode) {
auto p = allocSPI();
p->format(bits, mode);
}
/**
* Set the MOSI, MISO, SCK pins used by the SPI connection
*
*/
//% help=pins/spi-pins weight=2 advanced=true
//% blockId=spi_pins block="spi set pins|MOSI %mosi|MISO %miso|SCK %sck"
//% mosi.fieldEditor="gridpicker" mosi.fieldOptions.columns=4
//% mosi.fieldOptions.tooltips="false" mosi.fieldOptions.width="250"
//% miso.fieldEditor="gridpicker" miso.fieldOptions.columns=4
//% miso.fieldOptions.tooltips="false" miso.fieldOptions.width="250"
//% sck.fieldEditor="gridpicker" sck.fieldOptions.columns=4
//% sck.fieldOptions.tooltips="false" sck.fieldOptions.width="250"
void spiPins(DigitalPin mosi, DigitalPin miso, DigitalPin sck) {
if (NULL != spi) {
delete spi;
spi = NULL;
}
spi = new SPI(getPin((int)mosi)->name, getPin((int)miso)->name, getPin((int)sck)->name);
}
}