SICS-294 anstohttp.c

Histmem now only calls TaskYield after SICS has finished initalising, this stops the statusfile task from being called early and overwriting the status file. Created ANSTO_MakeHistMemory command to install ANSTO_HistAction
Added veto functions.  Mapped the HistDriver interface Pause() and Continue() commands to AnstoHttpVeto and AnstoHttpNoVeto. Implemented an ANSTO_Histaction to call AnstoHttpPause when sent a "pause" subcommand.

hmcontrol_ansto.c
Call AnstoHttpPause() directly when Pause_HM_After_Count is set to preserver current behaviour.

counterdriv.c
Now sends the correct "SICS RESUME" command to resume a paused count.

ansto_sctdriveadapter.c NEW
This lets you create driveable objects from script-context controllers which have one node for setting a parameter and another node for reading the parameter (eg temperature controllers, choppers, velocity selectors)

sctemonadapter.c NEW
This generates an environment monitor interface for script-context controllers so that the emon object in SICS will be able to pause counters if the controller goes out of tolerance.

sct_usbtmcprot.c, usbtmc.h NEW
First attempt at a protocol handler for USB Test and Measurement Class devices

sct_julabo_lh45.tcl NEW
Implements script-context controller for the Julabo LH45 temperature controller.

Makefile
Added ansto_sctdriveadapter and sctemonadapter

hardsup/makefile
Added velocity selector and usbtmc protocol handlers

hardsup/sct_velselprot.c
Simplified, don't worry about trying to implement a login handler for now, just implement a "Reading" handler.

site_ansto.c
Add the velocity selector and USBTMC protocol handlers.
Added the ANSTO_MakeHM command

instrument/config/hipadaba/common_instrument_dictionary.tcl
Added support for auxiliary data, ie extra meta-data entries in the "data" group of the nexus file.
Add new NXvelocity_selector object under /instrument.

instrument/config/hipadaba/hipadaba_configuration_common.tcl
Add the new "sct_object" script-context controller objects to the hdb tree.

instrument/config/hipadaba/instdict_specification.tcl
Define the new sct_object controllers.

instrument/config/hmm/hmm_configuration_common_1.tcl
Use the new ANSTO_MakeHM command to create histmem drivers which support veto.
Define allowed attributes and elements for the BAT_TABLE and FAT_TABLE
Stop between counts instead of pausing because setting pause now sends a veto.

instrument/config/motors/sct_jogmotor_common.tcl
You now need to specify klass when creating a jogmotor.

instrument/config/motors/sct_positmotor_common.tcl
You can now specify an optional function which calculates the instrument parameter (eg attenuation) from a posit table entry when defining a posit motor.

instrument/config/nexus/nxscripts_common_1.tcl
Report file status info in the /experiment section of the hdb tree.  Add auxiliary data to data file.
Handle saving data from script-context controller objects.

instrument/util/script_context_util.tcl
Added procedure to set required properties  for saving script-context object data.

instrument/util/utility.tcl
Added set_sct_object_attributes proc to automatically set required attributes on SCT_OBJECTs
Fixed hlistplainprop to deal with empty property fields on hdb nodes.

instrument/server_config.tcl
Call the new nexus initialisation command and set attributes on sct objects.

hrpd/config/motors/motor_configuration.tcl
New absenc home readings for mchi and mphi. New absenc home and range for mf1

hipd/config/commands/commands.tcl
Exported and published the new ajscmds so that they can be used in batch files.

hipd/config/motors/motor_configuration.tcl
New mchi absenc home

rsd/config/hmm/hmm_configuration.tcl
Provide support for saving corrected hmm data

rsd/config/motors/motor_configuration.tcl
Use simple names for motors.

SICS-329

sans/config/INSTCFCOMMON.TXT
Added julabo and lakeshore configuration files to list.

sans/config/optics/guide_configuration.tcl
Added entrance aperture positions to the configuration table and the cn_maps which map the index to the component ID.

sans/commands/commands.tcl
The "guide" command now set EApPosYmm after driving the guides in place.
The indexed position to component maps (cn_map) have been moved to the guide_configuration.tcl file.

sans/motors/motor_configuration.tcl
Set samy home to 56.1mm

sans/config/velsel/sct_velsel.tc NEW
Implements script-context controller object for the NVS40 velocity selector. TODO tilt-angle control, driveable interface.

sans/config/hmm/hmm_configuration.tcl
Set 5.08mm spacing on detector width. Use pixel-offset for vertical and horizontal detector axes.

sans/config/motors/motor_configuration.tcl
Swap directions of beamstops 4 and 5 (the two smallest)
New config parameters for samx, samthet, apx, det, detoff, bsz,

sans/config/motors/positmotor_configuration.tcl
Added descriptive headers to positmotor configuration tables and new synstax for the make positmotor command.

sans/config/nexus/nxscripts.tcl
Implemented initialisation command.

sans/config/parameters/parameters.tcl
Added SampleThickness and TransmissionFlag.  Calculate SamplePosYmm from samy and SamyOffsetmm.
Added beamstops to hdb tree.

reflectometer/config/nexus/nxscripts.tcl
Implement the initialisation procedure.

r2767 | ffr | 2009-03-31 10:16:54 +1100 (Tue, 31 Mar 2009) | 123 lines
This commit is contained in:
Ferdi Franceschini
2009-03-31 10:16:54 +11:00
committed by Douglas Clowes
parent eec824f98a
commit d2f57e4615
39 changed files with 2026 additions and 557 deletions

282
site_ansto/sctemonadapter.c Normal file
View File

@@ -0,0 +1,282 @@
/**
* --------------------------------------------------------------*/
#include <sics.h>
#include <sicshipadaba.h>
#include <devser.h>
#include <tcl.h>
#include <macro.h>
#include <sicsobj.h>
#include "scriptcontext.h"
/*---------------------------------------------------------------*/
typedef struct {
pObjectDescriptor pDes;
pIDrivable pDrivInt; /* Need a drivable interface for "emon list" */
pEVInterface pEVI;
EVMode eMode;
int iPaused;
char *pName;
pHdb modeNode, tolNode, errNode;
}SctEmon, *pSctEmon;
/* emon will monitor when mode is "monitor" or "paused" */
/* XXX nopause
static char *modestr[5] = {"idle", "drive", "monitor", "error", "paused"};
static int EVPaused=4;*/
/*---------------------------------------------------------------*/
/**
@brief a dummy getvalue command to prevent "emon list" from aborting SICS
*/
static float SCTEmonGetValue(void *pData, SConnection *pCon)
{
return -999.666;
}
/* XXX nopause
static void SetModeNode(pSctEmon self, EVMode mode)
{
if (self->modeNode->value.v.text != NULL)
free(self->modeNode->value.v.text);
self->modeNode->value.v.text = strdup(modestr[mode]);
}
*/
static void *SCTEmonGetInterface(void *pData, int ID){
pSctEmon self = NULL;
self = (pSctEmon)pData;
assert(self);
if (self->modeNode == NULL || self->tolNode == NULL || self->errNode == NULL)
return NULL;
switch (ID) {
case DRIVEID:
return self->pDrivInt;
case ENVIRINTERFACE:
return self->pEVI;
default:
return NULL;
}
}
/*----------------------------------------------------------------
Reads node value and returns EVMode
Convert mode string from the evmode textnode value to
typedef enum { EVIdle, EVDrive, EVMonitor, EVError } EVMode;
"idle", "drive", "monitor", "error"
------------------------------------------------------------------*/
static EVMode SCTEmonGetMode(void *pData)
{
pSctEmon self = NULL;
self = (pSctEmon)pData;
assert(self);
switch(self->modeNode->value.v.text[0]) {
case 'I':
case 'i':
return EVIdle;
break;
case 'D':
case 'd':
return EVDrive;
break;
case 'M':
case 'm':
/*XXX nopause case 'P':
case 'p':*/
return EVMonitor;
break;
case 'E':
case 'e':
return EVError;
break;
default:
return EVIdle;
//TODO Handle error
}
}
/*----------------------------------------------------------------
This routine can return 0 when a limit problem occurred
OKOK when the motor was successfully started
HWFault when a problem occured starting the device
Possible errors shall be printed to pCon
For real motors, this is supposed to try at least three times
to start the motor in question
val is the value to drive the motor too
Reads value from the "isintolerance" node (1 or 0)
------------------------------------------------------------------*/
static int SCTEmonIsInTolerance(void *pData)
{
pSctEmon self = NULL;
pExeList pExe;
char pBueffel[512];
char monMode;
self = (pSctEmon)pData;
assert(self);
if(self->tolNode->value.v.intValue == 1) {
monMode = self->modeNode->value.v.text[0];
if (self->iPaused) {
pExe = GetExecutor();
ContinueExecution(pExe);
self->iPaused = 0;
sprintf(pBueffel,"Device %s back in tolerances again", self->pName);
SCWrite(GetExeOwner(pExe), pBueffel, eWarning);
}
//XXX nopause SetModeNode(self, EVMonitor);
return 1;
} else {
return 0;
}
}
/*----------------------------------------------------------------
Checks the status of a running motor. Possible return values
HWBusy The motor is still running
OKOK or HWIdle when the motor finished driving
HWFault when a hardware problem ocurred
HWPosFault when the hardware cannot reach a position
Errors are duly to be printed to pCon
For real motors CheckStatus again shall try hard to fix any
issues with the motor
The HandleError node value can be one of Lazy, Pause, Interrupt, Safe
NOTE: emon ignores the returned iStatus value
------------------------------------------------------------------*/
static int SCTEmonHandleError(void *pData)
{
pSctEmon self = NULL;
pExeList pExe;
int iRet, iHandler, iStatus;
char monMode;
self = (pSctEmon)pData;
assert(self);
monMode = self->modeNode->value.v.text[0];
//XXX nopause SetModeNode(self, EVError);
switch(self->errNode->value.v.text[0]) {
case 'l':
case 'L': /* Lazy */
iStatus = 1;
break;
case 'p':
case 'P': /* Pause */
pExe = GetExecutor();
if(IsCounting(pExe)) {
if (!self->iPaused) {
SCWrite(GetExeOwner(pExe),"Pausing till OK",eError);
}
PauseExecution(pExe);
self->iPaused = 1;
//XXX nopause SetModeNode(self, EVPaused);
iStatus = 1;
}
break;
case 'i':
case 'I': /* Interrupt */
/* TODO How is this supposed to work?
SetInterrupt((int)ObVal(self->pParam,INTERRUPT));*/
iStatus = 1;
break;
case 's':
case 'S': /* Safe, run to a safe place, put him into idle afterwards */
/*TODO Drive environment to a safevalue */
break;
default:
return 0;
}
/* NOTE: emon ignores the return value */
return iStatus;
}
/*----------------------------------------------------------------
returns NULL on failure, a new datastructure else
------------------------------------------------------------------*/
static pSctEmon SCTEMONMakeObject(){
pSctEmon self = NULL;
self = calloc(sizeof(SctEmon),1);
if(self == NULL){
return NULL;
}
self->pDes = CreateDescriptor("SctEmonAdapter");
if(self->pDes == NULL) {
free(self);
return NULL;
}
self->pEVI = CreateEVInterface();
if(self->pEVI == NULL) {
DeleteDescriptor(self->pDes);
free(self);
return NULL;
}
self->pDrivInt = CreateDrivableInterface();
if(self->pDrivInt == NULL) {
DeleteDescriptor(self->pDes);
free(self->pEVI);
free(self);
return NULL;
}
self->pDes->GetInterface = SCTEmonGetInterface;
self->pEVI->GetMode = SCTEmonGetMode;
self->pEVI->IsInTolerance = SCTEmonIsInTolerance;
self->pEVI->HandleError = SCTEmonHandleError;
self->pDrivInt->Halt = NULL;
self->pDrivInt->CheckLimits = NULL;
self->pDrivInt->SetValue = NULL;
self->pDrivInt->CheckStatus = NULL;
self->pDrivInt->GetValue = SCTEmonGetValue;
return self;
}
/*----------------------------------------------------------------*/
static hdbCallbackReturn SctDummyCallback(Hdb *node, void *userData,
hdbMessage *msg) {
return hdbContinue;
}
/*----------------------------------------------------------------*/
static void SctEmonDeleteNode(void *pData) {
pSctEmon self = (pSctEmon)pData;
self->modeNode = NULL;
self->tolNode = NULL;
self->errNode = NULL;
}
/*--------------------------------------------------------------
args: name, modepath, tolpath, errpath
*/
int SctMakeEmonAdapter(SConnection *pCon, SicsInterp *pSics, void *object,
int argc, char *argv[]) {
pSctEmon pNew = NULL;
hdbCallback *cb;
if(argc < 5){
SCWrite(pCon,"ERROR: not enough arguments for SctMakeEmonAdapter", eError);
return 0;
}
pNew = SCTEMONMakeObject();
if(pNew == NULL){
SCWrite(pCon,"ERROR: out of memory in SctMakeEmonAdapter",
eError);
return 0;
}
pNew->pName = strdup(argv[1]);
pNew->modeNode = FindHdbNode(NULL,argv[2], pCon);
pNew->tolNode = FindHdbNode(NULL,argv[3], pCon);
pNew->errNode = FindHdbNode(NULL,argv[4], pCon);
pNew->iPaused = 0;
/*XXX I'm guessing that SctEmonDeleteNode will be called when the
script context object is deleted. So the emon functions should check
if node == NULL before trying to do something */
cb = MakeHipadabaCallback(SctDummyCallback, pNew, SctEmonDeleteNode);
assert(cb);
AppendHipadabaCallback(pNew->modeNode, cb);
EVRegisterController(FindEMON(pSics),argv[1],pNew, pCon);
return 1;
}
/*---------------------------------------------------------------*/
void SctEmonInit(void) {
AddCmd("makesctemon", SctMakeEmonAdapter);
}