[Tutor] Let imported module access calling program
Michael Langford
mlangford.cs03 at gtalumni.org
Wed Mar 26 00:41:29 CET 2008
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.
You may want something like:
#robotcontrol.py
import time
class OperationalStep(object):
def __init__(self,func,interval=0):
self.func = func
self.interval = interval
self.lastRun = getTime()
def run():
"""If the step hasn't been run recently enough, do so"""
if self.interval + self.lastRun < getTime():
self.func()
self.lastRun = getTime()
def unknownEvent():
print( "This is an undefined event code" )
events = collections.defaultdict(unknownEvent)
def getTime():
"""returns time"""
return time.clock()
def registerEventHandler(eventCode,handler):
"""When event eventCode is seen, run handler"""
global events
events[eventCode] = handler
def registerOperationalStep(step,delayAtLeast=0):
"""Registers a step that will be taken in the program no more often than
delayAtLeast often"""
global tasks
t = OperationalStep(step,delayAtLeast)
tasks.append(t)
eventQueue = []
def addEvent(ev):
global eventQueue
eventQueue.append(ev)
def robotLoop():
"""runs each task, handling events as possible"""
global eventQueue,tasks
while True:
for task in tasks:
#process events
for ev in eventQueue:
events[ev]()
#run next task
task.run()
All of this would be put in its own module, say robotcontrol, that would
then be used thusly in a complete separate file:
#myrobot.py
import robotcontrol
from madeupRobotApi import *
from time import sleep
def checkBump():
"""Checks to see if the robot bump bar is pushed in"""
if bump.pressed():
robotcontrol.addEvent(BUMP_EVENT)
def handleSonarData():
"""gets data from the sonar"""
data = sonar.read()
print (data)
def handleCoreMeltdown():
"""turns off the core"""
powercore.off()
def turnLeft():
""turns the robot 90 degrees left"
lwheels.run(-10)
rwheels.run(10)
sleep(10)
lwheels.run(0)
rwheels.run(0)
checkBump()
def turnRight():
""turns the robot 90 degrees right"
lwheels.run(10)
rwheels.run(-10)
sleep(10)
lwheels.run(0)
rwheels.run(0)
checkBump()
def goForward(speed=10,t=10):
"""goes forward at speed for time t"""
lwheels.run(speed)
rwheels.run(speed)
sleep(t)
lwheels.run(0)
rwheels.run(0)
checkBump()
def goForwardALittle()
goForward(10,1)
checkBump()
def checkSensors()
if sonar.ready():
robotcontrol.addEvent(SONAR_EVENT)
if core.tooHot():
robotcontrol.addEvent(OHNO_EVENT)
direction = "RIGHT"
def decideNewDirection():
global direction
if sonar.data == "heavy":
direction = "LEFT"
else:
direction = "RIGHT"
def handleBump()
"""back up upon bump"""
if bump.pressed():
goForward(speed=-10,t=10)
def turn():
"""turns the direction specified in direction"""
global direction
if direction == "LEFT":
turnLeft()
else:
turnRight()
def robotSetup():
"""sets all the event handlers and defines the operational program"""
#these will happen as things generate events
registerEventHandler(SONAR_EVENT,handleSonarData)
registerEventHandler(OHNO_EVENT,handleCoreMeltdown)
registerEventHandler(BUMP_EVENT,handleBump)
#robot control scheme
registerOperationalStep(checkSensors,10)
registerOperationalStep(decideNewDirection)
registerOperationalStep(turn)
registerOperationalStep(goForwardALittle)
registerOperationalStep(decideNewDirection)
registerOperationalStep(turn)
if "__name__"==__main__:
robotSetup()
robotcontrol.robotLoop()
--
Michael Langford
404-386-0495
http://www.RowdyLabs.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.python.org/pipermail/tutor/attachments/20080325/464e8477/attachment.htm
More information about the Tutor
mailing list