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:
committed by
Douglas Clowes
parent
eec824f98a
commit
d2f57e4615
@@ -1,204 +1,50 @@
|
||||
/**
|
||||
* @file Astrium Velocity Selector protocol
|
||||
* @Author Ferdi Franceschini
|
||||
*/
|
||||
#include <errno.h>
|
||||
#include <ascon.h>
|
||||
#include <ascon.i>
|
||||
#include <dynstring.h>
|
||||
|
||||
#define MAXRETRIES 3
|
||||
static char *UIDPROMPT="#SES#Fill in your user ID";
|
||||
static char *PWDPROMPT="#SES#Fill in your password";
|
||||
static char *CMDOK="#SOS#ACCEPT";
|
||||
static char *CMDERR="#SOS#NCCEPT";
|
||||
|
||||
typedef enum {
|
||||
Unknown,
|
||||
sendUID,
|
||||
sendPWD,
|
||||
Established
|
||||
} VelSelState;
|
||||
typedef struct {
|
||||
VelSelState subState;
|
||||
char *user;
|
||||
char *password;
|
||||
char *expect;
|
||||
int retries;
|
||||
} VelSelProt, *pVelSelProt;
|
||||
|
||||
void VelSelAuthUID(Ascon *a) {
|
||||
char chr;
|
||||
int VelSelReading(Ascon *a)
|
||||
{
|
||||
int ret;
|
||||
}
|
||||
void VelSelAuthPwd(Ascon *a) {
|
||||
}
|
||||
void VelSelAuthenticate(Ascon *a) {
|
||||
char chr;
|
||||
int ret;
|
||||
pVelSelProt pVelSel = (pVelSelProt)a->private;
|
||||
|
||||
switch (pVelSel->authProg) {
|
||||
case start:
|
||||
break;
|
||||
case readingUIDPrompt:
|
||||
break;
|
||||
case readingPWDPrompt:
|
||||
break;
|
||||
}
|
||||
char chr=0;
|
||||
ret = AsconReadChar(a->fd, &chr);
|
||||
if (ret > 0 && chr == '#') {
|
||||
while (AsconReadChar(a->fd, &chr) > 0) {
|
||||
if (chr == 0) {
|
||||
if (a->timeout > 0) {
|
||||
if (DoubleTime() - a->start > a->timeout) {
|
||||
AsconError(a, "read timeout", 0);
|
||||
a->state = AsconTimeout;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (a->state != AsconReadDone) {
|
||||
if (a->timeout > 0) {
|
||||
if (DoubleTime() - a->start > a->timeout) {
|
||||
AsconError(a, "read timeout", 0);
|
||||
a->state = AsconTimeout;
|
||||
return 1;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
DynStringConcatChar(a->rdBuffer, chr);
|
||||
while ((ret = AsconReadChar(a->fd, &chr)) > 0) {
|
||||
DynStringConcatChar(a->rdBuffer, chr);
|
||||
}
|
||||
}
|
||||
int VelSelWriteStart(Ascon *a) {
|
||||
DynStringConcatChar(a->wrBuffer, '\r');
|
||||
a->state = AsconWriting;
|
||||
a->wrPos = 0;
|
||||
return 1;
|
||||
a->state = AsconReadDone;
|
||||
DynStringConcatChar(a->rdBuffer, '\0');
|
||||
}
|
||||
|
||||
int VelSelReading(Ascon *a) {
|
||||
int VelSelProtHandler(Ascon *a)
|
||||
{
|
||||
int ret;
|
||||
char chr;
|
||||
pVelSelProt pVelSel = (pVelSelProt)a->private;
|
||||
|
||||
switch (pVelSel->subState) {
|
||||
case sendUID:
|
||||
ret = AsconReadChar(a->fd, &chr);
|
||||
if (ret > 0) {
|
||||
if (*pVelSel->expect == '\0') {
|
||||
pVelSel->substate = sendPWD;
|
||||
pVelSel->expect = PWDPROMPT;
|
||||
} else if (chr == *pVelSel->expect) {
|
||||
pVelSel->expect++;
|
||||
} else if (pVelSel->retries-- > 0) {
|
||||
a->state = AsconConnectStart;
|
||||
pVelSel->retries = MAXRETRIES;
|
||||
AsconError(a, "Did not get UID request", 0);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
pVelSel->retries = MAXRETRIES;
|
||||
break;
|
||||
case sendPWD:
|
||||
break;
|
||||
case Established:
|
||||
break;
|
||||
default:
|
||||
}
|
||||
switch(event) {
|
||||
case UIDReq:
|
||||
// wrBuffer = user:NVS
|
||||
a->state = AsconWriteStart;
|
||||
return 1;
|
||||
break;
|
||||
case PWDReq:
|
||||
// wrBuffer = password:NVS
|
||||
a->state = AsconWriteStart;
|
||||
return 1;
|
||||
break;
|
||||
case
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
int VelSelProtHandler(Ascon *a) {
|
||||
int ret;
|
||||
pVelSelProt pVelSel = (pVelSelProt)a->private;
|
||||
|
||||
switch (a->state) {
|
||||
case AsconConnecting:
|
||||
ret = AsconConnectSuccess(a->fd);
|
||||
if (ret == 0) {
|
||||
/* in progress */
|
||||
} else if (ret > 0) {
|
||||
pVelSelProt->subState = sendUID;
|
||||
a->state = AsconReading;
|
||||
} else if (ret < 0) {
|
||||
AsconError(a, "AsconConnectSuccess failed:", errno);
|
||||
}
|
||||
break;
|
||||
case AsconWriteStart:
|
||||
ret = VelSelWriteStart(a);
|
||||
return ret;
|
||||
break;
|
||||
switch(a->state){
|
||||
case AsconReading:
|
||||
ret = VelSelReading(a);
|
||||
return ret;
|
||||
return VelSelReading(a);
|
||||
break;
|
||||
default:
|
||||
return AsconStdHandler(a);
|
||||
}
|
||||
}
|
||||
|
||||
static void VelSelKill(void *data) {
|
||||
pVelSelProt pVelSel = (pVelSelProt)data;
|
||||
if (pVelSel == NULL)
|
||||
return;
|
||||
if (pVelSel->user != NULL)
|
||||
free(pVelSel->user);
|
||||
if (pVelSel->password != NULL)
|
||||
free(pVelSel->password);
|
||||
free(pVelSel);
|
||||
}
|
||||
|
||||
static int VelSelProtInit(Ascon *a, SConnection *con, int argc, char *argv[]) {
|
||||
pVelSelProt *pVelSel = NULL;
|
||||
Tcl_Interp *tcl_interp;
|
||||
|
||||
pVelSel = (pVelSelProt) malloc(sizeof(VelSelProt));
|
||||
if (VelSel == NULL) {
|
||||
SCWrite(con, "ERROR: malloc for pVelSel failed in VelSelProtInit",eError);
|
||||
return 0;
|
||||
}
|
||||
if (argc < 4) {
|
||||
SCWrite(con, "ERROR: You must provide host, user, password parameters",eError);
|
||||
return 0;
|
||||
}
|
||||
a->hostport = strdup(argv[1]);
|
||||
pVelSel->user = strdup(argv[2]);
|
||||
pVelSel->password = strdup(argv[3]);
|
||||
if (argc == 5) {
|
||||
tcl_interp = InterpGetTcl(pServ->pSics);
|
||||
if (TCL_ERROR == Tcl_GetDobule(tcl_interp,argv[4],&a->timeout)) {
|
||||
SCWrite(con, Tcl_GetStringResult(tcl_interp), eError);
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
a->timeout = 10;
|
||||
}
|
||||
|
||||
pVelSel->subState = Unknown;
|
||||
pVelSel->expect = UIDPROMPT;
|
||||
pVelSel->retries = MAXRETRIES;
|
||||
|
||||
a->private = pVelSel;
|
||||
a->killPrivate = VelSelKill;
|
||||
a->state = AsconConnectStart;
|
||||
|
||||
return 1;
|
||||
}
|
||||
void AddVelSelProtocol() {
|
||||
void AddVelSelProtocol()
|
||||
{
|
||||
AsconProtocol *prot = NULL;
|
||||
|
||||
prot = calloc(sizeof(AsconProtocol), 1);
|
||||
prot->name = strdup("astvelsel");
|
||||
prot->init = VelSelProtInit;
|
||||
prot->init = AsconStdInit;
|
||||
prot->handler = VelSelProtHandler;
|
||||
AsconInsertProtocol(prot);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user