Author: remi
Date: 2009-03-18 09:46:58 +0100 (Wed, 18 Mar 2009)
New Revision: 4112
Added:
software_suite_v2/tuxware/tuxdroidserver/trunk/util/scheduler/
software_suite_v2/tuxware/tuxdroidserver/trunk/util/scheduler/Scheduler.py
software_suite_v2/tuxware/tuxdroidserver/trunk/util/scheduler/Task.py
software_suite_v2/tuxware/tuxdroidserver/trunk/util/scheduler/__init__.py
Modified:
software_suite_v2/tuxware/tuxdroidserver/trunk/resources/01_robot_system/resourceScheduler.py
Log:
* moved the "Task" and "Scheduler" class from the resource scheduler to a
python module
Modified:
software_suite_v2/tuxware/tuxdroidserver/trunk/resources/01_robot_system/resourceScheduler.py
===================================================================
---
software_suite_v2/tuxware/tuxdroidserver/trunk/resources/01_robot_system/resourceScheduler.py
2009-03-18 08:44:20 UTC (rev 4111)
+++
software_suite_v2/tuxware/tuxdroidserver/trunk/resources/01_robot_system/resourceScheduler.py
2009-03-18 08:46:58 UTC (rev 4112)
@@ -6,245 +6,9 @@
import datetime
-SCH_LOOP_ABS = 0
-SCH_LOOP_REL = 1
-SCH_ONCE_ABS = 2
-SCH_ONCE_REL = 3
+from util.scheduler.Scheduler import Scheduler
+from util.scheduler.Task import *
-class Task(object):
- """Class the create a scheduled task.
- """
-
- def __init__(self, ruleType, weekMask, hour, minute, second, command,
- year = None, month = None, day = None):
- """Constructor.
- @param ruleType: <SCH_LOOP_ABS|SCH_LOOP_REL|SCH_ONCE_ABS|SCH_ONCE_REL>
- @param weekMask: Week mask. [True, True, True, True, True, True, True]
- @param hour: <0..23>
- @param minute: <0..59>
- @param second: <0..59>
- @param command: Command to execute.
- """
- self.__ruleType = ruleType
- self.__weekMask = weekMask
- self.__hour = hour
- self.__minute = minute
- self.__second = second
- self.__command = command
- self.__year = year
- self.__month = month
- self.__day = day
- now = datetime.datetime.now()
- self.__monthAtStart = now.month
- self.__monthMask = self.__createMonthMask(self.__monthAtStart)
- if self.__ruleType == SCH_LOOP_ABS:
- if self.__hour == 0:
- m = int(now.minute / self.__minute) * self.__minute
- self.__startTime = datetime.datetime(now.year, now.month,
now.day,
- now.hour - self.__hour, m, self.__second)
- self.__incrementTime = datetime.timedelta(minutes =
self.__minute)
- else:
- self.__startTime = datetime.datetime(now.year, now.month,
now.day,
- now.hour - self.__hour, self.__minute, self.__second)
- self.__incrementTime = datetime.timedelta(hours = self.__hour)
- elif self.__ruleType == SCH_LOOP_REL:
- self.__startTime = datetime.datetime.now()
- self.__incrementTime = datetime.timedelta(seconds = self.__second,
- minutes = self.__minute, hours = self.__hour)
- elif self.__ruleType == SCH_ONCE_ABS:
- if (self.__year != None) and (self.__month != None) and
(self.__day != None):
- self.__startTime = datetime.datetime(self.__year, self.__month,
- self.__day, self.__hour, self.__minute, self.__second)
- self.__incrementTime = None
- else:
- self.__startTime = datetime.datetime(now.year, now.month,
- now.day, self.__hour, self.__minute, self.__second)
- self.__incrementTime = datetime.timedelta(days = 1)
- elif self.__ruleType == SCH_ONCE_REL:
- self.__startTime = datetime.datetime.now()
- self.__incrementTime = datetime.timedelta(hours = self.__hour,
- minutes = self.__minute, seconds = self.__second)
- self.__lastExecuteTime = None
-
- def __createMonthMask(self, month):
- """Create the month mask.
- @param month: Month index of the year.
- @return: The month mask.
- """
- now = datetime.datetime.now()
- firstDayOfMonth = datetime.datetime(now.year, month, 1, 0, 0,
- 0).weekday()
- result = []
- dayIndex = firstDayOfMonth
- for i in range(40):
- result.append(self.__weekMask[dayIndex])
- dayIndex += 1
- if dayIndex > 6:
- dayIndex = 0
- return result
-
- def __getNextAllowedDay(self, day):
- """Get the next allowed day for executing the task.
- @param day: Day index of the month.
- @return: The number of day to skip.
- """
- inc = day
- while not self.__monthMask[inc]:
- inc += 1
- return inc - day
-
- def getNextExecuteTime(self):
- """Get the next time date of task execute.
- @return: The datetime value of the next execution.
- """
- result = None
- now = datetime.datetime.now()
- if self.__ruleType == SCH_LOOP_ABS:
- if self.__lastExecuteTime == None:
- result = self.__startTime + self.__incrementTime
- else:
- result = self.__lastExecuteTime + self.__incrementTime
- elif self.__ruleType == SCH_LOOP_REL:
- if self.__lastExecuteTime == None:
- result = self.__startTime + self.__incrementTime
- else:
- result = self.__lastExecuteTime + self.__incrementTime
- elif self.__ruleType == SCH_ONCE_ABS:
- if self.__lastExecuteTime == None:
- result = self.__startTime
- else:
- if self.__incrementTime == None:
- result = None
- else:
- result = self.__lastExecuteTime + self.__incrementTime
- elif self.__ruleType == SCH_ONCE_REL:
- if self.__lastExecuteTime == None:
- result = self.__startTime + self.__incrementTime
- else:
- result = None
- if result == None:
- return None
- if result.month != self.__monthAtStart:
- self.__monthAtStart = result.month
- self.__monthMask = self.__createMonthMask(self.__monthAtStart)
- if not self.__monthMask[result.day - 1]:
- inc = self.__getNextAllowedDay(result.day - 1)
- result += datetime.timedelta(days = inc)
- self.__lastExecuteTime = result
- return result
-
- def execute(self):
- """Execute the task.
- """
- def async():
- try:
- if str(type(self.__command)) == "<type 'str'>":
- exec(self.__command) in globals()
- else:
- self.__command()
- except:
- pass
- t = threading.Thread(target = async)
- t.start()
-
-class Scheduler(object):
- """Scheduler task.
- """
-
- def __init__(self):
- """Constructor.
- """
- self.__started = False
- self.__startedMutex = threading.Lock()
- self.__tasksToExecuteStack = []
- self.__tasksToExecuteStackMutex = threading.Lock()
-
- def start(self):
- """Start the scheduler.
- """
- t = threading.Thread(target = self.__tasksCheckerLoop)
- t.start()
-
- def stop(self):
- """Stop the scheduler.
- """
- self.__setStarted(False)
-
- def isStarted(self):
- """Get if the scheduler is started or not.
- @return: True or False.
- """
- self.__startedMutex.acquire()
- result = self.__started
- self.__startedMutex.release()
- return result
-
- def __setStarted(self, value):
- """Set the started flag of the scheduler.
- @param value: True or False.
- """
- self.__startedMutex.acquire()
- self.__started = value
- self.__startedMutex.release()
-
- def insertTask(self, task):
- """Insert a task in the scheduler.
- @param task: Task object.
- @return: The task identifier or None if fail.
- """
- nextTime = task.getNextExecuteTime()
- id = clientsManager.generateSingleId()
- self.__tasksToExecuteStackMutex.acquire()
- if nextTime != None:
- self.__tasksToExecuteStack.append([nextTime, task, id])
- self.__tasksToExecuteStackMutex.release()
- return id
-
- def removeTask(self, taskId):
- """Remove a task from the scheduler.
- @param taskId: Task identifier.
- """
- self.__tasksToExecuteStackMutex.acquire()
- for taskInfo in self.__tasksToExecuteStack:
- if taskInfo[2] == taskId:
- self.__tasksToExecuteStack.remove(taskInfo)
- break
- self.__tasksToExecuteStackMutex.release()
-
- def clear(self):
- """Clear the scheduler.
- """
- self.__tasksToExecuteStackMutex.acquire()
- self.__tasksToExecuteStack = []
- self.__tasksToExecuteStackMutex.release()
-
- def __tasksCheckerLoop(self):
- """Loop of the tasks checker.
- """
- if self.isStarted():
- return
- self.__setStarted(True)
- while self.isStarted():
- now = datetime.datetime.now()
- tasksToRemove = []
- tasksToAdd = []
- self.__tasksToExecuteStackMutex.acquire()
- for taskInfo in self.__tasksToExecuteStack:
- if now > taskInfo[0]:
- tasksToRemove.append(taskInfo)
- nextTime = taskInfo[1].getNextExecuteTime()
- diff = now - taskInfo[0]
- if diff.seconds <= 10:
- taskInfo[1].execute()
- if nextTime != None:
- tasksToAdd.append([nextTime, taskInfo[1], taskInfo[2]])
- for taskInfo in tasksToRemove:
- self.__tasksToExecuteStack.remove(taskInfo)
- for taskInfo in tasksToAdd:
- self.__tasksToExecuteStack.append(taskInfo)
- self.__tasksToExecuteStackMutex.release()
- time.sleep(1.0)
-
#
------------------------------------------------------------------------------
# Declaration of the resource "scheduler".
#
------------------------------------------------------------------------------
Added:
software_suite_v2/tuxware/tuxdroidserver/trunk/util/scheduler/Scheduler.py
===================================================================
--- software_suite_v2/tuxware/tuxdroidserver/trunk/util/scheduler/Scheduler.py
(rev 0)
+++ software_suite_v2/tuxware/tuxdroidserver/trunk/util/scheduler/Scheduler.py
2009-03-18 08:46:58 UTC (rev 4112)
@@ -0,0 +1,138 @@
+# Copyright (C) 2009 C2ME Sa
+# Remi Jocaille <[email protected]>
+# Distributed under the terms of the GNU General Public License
+# http://www.gnu.org/copyleft/gpl.html
+
+import datetime
+import threading
+import time
+
+from Task import Task
+
+#
------------------------------------------------------------------------------
+# Scheduler task manager.
+#
------------------------------------------------------------------------------
+class Scheduler(object):
+ """Scheduler task manager.
+ """
+
+ #
--------------------------------------------------------------------------
+ # Constructor of the class.
+ #
--------------------------------------------------------------------------
+ def __init__(self):
+ """Constructor.
+ """
+ self.__started = False
+ self.__startedMutex = threading.Lock()
+ self.__tasksToExecuteStack = []
+ self.__tasksToExecuteStackMutex = threading.Lock()
+
+ #
--------------------------------------------------------------------------
+ # Start the scheduler.
+ #
--------------------------------------------------------------------------
+ def start(self):
+ """Start the scheduler.
+ """
+ t = threading.Thread(target = self.__tasksCheckerLoop)
+ t.start()
+
+ #
--------------------------------------------------------------------------
+ # Stop the scheduler.
+ #
--------------------------------------------------------------------------
+ def stop(self):
+ """Stop the scheduler.
+ """
+ self.__setStarted(False)
+
+ #
--------------------------------------------------------------------------
+ # Get if the scheduler is started or not.
+ #
--------------------------------------------------------------------------
+ def isStarted(self):
+ """Get if the scheduler is started or not.
+ @return: True or False.
+ """
+ self.__startedMutex.acquire()
+ result = self.__started
+ self.__startedMutex.release()
+ return result
+
+ #
--------------------------------------------------------------------------
+ # Set the started flag of the scheduler.
+ #
--------------------------------------------------------------------------
+ def __setStarted(self, value):
+ """Set the started flag of the scheduler.
+ @param value: True or False.
+ """
+ self.__startedMutex.acquire()
+ self.__started = value
+ self.__startedMutex.release()
+
+ #
--------------------------------------------------------------------------
+ # Insert a task in the scheduler.
+ #
--------------------------------------------------------------------------
+ def insertTask(self, task):
+ """Insert a task in the scheduler.
+ @param task: Task object.
+ @return: The task identifier or None if fail.
+ """
+ nextTime = task.getNextExecuteTime()
+ id = clientsManager.generateSingleId()
+ self.__tasksToExecuteStackMutex.acquire()
+ if nextTime != None:
+ self.__tasksToExecuteStack.append([nextTime, task, id])
+ self.__tasksToExecuteStackMutex.release()
+ return id
+
+ #
--------------------------------------------------------------------------
+ # Remove a task from the scheduler.
+ #
--------------------------------------------------------------------------
+ def removeTask(self, taskId):
+ """Remove a task from the scheduler.
+ @param taskId: Task identifier.
+ """
+ self.__tasksToExecuteStackMutex.acquire()
+ for taskInfo in self.__tasksToExecuteStack:
+ if taskInfo[2] == taskId:
+ self.__tasksToExecuteStack.remove(taskInfo)
+ break
+ self.__tasksToExecuteStackMutex.release()
+
+ #
--------------------------------------------------------------------------
+ # Clear the scheduler.
+ #
--------------------------------------------------------------------------
+ def clear(self):
+ """Clear the scheduler.
+ """
+ self.__tasksToExecuteStackMutex.acquire()
+ self.__tasksToExecuteStack = []
+ self.__tasksToExecuteStackMutex.release()
+
+ #
--------------------------------------------------------------------------
+ # Loop of the tasks checker.
+ #
--------------------------------------------------------------------------
+ def __tasksCheckerLoop(self):
+ """Loop of the tasks checker.
+ """
+ if self.isStarted():
+ return
+ self.__setStarted(True)
+ while self.isStarted():
+ now = datetime.datetime.now()
+ tasksToRemove = []
+ tasksToAdd = []
+ self.__tasksToExecuteStackMutex.acquire()
+ for taskInfo in self.__tasksToExecuteStack:
+ if now > taskInfo[0]:
+ tasksToRemove.append(taskInfo)
+ nextTime = taskInfo[1].getNextExecuteTime()
+ diff = now - taskInfo[0]
+ if diff.seconds <= 10:
+ taskInfo[1].execute()
+ if nextTime != None:
+ tasksToAdd.append([nextTime, taskInfo[1], taskInfo[2]])
+ for taskInfo in tasksToRemove:
+ self.__tasksToExecuteStack.remove(taskInfo)
+ for taskInfo in tasksToAdd:
+ self.__tasksToExecuteStack.append(taskInfo)
+ self.__tasksToExecuteStackMutex.release()
+ time.sleep(1.0)
Property changes on:
software_suite_v2/tuxware/tuxdroidserver/trunk/util/scheduler/Scheduler.py
___________________________________________________________________
Name: svn:keywords
+ Id
Added: software_suite_v2/tuxware/tuxdroidserver/trunk/util/scheduler/Task.py
===================================================================
--- software_suite_v2/tuxware/tuxdroidserver/trunk/util/scheduler/Task.py
(rev 0)
+++ software_suite_v2/tuxware/tuxdroidserver/trunk/util/scheduler/Task.py
2009-03-18 08:46:58 UTC (rev 4112)
@@ -0,0 +1,166 @@
+# Copyright (C) 2009 C2ME Sa
+# Remi Jocaille <[email protected]>
+# Distributed under the terms of the GNU General Public License
+# http://www.gnu.org/copyleft/gpl.html
+
+import datetime
+import threading
+
+SCH_LOOP_ABS = 0
+SCH_LOOP_REL = 1
+SCH_ONCE_ABS = 2
+SCH_ONCE_REL = 3
+
+#
------------------------------------------------------------------------------
+# Class the create a scheduled task.
+#
------------------------------------------------------------------------------
+class Task(object):
+ """Class the create a scheduled task.
+ """
+
+ #
--------------------------------------------------------------------------
+ # Constructor of the class.
+ #
--------------------------------------------------------------------------
+ def __init__(self, ruleType, weekMask, hour, minute, second, command,
+ year = None, month = None, day = None):
+ """Constructor of the class.
+ @param ruleType: <SCH_LOOP_ABS|SCH_LOOP_REL|SCH_ONCE_ABS|SCH_ONCE_REL>
+ @param weekMask: Week mask. [True, True, True, True, True, True, True]
+ @param hour: <0..23>
+ @param minute: <0..59>
+ @param second: <0..59>
+ @param command: Command to execute.
+ """
+ self.__ruleType = ruleType
+ self.__weekMask = weekMask
+ self.__hour = hour
+ self.__minute = minute
+ self.__second = second
+ self.__command = command
+ self.__year = year
+ self.__month = month
+ self.__day = day
+ now = datetime.datetime.now()
+ self.__monthAtStart = now.month
+ self.__monthMask = self.__createMonthMask(self.__monthAtStart)
+ if self.__ruleType == SCH_LOOP_ABS:
+ if self.__hour == 0:
+ m = int(now.minute / self.__minute) * self.__minute
+ self.__startTime = datetime.datetime(now.year, now.month,
now.day,
+ now.hour - self.__hour, m, self.__second)
+ self.__incrementTime = datetime.timedelta(minutes =
self.__minute)
+ else:
+ self.__startTime = datetime.datetime(now.year, now.month,
now.day,
+ now.hour - self.__hour, self.__minute, self.__second)
+ self.__incrementTime = datetime.timedelta(hours = self.__hour)
+ elif self.__ruleType == SCH_LOOP_REL:
+ self.__startTime = datetime.datetime.now()
+ self.__incrementTime = datetime.timedelta(seconds = self.__second,
+ minutes = self.__minute, hours = self.__hour)
+ elif self.__ruleType == SCH_ONCE_ABS:
+ if (self.__year != None) and (self.__month != None) and
(self.__day != None):
+ self.__startTime = datetime.datetime(self.__year, self.__month,
+ self.__day, self.__hour, self.__minute, self.__second)
+ self.__incrementTime = None
+ else:
+ self.__startTime = datetime.datetime(now.year, now.month,
+ now.day, self.__hour, self.__minute, self.__second)
+ self.__incrementTime = datetime.timedelta(days = 1)
+ elif self.__ruleType == SCH_ONCE_REL:
+ self.__startTime = datetime.datetime.now()
+ self.__incrementTime = datetime.timedelta(hours = self.__hour,
+ minutes = self.__minute, seconds = self.__second)
+ self.__lastExecuteTime = None
+
+ #
--------------------------------------------------------------------------
+ # Create the month mask.
+ #
--------------------------------------------------------------------------
+ def __createMonthMask(self, month):
+ """Create the month mask.
+ @param month: Month index of the year.
+ @return: The month mask.
+ """
+ now = datetime.datetime.now()
+ firstDayOfMonth = datetime.datetime(now.year, month, 1, 0, 0,
+ 0).weekday()
+ result = []
+ dayIndex = firstDayOfMonth
+ for i in range(40):
+ result.append(self.__weekMask[dayIndex])
+ dayIndex += 1
+ if dayIndex > 6:
+ dayIndex = 0
+ return result
+
+ #
--------------------------------------------------------------------------
+ # Get the next allowed day for executing the task.
+ #
--------------------------------------------------------------------------
+ def __getNextAllowedDay(self, day):
+ """Get the next allowed day for executing the task.
+ @param day: Day index of the month.
+ @return: The number of day to skip.
+ """
+ inc = day
+ while not self.__monthMask[inc]:
+ inc += 1
+ return inc - day
+
+ #
--------------------------------------------------------------------------
+ # Get the next time date of task execute.
+ #
--------------------------------------------------------------------------
+ def getNextExecuteTime(self):
+ """Get the next time date of task execute.
+ @return: The datetime value of the next execution.
+ """
+ result = None
+ now = datetime.datetime.now()
+ if self.__ruleType == SCH_LOOP_ABS:
+ if self.__lastExecuteTime == None:
+ result = self.__startTime + self.__incrementTime
+ else:
+ result = self.__lastExecuteTime + self.__incrementTime
+ elif self.__ruleType == SCH_LOOP_REL:
+ if self.__lastExecuteTime == None:
+ result = self.__startTime + self.__incrementTime
+ else:
+ result = self.__lastExecuteTime + self.__incrementTime
+ elif self.__ruleType == SCH_ONCE_ABS:
+ if self.__lastExecuteTime == None:
+ result = self.__startTime
+ else:
+ if self.__incrementTime == None:
+ result = None
+ else:
+ result = self.__lastExecuteTime + self.__incrementTime
+ elif self.__ruleType == SCH_ONCE_REL:
+ if self.__lastExecuteTime == None:
+ result = self.__startTime + self.__incrementTime
+ else:
+ result = None
+ if result == None:
+ return None
+ if result.month != self.__monthAtStart:
+ self.__monthAtStart = result.month
+ self.__monthMask = self.__createMonthMask(self.__monthAtStart)
+ if not self.__monthMask[result.day - 1]:
+ inc = self.__getNextAllowedDay(result.day - 1)
+ result += datetime.timedelta(days = inc)
+ self.__lastExecuteTime = result
+ return result
+
+ #
--------------------------------------------------------------------------
+ # Execute the task.
+ #
--------------------------------------------------------------------------
+ def execute(self):
+ """Execute the task.
+ """
+ def async():
+ try:
+ if str(type(self.__command)) == "<type 'str'>":
+ exec(self.__command) in globals()
+ else:
+ self.__command()
+ except:
+ pass
+ t = threading.Thread(target = async)
+ t.start()
Property changes on:
software_suite_v2/tuxware/tuxdroidserver/trunk/util/scheduler/Task.py
___________________________________________________________________
Name: svn:keywords
+ Id
Added: software_suite_v2/tuxware/tuxdroidserver/trunk/util/scheduler/__init__.py
===================================================================
Property changes on:
software_suite_v2/tuxware/tuxdroidserver/trunk/util/scheduler/__init__.py
___________________________________________________________________
Name: svn:keywords
+ Id
------------------------------------------------------------------------------
Apps built with the Adobe(R) Flex(R) framework and Flex Builder(TM) are
powering Web 2.0 with engaging, cross-platform capabilities. Quickly and
easily build your RIAs with Flex Builder, the Eclipse(TM)based development
software that enables intelligent coding and step-through debugging.
Download the free 60 day trial. http://p.sf.net/sfu/www-adobe-com
_______________________________________________
Tux-droid-svn mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tux-droid-svn