Pad the configuration struct to 250 bytes, so the SDK.DLL ABI doesn't change when fields are added.
This commit is contained in:
parent
6e09b2ea53
commit
7a4bbc6eab
@ -215,8 +215,14 @@ struct SMXConfig
|
|||||||
uint8_t panelThreshold5Low, panelThreshold5High;
|
uint8_t panelThreshold5Low, panelThreshold5High;
|
||||||
uint8_t panelThreshold6Low, panelThreshold6High;
|
uint8_t panelThreshold6Low, panelThreshold6High;
|
||||||
uint8_t panelThreshold8Low, panelThreshold8High;
|
uint8_t panelThreshold8Low, panelThreshold8High;
|
||||||
|
|
||||||
|
// Pad the struct to 250 bytes. This keeps this struct size from changing
|
||||||
|
// as we add fields, so the ABI doesn't change. Applications should leave
|
||||||
|
// any data in here unchanged when calling SMX_SetConfig.
|
||||||
|
uint8_t padding[166];
|
||||||
};
|
};
|
||||||
static_assert(sizeof(SMXConfig) == 84, "Expected 84 bytes");
|
static_assert(offsetof(SMXConfig, padding) == 84, "Expected 84 bytes"); // includes one padding byte
|
||||||
|
static_assert(sizeof(SMXConfig) == 250, "Expected 250 bytes");
|
||||||
|
|
||||||
// The values (except for Off) correspond with the protocol and must not be changed.
|
// The values (except for Off) correspond with the protocol and must not be changed.
|
||||||
enum SensorTestMode {
|
enum SensorTestMode {
|
||||||
|
@ -60,6 +60,10 @@ namespace SMX
|
|||||||
public Byte panelThreshold6Low, panelThreshold6High;
|
public Byte panelThreshold6Low, panelThreshold6High;
|
||||||
public Byte panelThreshold8Low, panelThreshold8High;
|
public Byte panelThreshold8Low, panelThreshold8High;
|
||||||
|
|
||||||
|
// Pad this struct to exactly 250 bytes.
|
||||||
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 166)]
|
||||||
|
public Byte[] padding;
|
||||||
|
|
||||||
// enabledSensors is a mask of which panels are enabled. Return this as an array
|
// enabledSensors is a mask of which panels are enabled. Return this as an array
|
||||||
// for convenience.
|
// for convenience.
|
||||||
public bool[] GetEnabledPanels()
|
public bool[] GetEnabledPanels()
|
||||||
@ -291,6 +295,15 @@ namespace SMX
|
|||||||
{
|
{
|
||||||
if(!DLLAvailable()) return;
|
if(!DLLAvailable()) return;
|
||||||
|
|
||||||
|
// Sanity check SMXConfig, which should be 250 bytes. If this is incorrect,
|
||||||
|
// check the padding array.
|
||||||
|
{
|
||||||
|
SMXConfig config = new SMXConfig();
|
||||||
|
int bytes = Marshal.SizeOf(config);
|
||||||
|
if(bytes != 250)
|
||||||
|
throw new Exception("SMXConfig is " + bytes + " bytes, but should be 250 bytes");
|
||||||
|
}
|
||||||
|
|
||||||
// Make a wrapper to convert from the native enum to SMXUpdateCallbackReason.
|
// Make a wrapper to convert from the native enum to SMXUpdateCallbackReason.
|
||||||
InternalUpdateCallback NewCallback = delegate(int PadNumber, int reason, IntPtr user) {
|
InternalUpdateCallback NewCallback = delegate(int PadNumber, int reason, IntPtr user) {
|
||||||
SMXUpdateCallbackReason ReasonEnum = (SMXUpdateCallbackReason) Enum.ToObject(typeof(SMXUpdateCallbackReason), reason);
|
SMXUpdateCallbackReason ReasonEnum = (SMXUpdateCallbackReason) Enum.ToObject(typeof(SMXUpdateCallbackReason), reason);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user