Now you can download a copy of these docs so you can use them offline! Download now
Task.cpp
00001 /*----------------------------------------------------------------------------*/ 00002 /* Copyright (c) FIRST 2008. All Rights Reserved. */ 00003 /* Open Source Software - may be modified and shared by FRC teams. The code */ 00004 /* must be accompanied by the FIRST BSD license file in $(WIND_BASE)/WPILib. */ 00005 /*----------------------------------------------------------------------------*/ 00006 00007 #include "Task.h" 00008 00009 #include "WPIErrors.h" 00010 #include <errnoLib.h> 00011 #include <string.h> 00012 #include <taskLib.h> 00013 #include <usrLib.h> 00014 00015 const UINT32 Task::kDefaultPriority; 00016 const INT32 Task::kInvalidTaskID; 00017 00025 Task::Task(const char* name, FUNCPTR function, INT32 priority, UINT32 stackSize) 00026 { 00027 m_taskID = kInvalidTaskID; 00028 m_function = function; 00029 m_priority = priority; 00030 m_stackSize = stackSize; 00031 m_taskName = new char[strlen(name) + 5]; 00032 strcpy(m_taskName, "FRC_"); 00033 strcpy(m_taskName+4, name); 00034 } 00035 00036 Task::~Task() 00037 { 00038 if (m_taskID != kInvalidTaskID) Stop(); 00039 delete [] m_taskName; 00040 m_taskName = NULL; 00041 } 00042 00047 bool Task::Start(UINT32 arg0, UINT32 arg1, UINT32 arg2, UINT32 arg3, UINT32 arg4, 00048 UINT32 arg5, UINT32 arg6, UINT32 arg7, UINT32 arg8, UINT32 arg9) 00049 { 00050 m_taskID = taskSpawn(m_taskName, 00051 m_priority, 00052 VX_FP_TASK, // options 00053 m_stackSize, // stack size 00054 m_function, // function to start 00055 arg0, arg1, arg2, arg3, arg4, // parameter 1 - pointer to this class 00056 arg5, arg6, arg7, arg8, arg9);// additional unused parameters 00057 bool ok = HandleError(m_taskID); 00058 if (!ok) m_taskID = kInvalidTaskID; 00059 return ok; 00060 } 00061 00067 bool Task::Restart() 00068 { 00069 return HandleError(taskRestart(m_taskID)); 00070 } 00071 00076 bool Task::Stop() 00077 { 00078 bool ok = true; 00079 if (Verify()) 00080 { 00081 ok = HandleError(taskDelete(m_taskID)); 00082 } 00083 m_taskID = kInvalidTaskID; 00084 return ok; 00085 } 00086 00091 bool Task::IsReady() 00092 { 00093 return taskIsReady(m_taskID); 00094 } 00095 00100 bool Task::IsSuspended() 00101 { 00102 return taskIsSuspended(m_taskID); 00103 } 00104 00109 bool Task::Suspend() 00110 { 00111 return HandleError(taskSuspend(m_taskID)); 00112 } 00113 00118 bool Task::Resume() 00119 { 00120 return HandleError(taskResume(m_taskID)); 00121 } 00122 00127 bool Task::Verify() 00128 { 00129 return taskIdVerify(m_taskID) == OK; 00130 } 00131 00136 INT32 Task::GetPriority() 00137 { 00138 if (HandleError(taskPriorityGet(m_taskID, &m_priority))) 00139 return m_priority; 00140 else 00141 return 0; 00142 } 00143 00151 bool Task::SetPriority(INT32 priority) 00152 { 00153 m_priority = priority; 00154 return HandleError(taskPrioritySet(m_taskID, m_priority)); 00155 } 00156 00161 const char* Task::GetName() 00162 { 00163 return m_taskName; 00164 } 00165 00170 INT32 Task::GetID() 00171 { 00172 if (Verify()) 00173 return m_taskID; 00174 return kInvalidTaskID; 00175 } 00176 00180 bool Task::HandleError(STATUS results) 00181 { 00182 if (results != ERROR) return true; 00183 switch(errnoGet()) 00184 { 00185 case S_objLib_OBJ_ID_ERROR: 00186 wpi_setWPIErrorWithContext(TaskIDError, m_taskName); 00187 break; 00188 00189 case S_objLib_OBJ_DELETED: 00190 wpi_setWPIErrorWithContext(TaskDeletedError, m_taskName); 00191 break; 00192 00193 case S_taskLib_ILLEGAL_OPTIONS: 00194 wpi_setWPIErrorWithContext(TaskOptionsError, m_taskName); 00195 break; 00196 00197 case S_memLib_NOT_ENOUGH_MEMORY: 00198 wpi_setWPIErrorWithContext(TaskMemoryError, m_taskName); 00199 break; 00200 00201 case S_taskLib_ILLEGAL_PRIORITY: 00202 wpi_setWPIErrorWithContext(TaskPriorityError, m_taskName); 00203 break; 00204 00205 default: 00206 printErrno(errnoGet()); 00207 wpi_setWPIErrorWithContext(TaskError, m_taskName); 00208 } 00209 return false; 00210 } 00211
Generated on Thu Jan 12 2012 22:35:24 for WPILibC++ by
1.7.1