Files
IoTManager/include/Bus/BusScanner.h
Yuri Trikoz d0c6d34f4a BusScanner
2020-06-25 17:57:17 +03:00

74 lines
1.6 KiB
C++

#pragma once
#include <Arduino.h>
enum BusScanner_t {
BS_I2C,
BS_ONE_WIRE
};
class BusScanner {
public:
BusScanner(String& result, size_t tries) : _tries{tries}, _result{&result} {}
void addResult(uint8_t addr, boolean last = true) {
_result->concat("0x");
if (addr < 16) {
_result->concat("0");
}
_result->concat(String(addr, HEX));
_result->concat(!last ? ", " : "");
};
void scan() {
if (!syncScan() && _tries--) {
syncScan();
}
}
virtual boolean syncScan();
private:
size_t _tries;
BusScanner_t _type;
String* _result;
};
class I2CScanner : public BusScanner {
public:
I2CScanner(String& result) : BusScanner(result, 2){};
virtual boolean syncScan() override;
};
class OneWireScanner : public BusScanner {
public:
OneWireScanner(String& result) : BusScanner(result, 1){};
virtual boolean syncScan() override;
};
class BusScannerFactory {
public:
static const char* label(BusScanner_t type) {
switch (type) {
case BS_I2C:
return "i2c";
case BS_ONE_WIRE:
return "onewire";
default:
return "";
}
}
static BusScanner* get(String& str, BusScanner_t type, size_t tries = 1) {
switch (type) {
case BS_I2C:
return new I2CScanner(str);
case BS_ONE_WIRE:
return new OneWireScanner(str);
default:
return nullptr;
}
}
};