2016-04-06 00:59:25 +02:00
|
|
|
/**
|
|
|
|
* Control currents in Pins for analog/digital signals, servos, i2c, ...
|
|
|
|
*/
|
2018-10-01 23:39:51 +02:00
|
|
|
//% color=#B22222 weight=30 icon="\uf140"
|
2016-10-11 22:48:25 +02:00
|
|
|
//% advanced=true
|
2016-03-10 23:01:04 +01:00
|
|
|
namespace pins {
|
|
|
|
/**
|
|
|
|
* Re-maps a number from one range to another. That is, a value of ``from low`` would get mapped to ``to low``, a value of ``from high`` to ``to high``, values in-between to values in-between, etc.
|
|
|
|
* @param value value to map in ranges
|
|
|
|
* @param fromLow the lower bound of the value's current range
|
|
|
|
* @param fromHigh the upper bound of the value's current range, eg: 1023
|
|
|
|
* @param toLow the lower bound of the value's target range
|
|
|
|
* @param toHigh the upper bound of the value's target range, eg: 4
|
|
|
|
*/
|
2016-08-17 20:18:15 +02:00
|
|
|
//% help=pins/map weight=23
|
2018-10-05 20:09:08 +02:00
|
|
|
//% blockId=pin_map block="map %value|from low %fromLow|from high %fromHigh|to low %toLow|to high %toHigh"
|
2016-03-10 23:01:04 +01:00
|
|
|
export function map(value: number, fromLow: number, fromHigh: number, toLow: number, toHigh: number): number {
|
|
|
|
return ((value - fromLow) * (toHigh - toLow)) / (fromHigh - fromLow) + toLow;
|
|
|
|
}
|
2016-04-05 04:02:40 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Read one number from 7-bit I2C address.
|
|
|
|
*/
|
2016-11-29 17:59:54 +01:00
|
|
|
//% help=pins/i2c-read-number blockGap=8 advanced=true
|
2018-10-22 19:00:57 +02:00
|
|
|
//% blockId=pins_i2c_readnumber block="i2c read number|at address %address|of format %format|repeated %repeat" weight=7
|
2017-04-03 19:30:25 +02:00
|
|
|
export function i2cReadNumber(address: number, format: NumberFormat, repeated?: boolean): number {
|
|
|
|
let buf = pins.i2cReadBuffer(address, pins.sizeOf(format), repeated)
|
2016-04-05 04:02:40 +02:00
|
|
|
return buf.getNumber(format, 0)
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Write one number to a 7-bit I2C address.
|
|
|
|
*/
|
2016-11-29 17:59:54 +01:00
|
|
|
//% help=pins/i2c-write-number blockGap=8 advanced=true
|
2018-10-22 19:00:57 +02:00
|
|
|
//% blockId=i2c_writenumber block="i2c write number|at address %address|with value %value|of format %format|repeated %repeat" weight=6
|
2017-04-03 19:30:25 +02:00
|
|
|
export function i2cWriteNumber(address: number, value: number, format: NumberFormat, repeated?: boolean): void {
|
2016-04-05 04:02:40 +02:00
|
|
|
let buf = createBuffer(pins.sizeOf(format))
|
|
|
|
buf.setNumber(format, 0, value)
|
2017-04-03 19:30:25 +02:00
|
|
|
pins.i2cWriteBuffer(address, buf, repeated)
|
2016-04-05 04:02:40 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the size in bytes of specified number format.
|
|
|
|
*/
|
2016-05-13 12:38:52 +02:00
|
|
|
//%
|
2016-04-05 04:02:40 +02:00
|
|
|
export function sizeOf(format: NumberFormat) {
|
|
|
|
switch (format) {
|
|
|
|
case NumberFormat.Int8LE:
|
|
|
|
case NumberFormat.UInt8LE:
|
|
|
|
case NumberFormat.Int8BE:
|
|
|
|
case NumberFormat.UInt8BE:
|
|
|
|
return 1;
|
|
|
|
case NumberFormat.Int16LE:
|
|
|
|
case NumberFormat.UInt16LE:
|
|
|
|
case NumberFormat.Int16BE:
|
|
|
|
case NumberFormat.UInt16BE:
|
|
|
|
return 2;
|
|
|
|
case NumberFormat.Int32LE:
|
|
|
|
case NumberFormat.Int32BE:
|
|
|
|
return 4;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
2016-03-10 23:01:04 +01:00
|
|
|
}
|
2016-04-05 05:28:08 +02:00
|
|
|
|
|
|
|
|
|
|
|
interface Buffer {
|
|
|
|
[index: number]: number;
|
|
|
|
// rest defined in buffer.cpp
|
|
|
|
}
|