Skip to content

Commit 0bd9b60

Browse files
committed
Add ContextWithCancel for better termination pending response
1 parent 558d686 commit 0bd9b60

File tree

4 files changed

+41
-50
lines changed

4 files changed

+41
-50
lines changed

dht.go

+19-7
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,14 @@ import "C"
66

77
import (
88
"bytes"
9+
"context"
10+
"errors"
911
"fmt"
1012
"reflect"
1113
"time"
1214
"unsafe"
15+
16+
"github.com/d2r2/go-shell/shell"
1317
)
1418

1519
type SensorType int
@@ -55,7 +59,7 @@ func dialDHTxxAndGetResponse(pin int, boostPerfFlag bool) ([]Pulse, error) {
5559
// Return array: [pulse, duration, pulse, duration, ...]
5660
r := C.dial_DHTxx_and_read(C.int32_t(pin), boost, &arr, &arrLen)
5761
if r == -1 {
58-
err := fmt.Errorf("Error during call C.dial_DHTxx_and_read()")
62+
err := errors.New("Error during call C.dial_DHTxx_and_read()")
5963
return nil, err
6064
}
6165
defer C.free(unsafe.Pointer(arr))
@@ -159,7 +163,7 @@ func decodeDHTxxPulses(sensorType SensorType, pulses []Pulse) (temperature float
159163
return -1, -1, err
160164
}
161165
// Debug output for 5 bytes
162-
log.Debugf("Five bytes from DHTxx: [%d, %d, %d, %d, %d]", b0, b1, b2, b3, sum)
166+
lg.Debugf("Five bytes from DHTxx: [%d, %d, %d, %d, %d]", b0, b1, b2, b3, sum)
163167
// Extract temprature and humidity depending on sensor type
164168
temperature, humidity = 0.0, 0.0
165169
if sensorType == DHT11 {
@@ -186,7 +190,7 @@ func printPulseArrayForDebug(pulses []Pulse) {
186190
buf.WriteString(fmt.Sprintf("pulse %3d: %v, %v\n", i,
187191
pulse.Value, pulse.Duration))
188192
}
189-
log.Debugf("Pulse count %d:\n%v", len(pulses), buf.String())
193+
lg.Debugf("Pulse count %d:\n%v", len(pulses), buf.String())
190194
}
191195

192196
// Send activation request to DHTxx sensor via specific pin.
@@ -238,17 +242,25 @@ func ReadDHTxx(sensorType SensorType, pin int,
238242
// 4) error if present.
239243
func ReadDHTxxWithRetry(sensorType SensorType, pin int, boostPerfFlag bool,
240244
retry int) (temperature float32, humidity float32, retried int, err error) {
245+
ctx, cancel := context.WithCancel(context.Background())
246+
shell.CloseContextOnKillSignal(cancel)
241247
retried = 0
242248
for {
243249
temp, hum, err := ReadDHTxx(sensorType, pin, boostPerfFlag)
244250
if err != nil {
245251
if retry > 0 {
246-
log.Warningf("%v", err)
252+
lg.Warning(err)
247253
retry--
248254
retried++
249-
// Sleep before new attempt
250-
time.Sleep(1500 * time.Millisecond)
251-
continue
255+
select {
256+
case <-ctx.Done():
257+
// Interrupt loop, if pending termination
258+
return -1, -1, retried, errors.New("Termination pending...")
259+
default:
260+
// Sleep before new attempt
261+
time.Sleep(1500 * time.Millisecond)
262+
continue
263+
}
252264
}
253265
return -1, -1, retried, err
254266
}

examples/example1.go

+9-5
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package main
22

33
import (
4-
"fmt"
5-
"log"
6-
74
"github.com/d2r2/go-dht"
5+
logger "github.com/d2r2/go-logger"
6+
)
7+
8+
var lg = logger.NewPackageLogger("main",
9+
logger.DebugLevel,
10+
// logger.InfoLevel,
811
)
912

1013
func main() {
@@ -13,15 +16,16 @@ func main() {
1316
// as Raspberry PI 1 (this will require root privileges). You can switch off
1417
// "boost GPIO performance" parameter for old devices, but it may increase
1518
// retry attempts. Play with this parameter.
19+
defer logger.FinalizeLogger()
1620
sensorType := dht.DHT22
1721
for {
1822
temperature, humidity, retried, err :=
1923
dht.ReadDHTxxWithRetry(sensorType, 4, false, 10)
2024
if err != nil {
21-
log.Fatal(err)
25+
lg.Fatal(err)
2226
}
2327
// print temperature and humidity
24-
fmt.Printf("Sensor = %v: Temperature = %v*C, Humidity = %v%% (retried %d times)\n",
28+
lg.Infof("Sensor = %v: Temperature = %v*C, Humidity = %v%% (retried %d times)",
2529
sensorType, temperature, humidity, retried)
2630
}
2731
}

examples/example2.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@ import (
88
"time"
99

1010
"github.com/d2r2/go-dht"
11+
logger "github.com/d2r2/go-logger"
12+
)
13+
14+
var lg = logger.NewPackageLogger("main",
15+
logger.DebugLevel,
16+
// logger.InfoLevel,
1117
)
1218

1319
var (
@@ -38,7 +44,7 @@ func main() {
3844
temperature, humidity, retried, err :=
3945
dht.ReadDHTxxWithRetry(sensorType, pin, boostPerfFlag, 10)
4046
if err != nil {
41-
panic(err)
47+
lg.Fatal(err)
4248
}
4349

4450
//fmt.Printf("Sensor = %v: Temperature = %v*C, Humidity = %v%% (retried %d times)\n",

logger.go

+6-37
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,10 @@
11
package dht
22

3-
import (
4-
"os"
3+
import logger "github.com/d2r2/go-logger"
54

6-
"github.com/op/go-logging"
5+
// You can manage verbosity of log output
6+
// in the package by changing last parameter value.
7+
var lg = logger.NewPackageLogger("dht",
8+
logger.DebugLevel,
9+
// logger.InfoLevel,
710
)
8-
9-
// Comment INFO and uncomment DEBUG if you want detail debug output in library.
10-
var log *logging.Logger = buildLogger("dht",
11-
// logging.DEBUG,
12-
logging.INFO,
13-
)
14-
15-
var terminalBackend logging.LeveledBackend = nil
16-
17-
func buildLogger(module string, level logging.Level) *logging.Logger {
18-
// Set the backends to be used.
19-
if terminalBackend == nil {
20-
// Everything except the message has a custom color
21-
// which is dependent on the log level. Many fields have a custom output
22-
// formatting too, eg. the time returns the hour down to the milli second.
23-
var format = logging.MustStringFormatter(
24-
"%{time:2006-01-02T15:04:05.000} [%{module}] " +
25-
"%{color}%{level:.4s}%{color:reset} %{message}",
26-
)
27-
// Create backend for os.Stderr.
28-
var backend logging.Backend = logging.NewLogBackend(os.Stderr, "", 0)
29-
30-
// For messages written to backend we want to add some additional
31-
// information to the output, including the used log level and the name of
32-
// the function.
33-
var backendFormatter logging.Backend = logging.NewBackendFormatter(backend, format)
34-
var backendLeveled logging.LeveledBackend = logging.AddModuleLevel(backendFormatter)
35-
terminalBackend = backendLeveled
36-
logging.SetBackend(terminalBackend)
37-
}
38-
log := logging.MustGetLogger(module)
39-
terminalBackend.SetLevel(level, module)
40-
return log
41-
}

0 commit comments

Comments
 (0)