#!/usr/bin/tclsh #------------------------------------------------------------------------------ # Make the skeleton for a motor driver # # copyright: see file COPYRIGHT # # Mark Koennecke, July 2006 #------------------------------------------------------------------------------ if { [llength $argv] < 1} { puts stdout "Usage:\n\tmakemodrivskel prefix" exit 1 } set prefix [lindex $argv 0] #----------------------------------------------------------------------------- proc stdCast {} { global prefix puts stdout " ${prefix}MotorDriver *self = NULL;" puts stdout " " puts stdout " self = (${prefix}MotorDriver *)data;" } #----------------- output datastructure puts stdout "#include " puts stdout "#include " puts stdout "#include " puts stdout "typedef struct __${prefix}MoDriv{" puts stdout " /* general motor driver interface " puts stdout " fields. REQUIRED!" puts stdout " */" puts stdout " float fUpper; /* upper limit */" puts stdout " float fLower; /* lower limit */" puts stdout " char *name;" puts stdout " int (*GetPosition)(void *self, float *fPos);" puts stdout " int (*RunTo)(void *self,float fNewVal);" puts stdout " int (*GetStatus)(void *self);" puts stdout " void (*GetError)(void *self, int *iCode, char *buffer, int iBufLen);" puts stdout " int (*TryAndFixIt)(void *self, int iError,float fNew);" puts stdout " int (*Halt)(void *self);" puts stdout " int (*GetDriverPar)(void *self, char *name, " puts stdout " float *value);" puts stdout " int (*SetDriverPar)(void *self,SConnection *pCon," puts stdout " char *name, float newValue);" puts stdout " void (*ListDriverPar)(void *self, char *motorName," puts stdout " SConnection *pCon);" puts stdout " void (*KillPrivate)(void *self);" puts stdout " /* your drivers private fields follow below */" puts stdout " } ${prefix}MotorDriver;" puts stdout " " puts stdout "/*================================================================" puts stdout " GetPos returns OKOK on success, HWFault on failure " puts stdout "------------------------------------------------------------------*/" puts stdout "static int ${prefix}GetPos(void *data, float *fPos){" stdCast puts stdout " return OKOK;" puts stdout "}" puts stdout "/*----------------------------------------------------------------" puts stdout " RunTo starts the motor running. Returns OKOK on success, HWfault" puts stdout " on Errors" puts stdout "------------------------------------------------------------------*/" puts stdout "static int ${prefix}RunTo(void *data, float newValue){" stdCast puts stdout " return OKOK;" puts stdout "}" puts stdout "/*-----------------------------------------------------------------" puts stdout " CheckStatus queries the sattus of a running motor. Possible return" puts stdout " values can be:" puts stdout " HWBusy : motor still running" puts stdout " HWFault : motor error detected" puts stdout " HWPosFault : motor finished, but position not reached" puts stdout " HWIdle : motor finished OK" puts stdout " HWWarn : motor issued warning" puts stdout "--------------------------------------------------------------------*/" puts stdout "static int ${prefix}CheckStatus(void *data){" stdCast puts stdout " return HWIdle;" puts stdout "}" puts stdout "/*------------------------------------------------------------------" puts stdout " GetError gets more information about error which occurred" puts stdout " *iCode is an integer error code to be used in TryFixIt as indicator" puts stdout " buffer is a buffer for a text description of the problem" puts stdout " iBufLen is the length of buffer" puts stdout "--------------------------------------------------------------------*/" puts stdout "static void ${prefix}GetError(void *data, int *iCode, char *buffer," puts stdout " int iBufLen){" stdCast puts stdout "}" puts stdout "/*------------------------------------------------------------------" puts stdout " TryAndFixIt tries everything which is possible in software to fix " puts stdout " a problem. iError is the error code from GetError, newValue is " puts stdout " the target value for the motor" puts stdout " Possible retrun values are:" puts stdout " MOTOK : everything fixed" puts stdout " MOTREDO : try again " puts stdout " MOTFAIL : cannot fix this" puts stdout "--------------------------------------------------------------------*/" puts stdout "static int ${prefix}FixIt(void *data, int iError, float newValue){" stdCast puts stdout " return MOTFAIL;" puts stdout "}" puts stdout "/*-------------------------------------------------------------------" puts stdout " Halt tries to stop the motor. Halt errors are ignored" puts stdout "---------------------------------------------------------------------*/" puts stdout "static int ${prefix}Halt(void *data){" stdCast puts stdout " return 1;" puts stdout "}" puts stdout "/*--------------------------------------------------------------------" puts stdout " GetDriverPar retrieves the value of a driver parameter." puts stdout " Name is the name of the parameter, fValue the value when found." puts stdout " Returns 0 on success, 0 else" puts stdout "-----------------------------------------------------------------------*/" puts stdout "static int ${prefix}GetDriverPar(void *data, char *name, float *value){" stdCast puts stdout " return 0;" puts stdout "}" puts stdout "/*----------------------------------------------------------------------" puts stdout " SetDriverPar sets a driver parameter. Returns 0 on failure, 1 on " puts stdout " success. Name is the parameter name, pCon the connection to report" puts stdout " errors too, value the new value" puts stdout "------------------------------------------------------------------------*/" puts stdout "static int ${prefix}SetDriverPar(void *data, SConnection *pCon," puts stdout " char *name, float value){" stdCast puts stdout " return 0;" puts stdout "}" puts stdout "/*-----------------------------------------------------------------------" puts stdout " ListDriverPar lists the names and values of driver parameters to " puts stdout " pCon. Motorname is the name of the motor ro prefix to the listing." puts stdout "-------------------------------------------------------------------------*/" puts stdout "static void ${prefix}ListDriverPar(void *data, char *motorname, " puts stdout " SConnection *pCon){" stdCast puts stdout "}" puts stdout "/*-----------------------------------------------------------------------" puts stdout " KillPrivate has the task to delete possibly dynamically allocated " puts stdout " memory in the private part of the driver structure" puts stdout "------------------------------------------------------------------------*/" puts stdout "static void ${prefix}KillPrivate(void *data){" stdCast puts stdout "}" puts stdout "/*=======================================================================*/" puts stdout "MotorDriver *${prefix}MakeMotorDriver(void) {" puts stdout " ${prefix}MotorDriver *pNew = NULL;" puts stdout "" puts stdout " pNew = malloc(sizeof(${prefix}MotorDriver));" puts stdout " if(pNew == NULL){" puts stdout " return NULL;" puts stdout " }" puts stdout " memset(pNew,0,sizeof(${prefix}MotorDriver));" puts stdout " " puts stdout " pNew->GetPosition = ${prefix}GetPos;" puts stdout " pNew->RunTo = ${prefix}RunTo;" puts stdout " pNew->Halt = ${prefix}Halt;" puts stdout " pNew->GetStatus = ${prefix}CheckStatus;" puts stdout " pNew->GetError = ${prefix}GetError;" puts stdout " pNew->TryAndFixIt = ${prefix}FixIt;" puts stdout " pNew->GetDriverPar = ${prefix}GetDriverPar;" puts stdout " pNew->SetDriverPar = ${prefix}SetDriverPar;" puts stdout " pNew->ListDriverPar = ${prefix}ListDriverPar;" puts stdout " pNew->KillPrivate = ${prefix}KillPrivate;" puts stdout " " puts stdout " return (MotorDriver *)pNew;" puts stdout "}" puts stdout ""