Skip to content

Commit 21ee2d5

Browse files
committed
onewire: check for presence & more debug strings
- halt methods when reset() does not result in PRESENCE pulse clear up naming, separate reset() and presence() check - port search, writes and requests are logged - wire reset is logged
1 parent 0927423 commit 21ee2d5

File tree

2 files changed

+116
-41
lines changed

2 files changed

+116
-41
lines changed

code/espurna/driver_onewire.cpp

+106-40
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,84 @@ Copyright (C) 2019-2024 by Maxim Prokhorov <prokhorov dot max at outlook dot com
2626
namespace espurna {
2727
namespace driver {
2828
namespace onewire {
29+
30+
StringView error(Error error) {
31+
StringView out;
32+
33+
switch (error) {
34+
case Error::Ok:
35+
out = STRING_VIEW("OK");
36+
break;
37+
38+
case Error::NotFound:
39+
out = STRING_VIEW("Not found");
40+
break;
41+
42+
case Error::Unresponsive:
43+
out = STRING_VIEW("Device does not respond");
44+
break;
45+
46+
case Error::GpioUsed:
47+
out = STRING_VIEW("GPIO Already Used");
48+
break;
49+
50+
case Error::Config:
51+
out = STRING_VIEW("Invalid Configuration");
52+
break;
53+
54+
}
55+
56+
return out;
57+
}
58+
59+
StringView reset_result(ResetResult result) {
60+
StringView out;
61+
62+
switch (result) {
63+
case ResetResult::Unknown:
64+
out = STRING_VIEW("Unknown");
65+
break;
66+
67+
case ResetResult::Busy:
68+
out = STRING_VIEW("Busy");
69+
break;
70+
71+
case ResetResult::Presence:
72+
out = STRING_VIEW("Presence");
73+
break;
74+
}
75+
76+
return out;
77+
}
78+
2979
namespace internal {
3080
namespace {
3181

3282
bool debug { false };
3383
std::vector<PortPtr> references;
3484

35-
bool reset(OneWire* wire) {
36-
return wire->reset() != 0;
85+
ResetResult reset(OneWire* wire) {
86+
auto out = ResetResult::Unknown;
87+
88+
switch (wire->reset()) {
89+
case 0:
90+
out = ResetResult::Busy;
91+
break;
92+
93+
case 1:
94+
out = ResetResult::Presence;
95+
break;
96+
}
97+
98+
#if DEBUG_SUPPORT
99+
if (debug) {
100+
const auto ret = reset_result(out);
101+
DEBUG_MSG_P(PSTR("[W1] Reset (%.*s)\n"),
102+
ret.length(), ret.data());
103+
}
104+
#endif
105+
106+
return out;
37107
}
38108

39109
void skip(OneWire* wire) {
@@ -222,6 +292,11 @@ Error Port::attach(unsigned char pin, bool parasite) {
222292
auto wire = std::make_unique<OneWire>(pin);
223293

224294
auto devices = search(*wire, pin);
295+
if (internal::debug) {
296+
DEBUG_MSG_P(PSTR("[W1] Found %zu device(s) on GPIO%zu\n"),
297+
devices.size(), pin);
298+
}
299+
225300
if (!devices.size()) {
226301
gpioUnlock(pin);
227302
return Error::NotFound;
@@ -291,12 +366,23 @@ Port::Devices Port::search(OneWire& wire, unsigned char pin) {
291366
return out;
292367
}
293368

294-
bool Port::reset() {
295-
return _wire->reset() == 0;
369+
ResetResult Port::reset() const {
370+
return internal::reset(_wire.get());
371+
}
372+
373+
bool Port::presence() const {
374+
return reset() == ResetResult::Presence;
296375
}
297376

298377
void Port::write(Address address, Span<const uint8_t> data) {
299-
internal::reset(_wire.get());
378+
if (!presence()) {
379+
if (internal::debug) {
380+
DEBUG_MSG_P(PSTR("[W1] Write to %s failed\n"),
381+
hexEncode(address).c_str());
382+
}
383+
return;
384+
}
385+
300386
internal::select(_wire.get(), address);
301387
internal::write_bytes(_wire.get(), data, parasite());
302388
}
@@ -311,60 +397,40 @@ void Port::write(Address address, uint8_t value) {
311397
}
312398

313399
void Port::write(uint8_t value) {
314-
internal::reset(_wire.get());
400+
if (!presence()) {
401+
if (internal::debug) {
402+
DEBUG_MSG_P(PSTR("[W1] Write failed\n"));
403+
}
404+
return;
405+
}
406+
315407
internal::skip(_wire.get());
316408

317409
const std::array<uint8_t, 1> data{{ value }};
318410
internal::write_bytes(_wire.get(), make_span(data), parasite());
319411
}
320412

321413
bool Port::request(Address address, Span<const uint8_t> input, Span<uint8_t> output) {
322-
//if (!//
323-
// return false;
324-
//}
325-
internal::reset(_wire.get());
414+
if (!presence()) {
415+
if (internal::debug) {
416+
DEBUG_MSG_P(PSTR("[W1] Request to %s failed\n"),
417+
hexEncode(address).c_str());
418+
}
419+
return false;
420+
}
326421

327422
internal::select(_wire.get(), address);
328423
internal::write_bytes(_wire.get(), input);
329424
internal::read_bytes(_wire.get(), output);
330425

331-
return internal::reset(_wire.get());
426+
return presence();
332427
}
333428

334429
bool Port::request(Address address, uint8_t value, Span<uint8_t> output) {
335430
const std::array<uint8_t, 1> input{ value };
336431
return request(address, make_span(input), output);
337432
}
338433

339-
StringView error(Error error) {
340-
StringView out;
341-
342-
switch (error) {
343-
case Error::Ok:
344-
out = STRING_VIEW("OK");
345-
break;
346-
347-
case Error::NotFound:
348-
out = STRING_VIEW("Not found");
349-
break;
350-
351-
case Error::Unresponsive:
352-
out = STRING_VIEW("Device does not respond");
353-
break;
354-
355-
case Error::GpioUsed:
356-
out = STRING_VIEW("GPIO Already Used");
357-
break;
358-
359-
case Error::Config:
360-
out = STRING_VIEW("Invalid Configuration");
361-
break;
362-
363-
}
364-
365-
return out;
366-
}
367-
368434
void setup() {
369435
#if DEBUG_SUPPORT
370436
debug::setup();

code/espurna/driver_onewire.h

+10-1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,12 @@ enum class Error {
4242
NotFound,
4343
};
4444

45+
enum class ResetResult {
46+
Unknown,
47+
Busy, // no devices on the bus / bus is shortened
48+
Presence, // PRESENCE pulse was sent
49+
};
50+
4551
class Port {
4652
public:
4753
using Address = std::array<uint8_t, 8>;
@@ -63,7 +69,8 @@ class Port {
6369
Error attach(unsigned char pin, bool parasite);
6470
void detach();
6571

66-
bool reset();
72+
ResetResult reset() const;
73+
bool presence() const;
6774

6875
void write(Address address, Span<const uint8_t>);
6976
void write(Address, const uint8_t*, size_t);
@@ -127,6 +134,8 @@ void dereference(PortPtr);
127134
void reference(PortPtr);
128135

129136
StringView error(Error);
137+
StringView reset_result(ResetResult);
138+
130139
void setup();
131140

132141
} // namesapce onewire

0 commit comments

Comments
 (0)