|
Doh! I had the low and high bytes switched on the items below which can be
passed one or more frequencies. Now I have actually tested this code and it
does, indeed, work (with the low and high bytes in the correct order). I've
also slightly changed the 3 preprocessor macros below which take no parameters.
Now they look like functions rather than constants. And, lastly, I changed the
name of the GateOn macro to be just Gate (to match the MindScript "gate" command
name more closely).
I'm working on some of the other Spybot features (eeprom, find world, etc) and
should have something shortly. I'd like to gauge interest regarding NQC and
Spybotics. Anybody out there still trying to use these programmable bricks?
I'd like to more fully support the Spybot in BricxCC but I'm not sure how much
effort they are worth if nobody is interested. Of course, I'd also like to get
pbForth and leJOS support up to par, and ... a million other things.
// --- start of spy.nqh additions ---
#define SOUNDEFFECT __res 2
#define Gate(o, p) 0x62, p, o
#define GateOff() 0x70
#define Glide(s, p, t) 0x45, t, s & 0xFF, s >> 8, p & 0xFF, p >> 8
#define Vibrato(s, p, t) 0x55, t, s & 0xFF, s >> 8, p & 0xFF, p >> 8
#define WaitEffect(t) 0x21, t
#define FixedWaitEffect(t) 0x81, t
#define Tone(f, t) 0x33, t, f & 0xFF, f >> 8
#define FixedTone(f, t) 0x93, t, f & 0xFF, f >> 8
#define RepeatEffect() 0x10
#define AnimateLED(f, t) f, t
#define RepeatAnimation() 0xFF, 0
#define EffectSound() @(0x350000) // Sound Effects control registers (0,1)
#define EffectTime() @(0x350001)
__nolist void SetEffectSound(const int &s) { Set(EffectSound(), s); }
__nolist void SetEffectTime(const int &t) { Set(EffectTime(), t); }
// --- end of spy.nqh additions ---
And here is a sample NQC program demonstrating the use of these Spybotics API
definitions:
#include "spy.nqh"
SOUNDEFFECT my_effect {
Gate(1, 10),
Glide(294, 660, 60), // testing
GateOff()//,
// RepeatEffect()
};
SOUNDEFFECT trill {
Gate(1, 10),
Tone(1000, 50),
Gate(1, 5),
Tone(2000, 50),
RepeatEffect()
};
SOUNDEFFECT beep {
Tone(440, 50),
WaitEffect(50),
FixedTone(880, 50)
};
ANIMATION my_animation {
AnimateLED(nLedRed1, 50),
AnimateLED(nLedRed2, 50),
AnimateLED(nLedRed3, 50),
AnimateLED(nLedRed2, 50),
RepeatAnimation()
};
ANIMATION animation2 {
AnimateLED(nLedRed1, 10),
AnimateLED(nLedRed2, 10),
AnimateLED(nLedRed3, 10),
AnimateLED(nLedRed2, 10)
};
task main()
{
SetAnimation(my_animation);
PlaySound(my_effect);
Wait(200);
PlaySound(trill);
Wait(200);
SetEffectSound(100);
PlaySound(beep); Wait(200);
SetEffectSound(200);
PlaySound(beep); Wait(200);
// SetAnimation(animation2);
}
The documentation on Dave's website regarding the ANIMATION resource is slightly
incorrect. He writes:
An animation declaration looks like this:
ANIMATION name = { data ... };
The = sign will cause an NQC parse error. This should be
ANIMATION name { data ... };
Later he writes:
A pair of 0,0 ends the animation. A pair of 255,255 causes the animation to loop
continuously.
Based on the code generated by the LEGO MindScript/LASM compiler the 0,0 is not
needed to end an animation and to loop continuously you use 255, 0. In
Mindscript you define an LED animation like this:
led ScanUp { forever {
led cRed1 for 10
led cRed2 for 10
led cRed3 for 10
}
}
led ScanDown {
led cRed3 for 10
led cRed2 for 10
led cRed1 for 10
}
This compiles to LASM as you see here:
mood 8
1 10
2 10
4 10
255 0
endm
;----------------------------------------
;LED ScanUp (display 8), size: 8 bytes
;----------------------------------------
mood 9
1 10
2 10
4 10
endm
;----------------------------------------
;LED ScanDown (display 9), size: 6 bytes
Using my Spybotics API submission you can now define your LED animations in a
manner very similar to MindScript:
ANIMATION ScanUp {
AnimateLED(nLedRed1, 10),
AnimateLED(nLedRed2, 10),
AnimateLED(nLedRed3, 10),
RepeatAnimation()
};
ANIMATION ScanDown {
AnimateLED(nLedRed1, 10),
AnimateLED(nLedRed2, 10),
AnimateLED(nLedRed3, 10)
};
The NQC compiler generates:
*** Animation 8 = ScanUp
000 01 0a 02 0a 04 0a ff 00
*** Animation 9 = ScanDown
000 01 0a 02 0a 04 0a
For sound effects the MindScript code looks like:
fx beep { forever {
gate 1 in 10
glide 294..660 for 60
gate off
wait 255
vibrato 294..660 for 60
fixed wait 100
fixed tone 500 for 50
tone 300 for 50 }
}
This compiles to the following LASM code:
sound 64
startg 10,1
freqs 60,294,660
stopg
pauses 255
freqv 60,294,660
pausef 100
tonef 50,500
tones 50,300
repeats
ends
;----------------------------------------
;Fx beep (sound 64), size: 29 bytes
In NQC (using the above additions to spy.nqh) you would write:
SOUNDEFFECT beep {
Gate(1, 10),
Glide(294, 660, 60),
GateOff(),
WaitEffect(255),
Vibrato(294, 660, 60),
FixedWaitEffect(100),
FixedTone(500, 50),
Tone(300, 50),
RepeatEffect()
};
which compiles to:
*** Res 2 64 = beep
000 62 0a 01 45 3c 26 01 94 02 70 21 ff 55 3c 26 01
00d 94 02 81 64 93 32 f4 01 33 32 2c 01 10
|
|
Message has 2 Replies:
Message is in Reply To:
| | Yet another NQC spybot API submission
|
| Here is another submission to the NQC spybot API. I haven't properly tested this against an actual Spybot but I have compared the NQC output code to what is generated by MindScript and documented in the VPB help file. #define SOUNDEFFECT __res 2 (...) (21 years ago, 16-Oct-03, to lugnet.robotics.rcx.nqc)
|
6 Messages in This Thread:
- Entire Thread on One Page:
- Nested:
All | Brief | Compact | Dots
Linear:
All | Brief | Compact
This Message and its Replies on One Page:
- Nested:
All | Brief | Compact | Dots
Linear:
All | Brief | Compact
|
|
|
|