using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; namespace KMotion_dotNet { /// /// Defines form PC-DSP.h defining number of available devices /// public class StatusConsts { /// /// Number of Persist variable included in Status Upload /// public const int N_PC_COMM_PERSIST = 8; /// /// Number of Kanalog DACs /// public const int N_DACS = 8; // Kanalog /// /// Number of Kanalog ADCs /// public const int N_ADCS = 8; /// /// Number 8-bit PWMS on IO Pins /// public const int N_PWMS = 8; /// /// Number Encoder Inputs on KFLOP 0 - 7 /// public const int N_ENCS = 8; /// /// Number Encoder Inputs on Kogna 0 - 19 /// public const int N_ENCS_KOGNA = 20; /// /// Number DACs on Kogna /// public const int N_DACS_KOGNA = 8; // referenced after Kanalog as 8-15 /// /// Number ADCs on KOGNA /// public const int N_ADCS_KOGNA = 4; // referenced after Kanalog as 8-11 /// /// Number ADCs on SnapAmp per SnapAmpA /// public const int N_ADCS_SNAP = 8; // per snap amp /// /// Number PWMs on SnapAmp per SnapAmpA /// public const int N_PWMS_SNAP = 4; // per snap amp /// /// Number Encoder Inputs on SnapAmp 0 - 19 /// public const int N_ENCS_SNAP = 4; /// /// Number Axis Channels available for Kogna /// (KFLOP has only 8 fields for additional channels will be zero) /// public const int N_CHANNELS_KOGNA = 16; /// /// Number 8-bit PWMs for Kogna/KFLOP /// public const int N_IO_PWMS = 8; /// /// Number 12-bit (High Resolution) HRPWMs for Kogna /// public const int N_KOGNA_HRPWM = 4; } /// /// This structure matches exactly the binary form as the Kogna/KFLOP /// MAIN_STATUS Structure so it can be uploaded as a binary image. /// public struct KM_MainStatusRaw { /// /// Bulk status record packed version and size info /// bits 16-23 = version, bits 0-15 = size in words /// public int VersionAndSize; /// /// Bulk status record ADC values (8 Kanalog + 2 x 8 SnapAmp) /// [MarshalAs(UnmanagedType.ByValArray, SizeConst = StatusConsts.N_ADCS + 2 * StatusConsts.N_ADCS_SNAP)] public int[] ADC; /// /// Bulk status record DAC values (8 Kanalog) /// [MarshalAs(UnmanagedType.ByValArray, SizeConst = StatusConsts.N_DACS)] public int[] DAC; /// /// Bulk status record PWM values (8 obsolete PWMS + 2 x 4 SnapAmp) /// [MarshalAs(UnmanagedType.ByValArray, SizeConst = StatusConsts.N_PWMS + 2 * StatusConsts.N_PWMS_SNAP)] public int[] PWM; /// /// Bulk status record Axis Measured positions (Encoder or other sensing device) /// [MarshalAs(UnmanagedType.ByValArray, SizeConst = StatusConsts.N_CHANNELS_KOGNA)] public double[] Position; /// /// Bulk status record Axis Commanded Destinations /// [MarshalAs(UnmanagedType.ByValArray, SizeConst = StatusConsts.N_CHANNELS_KOGNA)] public double[] Destination; /// /// Bulk status record Axis First output channel specified /// [MarshalAs(UnmanagedType.ByValArray, SizeConst = StatusConsts.N_CHANNELS_KOGNA)] public byte[] OutputChan0; /// /// Bulk status record feedback selected input modes /// 4 bits for each axis (not sure why only using 16 of 32 bits) /// Axes 0-3 /// public int InputModes; /// /// Bulk status record feedback selected input modes #2 /// 4 bits for each axis /// Axes 4-7 /// public int InputModes2; /// /// Bulk status record feedback selected input modes #3 /// 4 bits for each axis /// Axes 8-11 /// public int InputModes3; /// /// Bulk status record feedback selected input modes #4 /// 4 bits for each axis /// Axes 12-15 /// public int InputModes4; /// /// Bulk status record feedback selected output modes /// Axes 0-3 /// public int OutputModes; // 4 bits for each axis /// /// Bulk status record feedback selected output modes #2 /// Axes 4-7 /// public int OutputModes2; // 4 bits for each axis /// /// Bulk status record feedback selected output modes #3 /// Axes 8-11 /// public int OutputModes3; // 4 bits for each axis /// /// Bulk status record feedback selected output modes #4 /// Axes 11-15 /// public int OutputModes4; // 4 bits for each axis /// /// Bulk status record Current axis enables /// public int Enables; // 1 bit for each axis /// /// Bulk status record Current axis completes /// public int AxisDone; // 1 bit for each axis /// /// Bulk status record Current KFLOP 64 IO Bit directions (inputs vs outputs) /// [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public int[] BitsDirection; // KFLOP - 64 bits of I/O direction 1 = output /// /// Bulk status record Current Kogna IO Bit directions (inputs vs outputs) /// Kogna - 24 bits 200-223 of I/O direction 1 = output /// public int BitsDirection200; // Kogna - 24 bits 200-223 of I/O direction 1 = output /// /// Bulk status record Current Kogna IO Bit directions (inputs vs outputs) /// Kogna - 10 bits 280-289 of I/O direction 1 = output /// public int BitsDirection280; // Kogna - 10 bits 280-289 of I/O direction 1 = output /// /// Bulk status record Current KFLOP/Kogna 64 IO Bit states /// [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public int[] BitsState; // KFLOP - 64 bits of state lsb=I/O bit0 /// /// Bulk status record Current KFLOP/Kogna 64 IO Bit states /// Kogna - 90 bits 200-289 of state lsb=I/O bit200 /// [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public int[] BitsState200; // Kogna - 90 bits 200-289 of state lsb=I/O bit200 /// /// Bulk status record /// Kogna - 10 Pin function modes 2 bits per pin 4 HRPWM + 6 SPI /// public int PinMuxModes; // Kogna - 10 Pin function modes 2 bits per pin 4 HRPWM + 6 SPI /// /// Bulk status record Kogna 4 ADCs /// format 12 bits data (signed extended to 16 bits) /// [MarshalAs(UnmanagedType.ByValArray, SizeConst = StatusConsts.N_ADCS_KOGNA)] public short[] Kogna_ADC; // format 12 bits data (signed extended to 16 bits) /// /// Bulk status record Kogna 8 DACSs /// format 12 bits data (signed extended to 16 bits) /// [MarshalAs(UnmanagedType.ByValArray, SizeConst = StatusConsts.N_DACS_KOGNA)] public short[] Kogna_DAC; // format 12 bits data /// /// Bulk status record Kogna /// Prescale sets frequency of all 8 8-bit PWMs /// public byte Kogna_PWM_Prescale; // Prescale sets frequency of all 8 8-bit PWMs /// /// Bulk status record Kogna /// current pulse settings of all 8 8-bit IO PWMs /// [MarshalAs(UnmanagedType.ByValArray, SizeConst = StatusConsts.N_IO_PWMS)] public byte[] Kogna_PWM; // current pulse settings /// /// Bulk status record Kogna /// current PWM Enables to control Pin of all 8 8-bit IO PWMs /// [MarshalAs(UnmanagedType.ByValArray, SizeConst = StatusConsts.N_IO_PWMS)] public byte[] Kogna_PWM_Enables; // PWM Enables to control Pin? /// /// Bulk status record Kogna /// current Kogna HRPWMs Periods (common for HRPWM 0 and 1) /// public UInt16 HRPWMPeriod01; // Kogna HRPWMs Periods /// /// Bulk status record Kogna /// current Kogna HRPWM Periods (for HRPWM 2) /// public UInt16 HRPWMPeriod2; /// /// Bulk status record Kogna /// current Kogna HRPWM Periods (for HRPWM 3) /// public UInt16 HRPWMPeriod3; /// /// Bulk status record Kogna /// current Kogna Kogna 4 HRPWMs Pulse widths /// [MarshalAs(UnmanagedType.ByValArray, SizeConst = StatusConsts.N_KOGNA_HRPWM)] public UInt16[] HRPWM; // Kogna HRPWMs Pulse widths /// /// Bulk status record Current SnapAmp #0 IO Bit directions (inputs vs outputs) /// public int SnapBitsDirection0; // Snap - 32 bits of I/O direction 1=output 16-29 GPIO only, Card 0 /// /// Bulk status record Current SnapAmp #1 IO Bit directions (inputs vs outputs) /// public int SnapBitsDirection1; // Snap - 32 bits of I/O direction 1=output 16-29 GPIO only, Card 1 /// /// Bulk status record Current SnapAmp #0 IO Bit States /// public int SnapBitsState0; // Snap - 32 bits of state 16-29 GPIO 0-7 Diff 8-15 OPTO, Card 0 /// /// Bulk status record Current SnapAmp #1 IO Bit States /// public int SnapBitsState1; // Snap - 32 bits of state 16-29 GPIO 0-7 Diff 8-15 OPTO, Card 1 /// /// Bulk status record Current Kanalog Input Bit States /// public int KanalogBitsStateInputs; // Kanalog - 16 bits 128-143 /// /// Bulk status record Current Kanalog Output Bit States /// public int KanalogBitsStateOutputs; // Kanalog - 24 bits 144-167 /// /// Bulk status record Current Boot Thread Startup Enables /// public int RunOnStartUp; // word Bits 1-7 selects which threads to execute on startup /// /// Bulk status record Current Thread Execution State /// public int ThreadActive; // one bit for each thread, 1=active, bit 0 - primary /// /// Bulk status record current StopImmediate (feedhold) state /// public int StopImmediateState; // Status of Stop Coordinated Motion Immediately /// /// Bulk status record Time Stamp in seconds of when status was acquired /// public double TimeStamp; // Time in seconds (since KFlop boot) this status was aquired /// /// Bulk status record KFLOP-PC 8 Communication variables 100-107 /// [MarshalAs(UnmanagedType.ByValArray, SizeConst = StatusConsts.N_PC_COMM_PERSIST)] public int[] PC_comm;// 8 persist Variables constantly uploaded to send misc commands/data to PC /// /// Bulk status record Virtual bits packed 16 per word 48-63 /// public UInt32 VirtualBits; // Virtual I/O bits simulated in memory /// /// Bulk status record Extended Virtual bits packed 32 per word /// 1024-1055 /// public UInt32 VirtualBitsEx0; // only upload 32 1024 Expanded Virtual Bits } /// /// Bulk status record uploaded from KFLOP /// public struct KM_MainStatus { /// /// This structure matches exactly the binary form as the Kogna/KFLOP /// MAIN_STATUS Structure so it can be uploaded as a binary image. /// public KM_MainStatusRaw MainStatus; /// /// Time in milliseconds since Windows Started where /// Status record was last uploaded /// Note: rolls over every 49 days /// public int _TicksAtUpdate; #region Properties /// /// Bulk status record packed version and size info /// bits 16-23 = version, bits 0-15 = size in words /// public int VersionAndSize { get { return MainStatus.VersionAndSize; } } /// /// Bulk status record ADC values (8 Kanalog + 2 x 8 SnapAmp) /// public int[] ADC { get { return MainStatus.ADC; } } /// /// Bulk status record DAC values (8 Kanalog) /// public int[] DAC { get { return MainStatus.DAC; } } /// /// Bulk status record PWM values (8 obsolete PWMS + 2 x 4 SnapAmp) /// public int[] PWM { get { return MainStatus.PWM; } } /// /// Bulk status record Axis Measured positions (Encoder or other sensing device) /// public double[] Position { get { return MainStatus.Position; } } /// /// Bulk status record Axis Commanded Destinations /// public double[] Destination { get { return MainStatus.Destination; } } /// /// Bulk status record Axis First output channel specified /// public byte[] OutputChan0 { get { return MainStatus.OutputChan0; } } /// /// Bulk status record feedback selected input modes /// Axes 0-3 /// public int InputModes { get { return MainStatus.InputModes; } } /// /// Bulk status record feedback selected input modes #2 /// Axes 4-7 /// public int InputModes2 { get { return MainStatus.InputModes2; } } /// /// Bulk status record feedback selected input modes #3 /// Axes 8-11 /// public int InputModes3 { get { return MainStatus.InputModes3; } } /// /// Bulk status record feedback selected input modes #4 /// Axes 12-15 /// public int InputModes4 { get { return MainStatus.InputModes4; } } /// /// Bulk status record feedback selected output modes /// Axes 0-3 /// public int OutputModes { get { return MainStatus.OutputModes; } } /// /// Bulk status record feedback selected output modes #2 /// Axes 4-7 /// public int OutputModes2 { get { return MainStatus.OutputModes2; } } /// /// Bulk status record feedback selected output modes #3 /// Axes 8-11 /// public int OutputModes3 { get { return MainStatus.OutputModes3; } } /// /// Bulk status record feedback selected output modes #4 /// Axes 11-15 /// public int OutputModes4 { get { return MainStatus.OutputModes4; } } /// /// Bulk status record Current axis enables /// public int Enables { get { return MainStatus.Enables; } } /// /// Bulk status record Current axis completes /// public int AxisDone { get { return MainStatus.AxisDone; } } /// /// Bulk status record Current KFLOP 64 IO Bit directions (inputs vs outputs) /// public int[] BitsDirection { get { return MainStatus.BitsDirection; } } /// /// Bulk status record Current Kogna IO Bit directions (inputs vs outputs) /// Kogna - 24 bits 200-223 of I/O direction 1 = output /// public int BitsDirection200 { get { return MainStatus.BitsDirection200; } } /// /// Bulk status record Current Kogna IO Bit directions (inputs vs outputs) /// Kogna - 10 bits 280-289 of I/O direction 1 = output /// public int BitsDirection280 { get { return MainStatus.BitsDirection280; } } /// /// Bulk status record Current KFLOP/Kogna 64 IO Bit states /// public int[] BitsState { get { return MainStatus.BitsState; } } /// /// Bulk status record Current KFLOP/Kogna 64 IO Bit states /// Kogna - 90 bits 200-289 of state lsb=I/O bit200 /// public int[] BitsState200 { get { return MainStatus.BitsState200; } } /// /// Bulk status record /// Kogna - 10 Pin function modes 2 bits per pin 4 HRPWM + 6 SPI /// public int PinMuxModes { get { return MainStatus.PinMuxModes; } } /// /// Bulk status record Kogna 4 ADCs /// format 12 bits data (signed extended to 16 bits) /// public short[] Kogna_ADC { get { return MainStatus.Kogna_ADC; } } /// /// Bulk status record Kogna 8 DACSs /// format 12 bits data (signed extended to 16 bits) /// public short[] Kogna_DAC { get { return MainStatus.Kogna_DAC; } } /// /// Bulk status record Kogna /// Prescale sets frequency of all 8 8-bit PWMs /// public byte Kogna_PWM_Prescale { get { return MainStatus.Kogna_PWM_Prescale; } } /// /// Bulk status record Kogna /// current pulse settings of all 8 8-bit IO PWMs /// public byte[] Kogna_PWM { get { return MainStatus.Kogna_PWM; } } /// /// Bulk status record Kogna /// current PWM Enables to control Pin of all 8 8-bit IO PWMs /// public byte[] Kogna_PWM_Enables { get { return MainStatus.Kogna_PWM_Enables; } } /// /// Bulk status record Kogna /// current Kogna HRPWMs Periods (common for HRPWM 0 and 1) /// public ushort HRPWMPeriod01 { get { return MainStatus.HRPWMPeriod01; } } /// /// Bulk status record Kogna /// current Kogna HRPWM Periods (for HRPWM 2) /// public ushort HRPWMPeriod2 { get { return MainStatus.HRPWMPeriod2; } } /// /// Bulk status record Kogna /// current Kogna HRPWM Periods (for HRPWM 3) /// public ushort HRPWMPeriod3 { get { return MainStatus.HRPWMPeriod3; } } /// /// Bulk status record Kogna /// current Kogna Kogna 4 HRPWMs Pulse widths /// public ushort[] HRPWM { get { return MainStatus.HRPWM; } } /// /// Bulk status record Current SnapAmp #0 IO Bit directions (inputs vs outputs) /// public int SnapBitsDirection0 { get { return MainStatus.SnapBitsDirection0; } } /// /// Bulk status record Current SnapAmp #1 IO Bit directions (inputs vs outputs) /// public int SnapBitsDirection1 { get { return MainStatus.SnapBitsDirection1; } } /// /// Bulk status record Current SnapAmp #0 IO Bit States /// public int SnapBitsState0 { get { return MainStatus.SnapBitsState0; } } /// /// Bulk status record Current SnapAmp #1 IO Bit States /// public int SnapBitsState1 { get { return MainStatus.SnapBitsState1; } } /// /// Bulk status record Current Kanalog Input Bit States /// public int KanalogBitsStateInputs { get { return MainStatus.KanalogBitsStateInputs; } } /// /// Bulk status record Current Kanalog Output Bit States /// public int KanalogBitsStateOutputs { get { return MainStatus.KanalogBitsStateOutputs; } } /// /// Bulk status record Current Boot Thread Startup Enables /// public int RunOnStartUp { get { return MainStatus.RunOnStartUp; } } /// /// Bulk status record Current Thread Execution State /// public int ThreadActive { get { return MainStatus.ThreadActive; } } /// /// Bulk status record current StopImmediate (feedhold) state /// public int StopImmediateState { get { return MainStatus.StopImmediateState; } } /// /// Bulk status record Time Stamp in seconds of when status was acquired /// public double TimeStamp { get { return MainStatus.TimeStamp; } } /// /// Bulk status record KFLOP-PC 8 Communication variables 100-107 /// public int[] PC_comm { get { return MainStatus.PC_comm; } } /// /// Bulk status record Virtual bits packed 16 per word 48-63 /// public int VirtualBits { get { return (int)MainStatus.VirtualBits; } } /// /// Bulk status record Extended Virtual bits packed 32 per word /// 1024-1055 /// public int VirtualBitsEx0 { get { return (int)MainStatus.VirtualBitsEx0; } } /// /// Bulk status record Windows Time when status was updates (millisec since Windows Started) /// public int TicksAtUpdate { get { return _TicksAtUpdate; } } #endregion /// /// Bulk status record ADC values (Kanalog) /// /// channel number to get /// value public int GetADC(int index) { if (index < MainStatus.ADC.Length) { return MainStatus.ADC[index]; } else { return 0; } } /// /// Bulk status record DAC values (Kanalog) /// /// channel number to get /// value public int GetDAC(int index) { if (index < MainStatus.DAC.Length) { return MainStatus.DAC[index]; } else { return 0; } } /// /// Bulk status record PWM values (SnapAmp) /// /// channel number to get (8 obsolete + 2 x 4 SnapAmp) /// value public int GetPWM(int index) { if (index < MainStatus.PWM.Length) { return MainStatus.PWM[index]; } else { return 0; } } /// /// Bulk status record Axis Measured positions (Encoder or other sensing device) /// /// Axis Number /// value public double GetPosition(int index) { if (index < MainStatus.Position.Length) { return MainStatus.Position[index]; } else { return 0; } } /// /// Bulk status record Axis Commanded Destinations /// /// Axis Number /// value public double GetDestination(int index) { if (index < MainStatus.Destination.Length) { return MainStatus.Destination[index]; } else { return 0; } } /// /// Bulk status record Axis First output channel specified /// /// Axis Number /// value public double GetOutputChannel0(int index) { if (index < MainStatus.OutputChan0.Length) { return MainStatus.OutputChan0[index]; } else { return 0; } } /// /// Bulk status record feedback selected 4-bit input mode /// /// Axis Number /// value public int GetInputMode(int axischannel) { int channel = FourBitAxisIndex(axischannel); if (axischannel > 11) { return GetValue(MainStatus.InputModes4, channel, 4); } else if (axischannel > 7) { return GetValue(MainStatus.InputModes3, channel, 4); } else if (axischannel > 3) { return GetValue(MainStatus.InputModes2, channel, 4); } else { return GetValue(MainStatus.InputModes, channel, 4); } } /// /// Bulk status record 4-bit output mode /// /// Axis Number /// value public int GetOutputMode(int axischannel) { int channel = FourBitAxisIndex(axischannel); if (axischannel > 11) { return GetValue(MainStatus.OutputModes4, channel, 4); } else if (axischannel > 7) { return GetValue(MainStatus.OutputModes3, channel, 4); } else if (axischannel > 3) { return GetValue(MainStatus.OutputModes2, channel, 4); } else { return GetValue(MainStatus.OutputModes, channel, 4); } } /// /// Bulk status record Current axis enables /// /// Axis Number /// value public int GetAxisEnabled(int axischannel) { return GetValue(MainStatus.Enables, axischannel, 1); } /// /// Bulk status record Current axis completes /// /// Axis Number /// value public int GetAxisComplete(int axischannel) { return GetValue(MainStatus.AxisDone, axischannel, 1); } /// /// Bulk status record Current KFLOP/Kogna 64 IO Bit directions (inputs vs outputs) /// /// IO Bit Number /// value 0=input 1=output public int GetKFlopBitDirection(int index) { if (index > 31) { return GetValue(MainStatus.BitsDirection[1], index - 31, 1); } else { return GetValue(MainStatus.BitsDirection[0], index, 1); } } /// /// Bulk status record Current Kogna 24 IO Bit directions for Bits 200-223(inputs vs outputs) /// /// IO Bit Number /// value 0=input 1=output public int GetBitDirection200(int index) { return GetValue(MainStatus.BitsDirection200, index, 1); } /// /// Bulk status record Current Kogna 10 IO Bit directions for Bits 280-289(inputs vs outputs) /// /// IO Bit Number /// value 0=input 1=output public int GetBitDirection280(int index) { return GetValue(MainStatus.BitsDirection280, index, 1); } /// /// Bulk status record Current KFLOP/Kogna 64 IO Bit states /// /// IO Bit Number /// value public int GetKFlopBitState(int index) { if (index > 31) { return GetValue(MainStatus.BitsState[1], index - 32, 1); } else { return GetValue(MainStatus.BitsState[0], index, 1); } } /// /// Bulk status record Current Kogna 90 IO Bit states (Bits 200-289) /// /// IO Bit Number /// value public int GetBitState200(int index) { return GetValue(MainStatus.BitsState200[(index - 200) >> 5], (index - 200) & 31, 1); } /// /// Bulk status record Current Kogna 10 Pin function modes 2 bits per pin 4 HRPWM + 6 SPI /// /// device selector 0-9 (0-3 HRPWM, 4-9 SPI) /// value public int GetPinMuxModes(int index) { return GetValue(MainStatus.PinMuxModes, index * 2, 2); } /// /// Bulk status record Current Kogna ADC /// /// channel 0-3 /// value public int GetKognaADC(0) { return Kogna_ADC[0]; } /// /// Bulk status record Current Kogna DAC /// /// channel 0-7 /// value public int GetKognaDAC(int index) { return Kogna_DAC[index]; } /// /// Bulk status record Current Kogna 8-bit PWM pulse setting /// /// channel 0-7 /// value public int GetKognaPWM(int index) { return Kogna_PWM[index]; } /// /// Bulk status record Current Kogna 8-bit PWM Enables /// /// channel 0-7 /// value public int GetKognaPWMEnables(int index) { return Kogna_PWM_Enables[index]; } /// /// Bulk status record Current Kogna Hi-Res 12-bit PWM pulse setting /// /// channel 0-3 /// value public int GetKognaHRPWM(int index) { return HRPWM[index]; } /// /// Bulk status record Current SnapAmp #0 IO Bit directions (inputs vs outputs) /// /// IO Bit Number /// value public int GetSnapBitsDirection0(int index) { return GetValue(MainStatus.SnapBitsDirection0, index, 1); } /// /// Bulk status record Current SnapAmp #1 IO Bit directions (inputs vs outputs) /// /// IO Bit Number /// value 0=input 1=output public int GetSnapBitsDirection1(int index) { return GetValue(MainStatus.SnapBitsDirection1, index, 1); } /// /// Bulk status record Current SnapAmp #0 IO Bit States /// /// IO Bit Number /// value public int GetSnapBitsState0(int index) { return GetValue(MainStatus.SnapBitsState0, index, 1); } /// /// Bulk status record Current SnapAmp #1 IO Bit States /// /// IO Bit Number /// value public int GetSnapBitsState1(int index) { return GetValue(MainStatus.SnapBitsState1, index, 1); } /// /// Bulk status record Current Kanalog Input Bit States /// /// IO Bit Number /// value public int GetKanalogBitsStateInputs(int index) { return GetValue(MainStatus.KanalogBitsStateInputs, index, 1); } /// /// Bulk status record Current Kanalog Output Bit States /// /// IO Bit Number /// value public int GetKanalogBitsStateOutputs(int index) { return GetValue(MainStatus.KanalogBitsStateOutputs, index, 1); } /// /// Bulk status record Current Boot Thread Startup Enables /// /// Thread Number /// value public int GetRunOnStartUp(int index) { return GetValue(MainStatus.RunOnStartUp, index, 1); } /// /// Bulk status record Current Thread Execution State /// /// Thread Number /// value public int GetThreadActive(int index) { return GetValue(MainStatus.ThreadActive, index, 1); } /// /// Bulk status record Current PC-KFLOP Comm regs /// /// Comm Register Index /// value public int GetPC_comm(int index) { if (PC_comm.Length > index) { return PC_comm[index]; } else { return 0; } } /// /// Bulk status record Current Virtual Bit States /// /// Bit Offset /// value public int GetVirtualBits(int index) { return GetValue((int)MainStatus.VirtualBits, index, 1); } /// /// Bulk status record Current Extended Virtual Bit States /// /// Bit Offset 0-31 where 0 returns Virtual bit 1024 /// value public int GetVirtualBitsEx0(int index) { return GetValue((int)MainStatus.VirtualBitsEx0, index, 1); } private int FourBitAxisIndex(int axischannel) { return (axischannel & 3) << 2; } private int GetValue(int source, int start, int length) { return ((source >> start) & length); } } }