Compare commits

..

6 Commits

Author SHA1 Message Date
5ab3a6ae96 1.4.23 2020-09-10 23:40:51 -07:00
ed2e1f23e9 Change timeout 1s -> 5s to reduce Timeout errors (#988) 2020-09-11 08:25:12 +02:00
a157943bf7 Read default volume from device settings at start (#987) 2020-09-09 12:06:33 -07:00
40aaf0fb18 1.4.22 2020-09-08 23:54:42 -07:00
b26cf289c3 Change sound volume to level (#986) 2020-09-08 23:53:33 -07:00
f0821f8d6c cherry-pick Cooperate (#985)
* cooperate pause

* fix math

* update lastPause before pausing

* faster cooperation

Co-authored-by: Peli de Halleux <peli@DESKTOP-5B7QRAM.corp.microsoft.com>
2020-08-21 06:09:01 +02:00
13 changed files with 101 additions and 34 deletions

View File

@ -27,7 +27,6 @@ while (true) {
music.playSoundEffectUntilDone(sounds.mechanicalMotorStart) music.playSoundEffectUntilDone(sounds.mechanicalMotorStart)
music.playSoundEffectUntilDone(sounds.mechanicalMotorIdle); music.playSoundEffectUntilDone(sounds.mechanicalMotorIdle);
} }
pause(1);
} }
``` ```
@ -43,6 +42,5 @@ while (true) {
music.playSoundEffectUntilDone(sounds.mechanicalMotorStart) music.playSoundEffectUntilDone(sounds.mechanicalMotorStart)
music.playSoundEffectUntilDone(sounds.mechanicalMotorIdle); music.playSoundEffectUntilDone(sounds.mechanicalMotorIdle);
} }
pause(1);
} }
``` ```

View File

@ -116,7 +116,7 @@ export class Ev3Wrapper {
if (this.dataDump) if (this.dataDump)
log("TALK: " + U.toHex(buf)) log("TALK: " + U.toHex(buf))
return this.io.sendPacketAsync(buf) return this.io.sendPacketAsync(buf)
.then(() => this.msgs.shiftAsync(1000)) .then(() => this.msgs.shiftAsync(5000))
.then(resp => { .then(resp => {
if (resp[2] != buf[2] || resp[3] != buf[3]) if (resp[2] != buf[2] || resp[3] != buf[3])
U.userError("msg count de-sync") U.userError("msg count de-sync")

10
libs/base/shims.d.ts vendored
View File

@ -87,12 +87,6 @@ declare interface Buffer {
*/ */
//% shim=BufferMethods::write //% shim=BufferMethods::write
write(dstOffset: int32, src: Buffer): void; write(dstOffset: int32, src: Buffer): void;
/**
* Compute k-bit FNV-1 non-cryptographic hash of the buffer.
*/
//% shim=BufferMethods::hash
hash(bits: int32): uint32;
} }
declare namespace control { declare namespace control {
@ -100,14 +94,14 @@ declare namespace control {
* Create a new zero-initialized buffer. * Create a new zero-initialized buffer.
* @param size number of bytes in the buffer * @param size number of bytes in the buffer
*/ */
//% deprecated=1 shim=control::createBuffer //% shim=control::createBuffer
function createBuffer(size: int32): Buffer; function createBuffer(size: int32): Buffer;
/** /**
* Create a new buffer with UTF8-encoded string * Create a new buffer with UTF8-encoded string
* @param str the string to put in the buffer * @param str the string to put in the buffer
*/ */
//% deprecated=1 shim=control::createBufferFromUTF8 //% shim=control::createBufferFromUTF8
function createBufferFromUTF8(str: string): Buffer; function createBufferFromUTF8(str: string): Buffer;
} }
declare namespace loops { declare namespace loops {

11
libs/core/cooperate.ts Normal file
View File

@ -0,0 +1,11 @@
namespace control {
let lastPause = 0;
const COOPERATION_INTERVAL = 20
export function cooperate() {
const now = control.millis()
if (now - lastPause > COOPERATION_INTERVAL) {
lastPause = now
pause(1)
}
}
}

View File

@ -21,8 +21,7 @@ namespace sensors.internal {
const now = control.millis(); const now = control.millis();
if (now - this.lastQuery >= this.interval * 2) if (now - this.lastQuery >= this.interval * 2)
this.queryAndUpdate(); // sensor poller is not allowed to run this.queryAndUpdate(); // sensor poller is not allowed to run
if (now - this.lastPause >= this.interval * 5) control.cooperate(); // allow events to trigger
pause(1); // allow events to trigger
} }
private queryAndUpdate() { private queryAndUpdate() {

View File

@ -124,7 +124,7 @@ namespace motors {
export function stopAll() { export function stopAll() {
const b = mkCmd(Output.ALL, DAL.opOutputStop, 0) const b = mkCmd(Output.ALL, DAL.opOutputStop, 0)
writePWM(b); writePWM(b);
pause(1); control.cooperate();
} }
/** /**
@ -136,7 +136,7 @@ namespace motors {
//% help=motors/reset-all //% help=motors/reset-all
export function resetAll() { export function resetAll() {
reset(Output.ALL) reset(Output.ALL)
pause(1); control.cooperate();
} }
interface MoveSchedule { interface MoveSchedule {
@ -269,7 +269,7 @@ namespace motors {
if (this._brake && this._brakeSettleTime > 0) if (this._brake && this._brakeSettleTime > 0)
pause(this._brakeSettleTime); pause(this._brakeSettleTime);
else { else {
pause(1); control.cooperate();
} }
} }
@ -280,7 +280,7 @@ namespace motors {
// allow robot to settle // allow robot to settle
this.settle(); this.settle();
} else { } else {
pause(1); control.cooperate();
} }
} }
@ -357,7 +357,7 @@ namespace motors {
// special: 0 is infinity // special: 0 is infinity
if (schedule.steps[0] + schedule.steps[1] + schedule.steps[2] == 0) { if (schedule.steps[0] + schedule.steps[1] + schedule.steps[2] == 0) {
this._run(schedule.speed); this._run(schedule.speed);
pause(1); control.cooperate();
return; return;
} }

View File

@ -28,7 +28,8 @@
"platform.h", "platform.h",
"platform.cpp", "platform.cpp",
"dmesg.cpp", "dmesg.cpp",
"integrator.ts" "integrator.ts",
"cooperate.ts"
], ],
"testFiles": [ "testFiles": [
"test.ts" "test.ts"

View File

@ -12,4 +12,5 @@ music.setTempo(120)
music.noteFrequency(Note.C) music.noteFrequency(Note.C)
music.beat() music.beat()
music.setVolume(50) music.setVolume(50)
music.volume()
``` ```

View File

@ -13,7 +13,22 @@
namespace music { namespace music {
uint8_t currVolume = 50; int _readSystemVolume() {
char ParBuf[8];
int volume;
int fd = open("../sys/settings/Volume.rtf", O_RDONLY);
read(fd, ParBuf, sizeof(ParBuf));
close(fd);
if (sscanf(ParBuf,"%d",&volume) > 0) {
if ((volume >= 0) && (volume <= 100)) {
return volume;
}
}
return 50;
}
uint8_t currVolume = _readSystemVolume();
uint8_t *lmsSoundMMap; uint8_t *lmsSoundMMap;
int writeDev(void *data, int size) { int writeDev(void *data, int size) {
@ -37,6 +52,18 @@ void setVolume(int volume) {
currVolume = max(0, min(100, volume)); currVolume = max(0, min(100, volume));
} }
/**
* Return the output volume of the sound synthesizer.
*/
//% weight=96
//% blockId=synth_get_volume block="volume"
//% parts="speaker" blockGap=8
//% help=music/volume
//% weight=1
int volume() {
return currVolume;
}
#define SOUND_CMD_BREAK 0 #define SOUND_CMD_BREAK 0
#define SOUND_CMD_TONE 1 #define SOUND_CMD_TONE 1
#define SOUND_CMD_PLAY 2 #define SOUND_CMD_PLAY 2
@ -45,7 +72,7 @@ void setVolume(int volume) {
struct ToneCmd { struct ToneCmd {
uint8_t cmd; uint8_t cmd;
uint8_t vol; uint8_t lvl;
uint16_t freq; uint16_t freq;
uint16_t duration; uint16_t duration;
}; };
@ -55,10 +82,26 @@ static void _stopSound() {
writeDev(&cmd, sizeof(cmd)); writeDev(&cmd, sizeof(cmd));
} }
static uint8_t _getVolumeLevel(uint8_t volume, uint8_t levels) {
uint8_t level;
uint8_t step = (uint8_t) (100 / (levels - 1));
if (volume < step) {
level = 0;
} else if (volume > step * (levels - 1)) {
level = levels;
} else {
level = (uint8_t) (volume / step);
}
return level;
}
static void _playTone(uint16_t frequency, uint16_t duration, uint8_t volume) { static void _playTone(uint16_t frequency, uint16_t duration, uint8_t volume) {
// https://github.com/mindboards/ev3sources/blob/78ebaf5b6f8fe31cc17aa5dce0f8e4916a4fc072/lms2012/c_sound/source/c_sound.c#L471
uint8_t level = _getVolumeLevel(volume, 13);
ToneCmd cmd; ToneCmd cmd;
cmd.cmd = SOUND_CMD_TONE; cmd.cmd = SOUND_CMD_TONE;
cmd.vol = volume; cmd.lvl = level;
cmd.freq = frequency; cmd.freq = frequency;
cmd.duration = duration; cmd.duration = duration;
// (*SoundInstance.pSound).Busy = TRUE; // (*SoundInstance.pSound).Busy = TRUE;
@ -122,7 +165,8 @@ void playSample(Buffer buf) {
stopUser(); stopUser();
pthread_mutex_lock(&pumpMutex); pthread_mutex_lock(&pumpMutex);
*lmsSoundMMap = 1; // BUSY *lmsSoundMMap = 1; // BUSY
uint8_t cmd[] = {SOUND_CMD_PLAY, (uint8_t)((currVolume / 33) + 1)}; // https://github.com/mindboards/ev3sources/blob/78ebaf5b6f8fe31cc17aa5dce0f8e4916a4fc072/lms2012/c_sound/source/c_sound.c#L605
uint8_t cmd[] = {SOUND_CMD_PLAY, _getVolumeLevel(currVolume, 8)};
writeDev(cmd, 2); writeDev(cmd, 2);
decrRC(currentSample); decrRC(currentSample);
currentSample = buf; currentSample = buf;

10
libs/music/shims.d.ts vendored
View File

@ -13,6 +13,16 @@ declare namespace music {
//% weight=1 shim=music::setVolume //% weight=1 shim=music::setVolume
function setVolume(volume: int32): void; function setVolume(volume: int32): void;
/**
* Return the output volume of the sound synthesizer.
*/
//% weight=96
//% blockId=synth_get_volume block="volume"
//% parts="speaker" blockGap=8
//% help=music/volume
//% weight=1 shim=music::volume
function volume(): int32;
/** /**
* Play a tone through the speaker for some amount of time. * Play a tone through the speaker for some amount of time.
* @param frequency pitch of the tone to play in Hertz (Hz), eg: Note.C * @param frequency pitch of the tone to play in Hertz (Hz), eg: Note.C

View File

@ -5,3 +5,4 @@ music.playTone(1440, 500)
pause(500) pause(500)
music.playTone(2440, 500) music.playTone(2440, 500)
pause(500) pause(500)
music.volume()

View File

@ -1,6 +1,6 @@
{ {
"name": "pxt-ev3", "name": "pxt-ev3",
"version": "1.4.21", "version": "1.4.23",
"description": "LEGO MINDSTORMS EV3 for Microsoft MakeCode", "description": "LEGO MINDSTORMS EV3 for Microsoft MakeCode",
"private": false, "private": false,
"keywords": [ "keywords": [
@ -32,21 +32,21 @@
"docs/*/*/*.md" "docs/*/*/*.md"
], ],
"devDependencies": { "devDependencies": {
"typescript": "2.6.1",
"react": "16.8.3", "react": "16.8.3",
"semantic-ui-less": "2.2.14",
"@types/bluebird": "2.0.33",
"@types/marked": "0.3.0",
"@types/node": "8.0.53",
"webfonts-generator": "^0.4.0", "webfonts-generator": "^0.4.0",
"@types/jquery": "3.2.16", "@types/jquery": "3.2.16",
"@types/react": "16.0.25", "@types/react": "16.0.25",
"@types/react-dom": "16.0.3", "@types/react-dom": "16.0.3",
"@types/web-bluetooth": "0.0.4", "@types/web-bluetooth": "0.0.4"
"@types/bluebird": "^2.0.33",
"@types/marked": "^0.3.0",
"@types/node": "^9.3.0",
"semantic-ui-less": "2.2.14",
"typescript": "^3.7.5"
}, },
"dependencies": { "dependencies": {
"pxt-common-packages": "8.1.3", "pxt-common-packages": "6.18.2",
"pxt-core": "6.2.8" "pxt-core": "5.32.3"
}, },
"scripts": { "scripts": {
"test": "node node_modules/pxt-core/built/pxt.js travis" "test": "node node_modules/pxt-core/built/pxt.js travis"

View File

@ -7,6 +7,14 @@ namespace pxsim.music {
export function stopAllSounds() { export function stopAllSounds() {
SoundMethods.stop() SoundMethods.stop()
} }
pxsim.music.setVolume = (volume: number): void => {
pxsim.getAudioState().volume = volume;
};
export function volume() {
return pxsim.getAudioState().volume;
}
} }
namespace pxsim.SoundMethods { namespace pxsim.SoundMethods {