// Created: October 22nd 2000 3:51 PM // Modified: // Created by TFM (tfm@akasa.bc.ca) // Name: TrainCrossing.nqc // Version 0100 // Firmware: 0328 // NQC Version: 2.2r2 // RCX timer assignments // Timer0 -- Clear Track Delay // Timer1 -- Elapsed Time // Timer2 -- // Timer3 -- // RCX port assignments // Sensor1 -- Touch Sensor (Optic Light Break Sensor) // Sensor2 -- Touch Sensor (Optic Light Break Sensor) // Sensor3 -- // OutputA -- Micro Motor (Swing Arm) // OutputB -- LED's // OutputC -- Points Switching Motor // Initialization of global variables int TrackStatus; //Track Status (1 = track is occupied, 0 = track vacant) // Defines #define RCXunitNo 0 //RCX Code Unit Number (0 - 4) #define DefSpeed 2 //Default Motor speed (0 - 7) #define DefLight 7 //Default Light brightness (0 - 7) #define WaitTime 500 //Default Wait Time for Sensor release (hundredths) #define BarrierTime 250 //Default Wait Time for Barrier Raise/Lower (hundredths) #define BarrierDown 50 //Default Wait Time Delay Adjustment for Down Barrier #define SensorState 0 //Default Sensor State Toggle (1 = Normally Off, 0 = Normally On) #define LightType 1 //Default Light Type (0 = LEGO Alternating Brick, 1 = Non Alternating Brick) #define AlternateSpeed 50 //Default Light Alternate Interval (hundredths) #define NoSleep 0 //Default Sleep Timeout (in minutes, 0 = Never Sleep) #define SwitchTime 100 //Default Track Switch Time (hundredths) // Void Routines // Sub Routines // Tasks task main() // Task Auto Started at Runtime { //Initial Setup Parameters SetSensor(SENSOR_1, SENSOR_TOUCH); SetSensor(SENSOR_2, SENSOR_TOUCH); SetPower(OUT_A, DefSpeed); //Set the Swing Arm Power Level SetPower(OUT_B, DefLight); //Set the Lights Power Level SelectDisplay (DISPLAY_WATCH); SetSleepTime(NoSleep); //Var Initialization TrackStatus = 0; //Reset Variables //Tell the World I am Alive! PlaySound(5); //Startup Sound //Task Activation start IRreceive; start SensorWatch; if (LightType) start AlternateLights; //End of Task Activation while(true) { //SetUserDisplay(TrackStatus , 0); until (TrackStatus > 0); ClearTimer(1); SetUserDisplay(FastTimer(1) , 2); OnFwd(OUT_B); OnFwd(OUT_A); Wait (BarrierTime - BarrierDown); Off (OUT_A); until (TrackStatus == 0); OnRev (OUT_A); Wait (BarrierTime); Off (OUT_A); Off (OUT_B); SelectDisplay (DISPLAY_WATCH); } } //End of Main Task task SensorWatch() { while(true) { until (SENSOR_1 == SensorState || SENSOR_2 == SensorState); TrackStatus = 1; ClearTimer(0); while (FastTimer(0) < WaitTime) { if (SENSOR_1 == SensorState) ClearTimer(0); if (SENSOR_2 == SensorState) ClearTimer(0); } if (SensorState == 0) until (SENSOR_1 == 1 && SENSOR_2 == 1); else until (SENSOR_1 == 0 && SENSOR_2 == 0); TrackStatus = 0; } } //End of SensorWatch Task task IRreceive() //Infrared Receiver { while (true) { until (Message()!= 0); if (Message() == 3){ PlaySound(2); if (TrackStatus == 1) TrackStatus = 0; else TrackStatus = 1; ClearMessage();} if (Message() == 1){ PlaySound(2); Fwd (OUT_C); OnFor (OUT_C, SwitchTime); ClearMessage();} if (Message() == 2){ PlaySound(2); Rev (OUT_C); OnFor (OUT_C, SwitchTime); ClearMessage();} if (Message() == 255){ PlaySound(3); ClearMessage();} ClearMessage(); } } //End Infrared Receiver Task task AlternateLights() //Alternate Lights { while (true) { Toggle (OUT_B); Wait (AlternateSpeed); } } //End Alternate Lights Task // End Of Line...