Show a warning if an incorrect sensor DIP switch is detected.

master
Glenn Maynard 6 years ago
parent 6d0820f495
commit 6d370ee092
  1. 3
      sdk/SMX.h
  2. 12
      sdk/Windows/SMXDevice.cpp
  3. 14
      smx-config/DiagnosticsWidgets.cs
  4. 19
      smx-config/MainWindow.xaml
  5. 19
      smx-config/SMX.cs

@ -286,6 +286,9 @@ struct SMXSensorTestModeData
// The DIP switch settings on each panel. This is used for diagnostics displays. // The DIP switch settings on each panel. This is used for diagnostics displays.
int iDIPSwitchPerPanel[9]; int iDIPSwitchPerPanel[9];
// Bad sensor selection DIP indication for each panel.
bool iBadSensorDIP[9][4];
}; };
#endif #endif

@ -486,7 +486,10 @@ void SMX::SMXDevice::HandleSensorTestDataResponse(const string &sReadBuffer)
int16_t sensors[4]; int16_t sensors[4];
uint8_t dip:4; uint8_t dip:4;
uint8_t dummy2:4; uint8_t bad_sensor_dip_0:1;
uint8_t bad_sensor_dip_1:1;
uint8_t bad_sensor_dip_2:1;
uint8_t bad_sensor_dip_3:1;
}; };
#pragma pack(pop) #pragma pack(pop)
@ -496,7 +499,8 @@ void SMX::SMXDevice::HandleSensorTestDataResponse(const string &sReadBuffer)
memset(output.sensorLevel, 0, sizeof(output.sensorLevel)); memset(output.sensorLevel, 0, sizeof(output.sensorLevel));
memset(output.bBadSensorInput, 0, sizeof(output.bBadSensorInput)); memset(output.bBadSensorInput, 0, sizeof(output.bBadSensorInput));
memset(output.iDIPSwitchPerPanel, 0, sizeof(output.iDIPSwitchPerPanel)); memset(output.iDIPSwitchPerPanel, 0, sizeof(output.iDIPSwitchPerPanel));
memset(output.iBadSensorDIP, 0, sizeof(output.iBadSensorDIP));
for(int iPanel = 0; iPanel < 9; ++iPanel) for(int iPanel = 0; iPanel < 9; ++iPanel)
{ {
// Decode the response from this panel. // Decode the response from this panel.
@ -519,6 +523,10 @@ void SMX::SMXDevice::HandleSensorTestDataResponse(const string &sReadBuffer)
output.bBadSensorInput[iPanel][2] = pad_data.bad_sensor_2; output.bBadSensorInput[iPanel][2] = pad_data.bad_sensor_2;
output.bBadSensorInput[iPanel][3] = pad_data.bad_sensor_3; output.bBadSensorInput[iPanel][3] = pad_data.bad_sensor_3;
output.iDIPSwitchPerPanel[iPanel] = pad_data.dip; output.iDIPSwitchPerPanel[iPanel] = pad_data.dip;
output.iBadSensorDIP[iPanel][0] = pad_data.bad_sensor_dip_0;
output.iBadSensorDIP[iPanel][1] = pad_data.bad_sensor_dip_1;
output.iBadSensorDIP[iPanel][2] = pad_data.bad_sensor_dip_2;
output.iBadSensorDIP[iPanel][3] = pad_data.bad_sensor_dip_3;
for(int iSensor = 0; iSensor < 4; ++iSensor) for(int iSensor = 0; iSensor < 4; ++iSensor)
output.sensorLevel[iPanel][iSensor] = pad_data.sensors[iSensor]; output.sensorLevel[iPanel][iSensor] = pad_data.sensors[iSensor];

@ -54,7 +54,8 @@ namespace smx_config
Pressed = args.controller[SelectedPad].inputs[PanelIndex]; Pressed = args.controller[SelectedPad].inputs[PanelIndex];
Warning = !args.controller[SelectedPad].test_data.bHaveDataFromPanel[PanelIndex] || Warning = !args.controller[SelectedPad].test_data.bHaveDataFromPanel[PanelIndex] ||
args.controller[SelectedPad].test_data.AnySensorsOnPanelNotResponding(PanelIndex); args.controller[SelectedPad].test_data.AnySensorsOnPanelNotResponding(PanelIndex) ||
args.controller[SelectedPad].test_data.AnyBadDIPSwitchSettingsOnPanel(PanelIndex);
}); });
onConfigChange.RefreshOnInputChange = true; onConfigChange.RefreshOnInputChange = true;
@ -146,6 +147,7 @@ namespace smx_config
private FrameImage ExpectedDIP; private FrameImage ExpectedDIP;
private FrameworkElement NoResponseFromPanel; private FrameworkElement NoResponseFromPanel;
private FrameworkElement NoResponseFromSensors; private FrameworkElement NoResponseFromSensors;
private FrameworkElement BadSensorDIPSwitches;
private FrameworkElement P1Diagnostics, P2Diagnostics; private FrameworkElement P1Diagnostics, P2Diagnostics;
private FrameworkElement DIPLabelLeft, DIPLabelRight; private FrameworkElement DIPLabelLeft, DIPLabelRight;
@ -173,6 +175,7 @@ namespace smx_config
ExpectedDIP = Template.FindName("ExpectedDIP", this) as FrameImage; ExpectedDIP = Template.FindName("ExpectedDIP", this) as FrameImage;
NoResponseFromPanel = Template.FindName("NoResponseFromPanel", this) as FrameworkElement; NoResponseFromPanel = Template.FindName("NoResponseFromPanel", this) as FrameworkElement;
NoResponseFromSensors = Template.FindName("NoResponseFromSensors", this) as FrameworkElement; NoResponseFromSensors = Template.FindName("NoResponseFromSensors", this) as FrameworkElement;
BadSensorDIPSwitches = Template.FindName("BadSensorDIPSwitches", this) as FrameworkElement;
P1Diagnostics = Template.FindName("P1Diagnostics", this) as FrameworkElement; P1Diagnostics = Template.FindName("P1Diagnostics", this) as FrameworkElement;
P2Diagnostics = Template.FindName("P2Diagnostics", this) as FrameworkElement; P2Diagnostics = Template.FindName("P2Diagnostics", this) as FrameworkElement;
@ -250,11 +253,16 @@ namespace smx_config
ExpectedDIP.Frame = PanelIndex; ExpectedDIP.Frame = PanelIndex;
// Show or hide the sensor error text. // Show or hide the sensor error text.
bool AnySensorsNotResponding = false; bool AnySensorsNotResponding = false, HaveIncorrectSensorDIP = false;
if(args.controller[SelectedPad].test_data.bHaveDataFromPanel[PanelIndex]) if(args.controller[SelectedPad].test_data.bHaveDataFromPanel[PanelIndex])
{
AnySensorsNotResponding = args.controller[SelectedPad].test_data.AnySensorsOnPanelNotResponding(PanelIndex); AnySensorsNotResponding = args.controller[SelectedPad].test_data.AnySensorsOnPanelNotResponding(PanelIndex);
NoResponseFromSensors.Visibility = AnySensorsNotResponding? Visibility.Visible:Visibility.Collapsed;
// Don't show both warnings.
HaveIncorrectSensorDIP = !AnySensorsNotResponding && args.controller[SelectedPad].test_data.AnyBadDIPSwitchSettingsOnPanel(PanelIndex);
}
NoResponseFromSensors.Visibility = AnySensorsNotResponding? Visibility.Visible:Visibility.Collapsed;
BadSensorDIPSwitches.Visibility = HaveIncorrectSensorDIP? Visibility.Visible:Visibility.Collapsed;
// Adjust the DIP labels to match the PCB. // Adjust the DIP labels to match the PCB.
SMX.SMXConfig config = ActivePad.GetFirstActivePadConfig(args); SMX.SMXConfig config = ActivePad.GetFirstActivePadConfig(args);
bool DIPLabelsOnLeft = config.masterVersion < 4; bool DIPLabelsOnLeft = config.masterVersion < 4;

@ -591,6 +591,25 @@ Use if the platform is too sensitive.</clr:String>
Text="Some sensors on this panel aren't responding correctly." Text="Some sensors on this panel aren't responding correctly."
/> />
</DockPanel> </DockPanel>
<DockPanel
x:Name="BadSensorDIPSwitches"
Width="200"
>
<TextBlock
HorizontalAlignment="Stretch" VerticalAlignment="Center"
Foreground="#FFFF0000" FontSize="20"
FontFamily="{StaticResource WarningMarkFont}"
Text="!"
/>
<TextBlock
HorizontalAlignment="Center" VerticalAlignment="Center"
TextWrapping="Wrap" TextAlignment="Center"
Text="Some sensors on this panel have incorrect DIP switch selections."
/>
</DockPanel>
<StackPanel Orientation="Horizontal" <StackPanel Orientation="Horizontal"
HorizontalAlignment="Left" VerticalAlignment="Top" HorizontalAlignment="Left" VerticalAlignment="Top"
Margin="10,10,0,0" Margin="10,10,0,0"

@ -229,6 +229,9 @@ namespace SMX
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 9)] [MarshalAs(UnmanagedType.ByValArray, SizeConst = 9)]
public int[] iDIPSwitchPerPanel; public int[] iDIPSwitchPerPanel;
[MarshalAs(UnmanagedType.ByValArray, ArraySubType=UnmanagedType.I1, SizeConst = 9*4)]
public bool[] iBadSensorDIP;
public override bool Equals(object obj) public override bool Equals(object obj)
{ {
SMXSensorTestModeData other = (SMXSensorTestModeData) obj; SMXSensorTestModeData other = (SMXSensorTestModeData) obj;
@ -236,10 +239,11 @@ namespace SMX
Helpers.SequenceEqual(bHaveDataFromPanel, other.bHaveDataFromPanel) && Helpers.SequenceEqual(bHaveDataFromPanel, other.bHaveDataFromPanel) &&
Helpers.SequenceEqual(sensorLevel, other.sensorLevel) && Helpers.SequenceEqual(sensorLevel, other.sensorLevel) &&
Helpers.SequenceEqual(bBadSensorInput, other.bBadSensorInput) && Helpers.SequenceEqual(bBadSensorInput, other.bBadSensorInput) &&
Helpers.SequenceEqual(iDIPSwitchPerPanel, other.iDIPSwitchPerPanel); Helpers.SequenceEqual(iDIPSwitchPerPanel, other.iDIPSwitchPerPanel) &&
Helpers.SequenceEqual(iBadSensorDIP, other.iBadSensorDIP);
} }
// Dummy override to silence a bad warning. We don't use these in containers to need // Dummy override to silence a bad warning. We don't use these in containers that need
// a hash code implementation. // a hash code implementation.
public override int GetHashCode() { return base.GetHashCode(); } public override int GetHashCode() { return base.GetHashCode(); }
@ -254,6 +258,17 @@ namespace SMX
return false; return false;
} }
public bool AnyBadDIPSwitchSettingsOnPanel(int panel)
{
if(!bHaveDataFromPanel[panel])
return false;
for(int sensor = 0; sensor < 4; ++sensor)
if(iBadSensorDIP[panel*4+sensor])
return true;
return false;
}
}; };
public static class SMX public static class SMX

Loading…
Cancel
Save