Skip to content

Commit

Permalink
fix: Display all implemented sensors in SensorActivity #2584 (#2589)
Browse files Browse the repository at this point in the history
Co-authored-by: Anashuman Singh <[email protected]>
Co-authored-by: Anashuman Singh <[email protected]>
  • Loading branch information
3 people authored Jan 9, 2025
1 parent 3d66bf5 commit 4e8938b
Showing 1 changed file with 40 additions and 31 deletions.
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));
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

0 comments on commit 4e8938b

Please sign in to comment.