OGEL: LEGO Mindstorm Controller Language

OGEL:
LEGO Mindstorm Controller Language
Michael Ching
Gerardo Flores
Matt Kalish
Charles O’Donnell
May 13, 2003
LEGO Mindstorms
 Robotic architecture that allows one to build
components from Legos and control sensors and
motors from a microcontroller
 Complexity of microcontroller can be chosen (Scout,
RCX 1.0, RCX 2.0, CyberMaster)
 Different development environments may be chosen
that vary from a drag and drop approach to a Csyntax based language
Not Quite C
 Targets experienced programmers






C syntax and semantics
Textual language removes the graphical metaphors that
limit the type of programs that may be written
Supported by several IDEs (WinNQC, MacNQC, Visual
NQC, NQCEdit, Bricx Command Center)
Not modular in nature
Does not support hierarchy or abstraction of code
Questionable event-based support
OGEL
 Designed to support the RCX 1.0 but offers
support for future firmware (Compatible with
2.0)
 Merge desirable characteristics of available
technologies
 Built scalable hierarchy which improves
code reuse
OGEL (Cont’d)
 Able to create code for multiple target microcontrollers from
one file
 Improved message passing architecture
 Improved modularity which leads to a more stable hierarchy
 Allows imbedded self-contained Not Quite C code
 Permits separation of RCX, task, message, and function
declarations into library files which can be added to any
existing code by means of include statements
Architecture
Preprocessor
Lexer / Parser
OGEL Source
Code File
RCX 1.0
Translator
NQC Target Files
For RCX 1.0
RCX 1.0
Optimized
Translator
RCX 2
Translator
Static-Semantic
Checker
UNI-OGEL
Generator
RCX 2
Optimized
Translator
NQC Target
Files For
RCX 2
CyberMaster
Translator
CyberMaster
NQC Target
Files For
CyberMaster
Optimizing
Translator
Symbol Table
Scout
Translator
Scout
Optimizing
Translator
NQC Target
Files For
Scout
Architecture Discussion
 5 Stages: Preprocessor, Lexer/Parser, StaticSemantic Checking, UNI-OGEL Generator,
Architectural Translator.
 Preprocessor: #include, #define,
task/function order independence
Architecture Discussion
 Lexer/Parser – Static-Semantic Checking
 UNI-OGEL Generator: code duplication &
port mapping, source code profiling
 Architectural Translator: any architecture,
architecture-specific errors discovered (task
limit, recursion), optimization
Testing
 Testing was done in 3 phases



Isolated Module Testing
Integration Testing
Final Testing
Sample OGEL Code
#define TIME_REV 100
message done;
rcx demo {
SENSOR_TOUCH hit = $1;
left_motor = $A;
right_motor = $C;
}
task go(in hit)(out left_motor, out right_motor) {
when (hit>0) do reverse();
nqc.OnFwd(left_motor + right_motor);
}
void turn()()(out left_motor, out right_motor) {
nqc.OnRev(left_motor);
nqc.OnFwd(right_motor);
nqc.Wait(TIME_REV);
nqc.Off(left_motor + right_motor);
throw done;
}
void reverse()()(out left_motor, out right_motor) {
nqc.OnRev(left_motor + right_motor);
nqc.Wait(TIME_REV);
nqc.Off(left_motor + right_motor);
turn();
}
task rev_task()(out left_motor, out right_motor) {
int x = 1;
while (x > 0) {
catch done;
reverse();
}
}
task main() {
rcx demo first_born;
first_born.addTask(rev_task);
first_born.addTask(go);
}
Watch This Puppy run!
Division of Work:
Front-End: Michael Ching / Gerardo Flores
Back-End: Charles O’Donnell
Floater, Docs Compilation: Matt Kalish