The following is a pretty normal control loop for robot control (or other embedded devices). There are probably some syntactical errors as I'm writing this without a working python interpreter available at this second, but it should give you the correct gist to do what you said you were trying to do.<br>
<br>You may want something like:<br>#robotcontrol.py<br>import time<br><br>class OperationalStep(object):<br> def __init__(self,func,interval=0):<br> self.func = func<br> self.interval = interval<br> self.lastRun = getTime()<br>
<br> def run():<br> """If the step hasn't been run recently enough, do so"""<br> if self.interval + self.lastRun < getTime():<br> self.func()<br> self.lastRun = getTime()<br>
<br>def unknownEvent():<br> print( "This is an undefined event code" )<br><br>events = collections.defaultdict(unknownEvent)<br><br>def getTime():<br> """returns time"""<br> return time.clock()<br>
<br>def registerEventHandler(eventCode,handler):<br> """When event eventCode is seen, run handler"""<br> global events<br> events[eventCode] = handler<br><br>def registerOperationalStep(step,delayAtLeast=0):<br>
"""Registers a step that will be taken in the program no more often than delayAtLeast often"""<br> global tasks<br> t = OperationalStep(step,delayAtLeast)<br> tasks.append(t)<br><br>
eventQueue = []<br>def addEvent(ev):<br> global eventQueue<br> eventQueue.append(ev)<br><br>def robotLoop():<br> """runs each task, handling events as possible"""<br> global eventQueue,tasks<br>
while True:<br> for task in tasks:<br> #process events<br> for ev in eventQueue:<br> events[ev]()<br><br> #run next task<br> task.run()<br> <br><br>All of this would be put in its own module, say robotcontrol, that would then be used thusly in a complete separate file:<br>
<br>#myrobot.py<br>import robotcontrol<br>from madeupRobotApi import *<br>from time import sleep<br><br><br>def checkBump():<br> """Checks to see if the robot bump bar is pushed in"""<br> if bump.pressed():<br>
robotcontrol.addEvent(BUMP_EVENT)<br><br>def handleSonarData():<br> """gets data from the sonar"""<br> data = sonar.read()<br> print (data)<br><br>def handleCoreMeltdown():<br> """turns off the core"""<br>
powercore.off()<br><br>def turnLeft():<br> ""turns the robot 90 degrees left"<br> lwheels.run(-10)<br> rwheels.run(10)<br> sleep(10)<br> lwheels.run(0)<br> rwheels.run(0)<br> checkBump()<br>
<br>def turnRight():<br> ""turns the robot 90 degrees right"<br> lwheels.run(10)<br> rwheels.run(-10)<br> sleep(10)<br> lwheels.run(0)<br> rwheels.run(0)<br> checkBump()<br><br>def goForward(speed=10,t=10):<br>
"""goes forward at speed for time t"""<br> lwheels.run(speed)<br> rwheels.run(speed)<br> sleep(t)<br> lwheels.run(0)<br> rwheels.run(0)<br> checkBump()<br><br>def goForwardALittle()<br>
goForward(10,1)<br> checkBump()<br><br>def checkSensors()<br> if sonar.ready():<br> robotcontrol.addEvent(SONAR_EVENT)<br> if core.tooHot():<br> robotcontrol.addEvent(OHNO_EVENT)<br><br>direction = "RIGHT"<br>
<br>def decideNewDirection():<br> global direction<br> if sonar.data == "heavy":<br> direction = "LEFT"<br> else:<br> direction = "RIGHT" <br><br>def handleBump()<br> """back up upon bump"""<br>
if bump.pressed():<br> goForward(speed=-10,t=10)<br><br>def turn():<br> """turns the direction specified in direction"""<br> global direction<br> if direction == "LEFT":<br>
turnLeft()<br> else:<br> turnRight()<br> <br><br>def robotSetup():<br> """sets all the event handlers and defines the operational program"""<br><br> #these will happen as things generate events<br>
registerEventHandler(SONAR_EVENT,handleSonarData)<br> registerEventHandler(OHNO_EVENT,handleCoreMeltdown)<br> registerEventHandler(BUMP_EVENT,handleBump)<br><br> #robot control scheme<br> registerOperationalStep(checkSensors,10)<br>
registerOperationalStep(decideNewDirection)<br> registerOperationalStep(turn)<br> registerOperationalStep(goForwardALittle)<br> registerOperationalStep(decideNewDirection)<br> registerOperationalStep(turn)<br> <br>
<br>if "__name__"==__main__:<br> robotSetup()<br> robotcontrol.robotLoop()<br> <br>-- <br>Michael Langford<br>404-386-0495<br><a href="http://www.RowdyLabs.com">http://www.RowdyLabs.com</a><br> <br><br><br>