Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Display all implemented sensors in SensorActivity #2584 #2589

Merged
71 changes: 40 additions & 31 deletions app/src/main/java/io/pslab/activity/SensorActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public class SensorActivity extends GuideActivity {

private I2C i2c;
private ScienceLab scienceLab;
private final Map<Integer, String> sensorAddr = new LinkedHashMap<>();
private final Map<Integer, List<String>> sensorAddr = new LinkedHashMap<>();
private final List<String> dataAddress = new ArrayList<>();
private final List<String> dataName = new ArrayList<>();
private ArrayAdapter<String> adapter;
Expand All @@ -74,17 +74,17 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
}

i2c = scienceLab.i2c;
sensorAddr.put(0x48, "ADS1115");
sensorAddr.put(0x77, "BMP180");
sensorAddr.put(0x5A, "MLX90614");
sensorAddr.put(0x1E, "HMC5883L");
sensorAddr.put(0x68, "MPU6050");
sensorAddr.put(0x40, "SHT21");
sensorAddr.put(0x39, "TSL2561");
sensorAddr.put(0x69, "MPU925x");
sensorAddr.put(0x29, "VL53L0X");
sensorAddr.put(0x5A, "CCS811");
sensorAddr.put(0x39, "APDS9960");

// Populate sensor addresses with multiple sensors mapped to the same address
sensorAddr.put(0x48, List.of("ADS1115"));
sensorAddr.put(0x77, List.of("BMP180"));
sensorAddr.put(0x5A, List.of("MLX90614", "CCS811"));
sensorAddr.put(0x1E, List.of("HMC5883L"));
sensorAddr.put(0x68, List.of("MPU6050"));
sensorAddr.put(0x40, List.of("SHT21"));
sensorAddr.put(0x39, List.of("TSL2561", "APDS9960"));
sensorAddr.put(0x69, List.of("MPU925x"));
sensorAddr.put(0x29, List.of("VL53L0X"));

adapter = new ArrayAdapter<>(getApplication(), R.layout.sensor_list_item, R.id.tv_sensor_list_item, dataName);

Expand All @@ -99,6 +99,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
tvSensorScan.setText(getResources().getString(R.string.scanning));
new PopulateSensors().execute();
});

lvSensor.setOnItemClickListener((parent, view, position, id) -> {
String itemValue = (String) lvSensor.getItemAtPosition(position);
Intent intent;
Expand Down Expand Up @@ -155,52 +156,60 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
}

private class PopulateSensors extends AsyncTask<Void, Void, Void> {
private List<Integer> data;
private List<Integer> detectedSensors;

@Override
protected Void doInBackground(Void... voids) {
data = new ArrayList<>();
dataName.clear();
detectedSensors = new ArrayList<>();
dataAddress.clear();
dataName.clear();

if (scienceLab.isConnected()) {
try {
data = i2c.scan(null);
// Perform I2C scan to detect connected sensors
detectedSensors = i2c.scan(null);
} catch (IOException | NullPointerException e) {
e.printStackTrace();
}
}

return null;
}

@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);

StringBuilder tvData = new StringBuilder();
if (data != null) {
for (Integer myInt : data) {
if (myInt != null && sensorAddr.get(myInt) != null) {
dataAddress.add(String.valueOf(myInt));
StringBuilder scanResults = new StringBuilder();

// Populate the list with detected sensors
if (detectedSensors != null && scienceLab.isConnected()) {
for (Integer address : detectedSensors) {
if (address != null && sensorAddr.containsKey(address)) {
dataAddress.add(String.valueOf(address));
dataName.addAll(sensorAddr.get(address));
}
}

for (final String s : dataAddress) {
tvData.append(s).append(":").append(sensorAddr.get(Integer.parseInt(s))).append("\n");
// Build scan results for detected sensors
for (final String address : dataAddress) {
scanResults.append(address).append(": ").append(sensorAddr.get(Integer.parseInt(address))).append("\n");
}

} else {
tvData.append(getResources().getString(R.string.sensor_not_connected));
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't have to get this removed. tvData displayes the addresses of the connected devices.
Kindly rollback the changes from lines 186 to 192.

tvSensorScan.setText(scanResults);
}

for (int key : sensorAddr.keySet()) {
dataName.add(sensorAddr.get(key));
// Ensure the full list of sensors is displayed, even if not connected
for (List<String> sensors : sensorAddr.values()) {
if (!dataName.containsAll(sensors)) {
dataName.addAll(sensors);
}
}

if (scienceLab.isConnected()) {
tvSensorScan.setText(tvData);
} else {
// Update scan message if no sensors were detected
if (detectedSensors == null || detectedSensors.isEmpty()) {
tvSensorScan.setText(getString(R.string.not_connected));
}

adapter.notifyDataSetChanged();
buttonSensorAutoScan.setClickable(true);
}
Expand Down
Loading