mrfioc2  2.3.0
Functions
seqnsls2.c File Reference
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <dbDefs.h>
#include <errlog.h>
#include <recGbl.h>
#include <alarm.h>
#include <registryFunction.h>
#include <menuFtype.h>
#include <aSubRecord.h>
#include <epicsExport.h>
Include dependency graph for seqnsls2.c:

Go to the source code of this file.

Functions

long seq_select (aSubRecord *prec)
 NSLS2 sequence selector. More...
 
 epicsExportRegistrar (asub_nsls2_evg)
 

Function Documentation

◆ epicsExportRegistrar()

epicsExportRegistrar ( asub_nsls2_evg  )

◆ seq_select()

long seq_select ( aSubRecord *  prec)

NSLS2 sequence selector.

Process operator timing mode selection into a set of sequence rep. masks and associated status

Inputs

Parameters
ALinac mode selection (enum) A ULONG
BBooster mode selection (enum) B ULONG
CLinac permitted mode mask (bitmask) C ULONG
DBooster permitted mode mask (bitmask) D ULONG

Outputs

Parameters
VALABooster injection possible (bool) VALA ULONG
VALBInjection rep. diagnostic bit mask (bitmask) VALB ULONG
VALCLinac sequence rep. mask (bitmask) VALC ULONG
VALDBooster 1Hz sequence rep. mask (bitmask) VALD ULONG
VALEBooster 2Hz sequence rep. mask (bitmask) VALE ULONG
VALFBooster Stacking sequence rep. mask (bitmask) VALF ULONG

Definition at line 54 of file seqnsls2.c.

55 {
56  int fail = 0;
57  epicsUInt32 LNMode, BRMode, LNMask, BRMask;
58  epicsUInt32 *BRAllow = prec->vala,
59  *InjMask = prec->valb,
60  *LNRepMask = prec->valc,
61  *BR1HzRepMask = prec->vald,
62  *BR2HzRepMask = prec->vale,
63  *BRStkRepMask = prec->valf;
64 
65  if(prec->fta!=menuFtypeULONG ||
66  prec->ftb!=menuFtypeULONG ||
67  prec->ftc!=menuFtypeULONG ||
68  prec->ftd!=menuFtypeULONG ||
69  prec->ftva!=menuFtypeULONG ||
70  prec->ftvb!=menuFtypeULONG ||
71  prec->ftvc!=menuFtypeULONG ||
72  prec->ftvd!=menuFtypeULONG ||
73  prec->ftve!=menuFtypeULONG ||
74  prec->ftvf!=menuFtypeULONG)
75  {
76  errlogPrintf("%s: Invalid field types!\n", prec->name);
77  (void)recGblSetSevr(prec, READ_ALARM, INVALID_ALARM);
78  return 0;
79  }
80 
81  LNMode = *(epicsUInt32*)prec->a;
82  BRMode = *(epicsUInt32*)prec->b;
83  LNMask = *(epicsUInt32*)prec->c;
84  BRMask = *(epicsUInt32*)prec->d;
85 
86  /* Allow only permitted slots to be filled */
87  LNMode &= LNMask;
88  BRMode &= BRMask;
89 
90  if(LNMode&~0x3ff) {
91  errlogPrintf("%s: Invalid LN Mode Mask\n", prec->name);
92  fail = 1;
93  }
94  if(BRMode&~0xf) {
95  errlogPrintf("%s: Invalid BR Mode Mask\n", prec->name);
96  fail = 1;
97  }
98 
99  if(fail) {
100  (void)recGblSetSevr(prec, UDF_ALARM, INVALID_ALARM);
101  LNMode = BRMode = 0;
102  }
103 
104  *InjMask = (LNMode<<4)|BRMode;
105 
106  switch(*InjMask) {
107  case 0x011: /* 1Hz in both */
108  case 0x032: /* Stacking in both */
109  case 0x21C: /* 2 Hz in both */
110  *BRAllow = 1;
111  break;
112  default: /* All others prohibit injection into BR */
113  *BRAllow = 0;
114  }
115 
116  *LNRepMask = LNMode;
117  *BR1HzRepMask = BRMode & 1;
118  *BR2HzRepMask = (BRMode>>2) & 3;
119  *BRStkRepMask = (BRMode>>1) & 1;
120 
121  return 0;
122 }