@@ -26,14 +26,84 @@ Copyright (C) 2019-2024 by Maxim Prokhorov <prokhorov dot max at outlook dot com
26
26
namespace espurna {
27
27
namespace driver {
28
28
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
+
29
79
namespace internal {
30
80
namespace {
31
81
32
82
bool debug { false };
33
83
std::vector<PortPtr> references;
34
84
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;
37
107
}
38
108
39
109
void skip (OneWire* wire) {
@@ -222,6 +292,11 @@ Error Port::attach(unsigned char pin, bool parasite) {
222
292
auto wire = std::make_unique<OneWire>(pin);
223
293
224
294
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
+
225
300
if (!devices.size ()) {
226
301
gpioUnlock (pin);
227
302
return Error::NotFound;
@@ -291,12 +366,23 @@ Port::Devices Port::search(OneWire& wire, unsigned char pin) {
291
366
return out;
292
367
}
293
368
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;
296
375
}
297
376
298
377
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
+
300
386
internal::select (_wire.get (), address);
301
387
internal::write_bytes (_wire.get (), data, parasite ());
302
388
}
@@ -311,60 +397,40 @@ void Port::write(Address address, uint8_t value) {
311
397
}
312
398
313
399
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
+
315
407
internal::skip (_wire.get ());
316
408
317
409
const std::array<uint8_t , 1 > data{{ value }};
318
410
internal::write_bytes (_wire.get (), make_span (data), parasite ());
319
411
}
320
412
321
413
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
+ }
326
421
327
422
internal::select (_wire.get (), address);
328
423
internal::write_bytes (_wire.get (), input);
329
424
internal::read_bytes (_wire.get (), output);
330
425
331
- return internal::reset (_wire. get () );
426
+ return presence ( );
332
427
}
333
428
334
429
bool Port::request (Address address, uint8_t value, Span<uint8_t > output) {
335
430
const std::array<uint8_t , 1 > input{ value };
336
431
return request (address, make_span (input), output);
337
432
}
338
433
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
-
368
434
void setup () {
369
435
#if DEBUG_SUPPORT
370
436
debug::setup ();
0 commit comments