@@ -2,10 +2,11 @@ package main
2
2
3
3
import (
4
4
"bytes"
5
+ "errors"
5
6
"fmt"
6
7
"io"
7
8
"log"
8
- "os "
9
+ "strings "
9
10
"sync"
10
11
"time"
11
12
@@ -17,7 +18,7 @@ type TimelapseCamera struct {
17
18
CurrentTicker * time.Ticker
18
19
Mutex sync.Mutex
19
20
RequestsChannel chan <- * CameraSettings
20
- ResponsesChannel <- chan * bytes. Reader
21
+ ResponsesChannel <- chan ImageResult
21
22
}
22
23
23
24
func (tt * TimelapseCamera ) StartTimelapse (t * TimelapseSettings ) {
@@ -50,9 +51,14 @@ func (tt *TimelapseCamera) StartTimelapse(t *TimelapseSettings) {
50
51
51
52
}
52
53
53
- func (c * TimelapseCamera ) CameraServer () (requests chan <- * CameraSettings , responses <- chan * bytes.Reader ) {
54
+ type ImageResult struct {
55
+ Reader * bytes.Reader
56
+ Error error
57
+ }
58
+
59
+ func (c * TimelapseCamera ) CameraServer () (requests chan <- * CameraSettings , responses <- chan ImageResult ) {
54
60
reqs := make (chan * CameraSettings , 1 )
55
- ress := make (chan * bytes. Reader , 1 )
61
+ ress := make (chan ImageResult , 1 )
56
62
57
63
go func () {
58
64
for cameraSettings := range reqs {
@@ -70,32 +76,52 @@ func (c *TimelapseCamera) CameraServer() (requests chan<- *CameraSettings, respo
70
76
s .Encoding = raspicam .EncodingPNG
71
77
72
78
errCh := make (chan error )
79
+
80
+ wasError := false
81
+ var imageResultError strings.Builder
73
82
go func () {
74
83
for x := range errCh {
75
- fmt .Fprintf (os .Stderr , "%v\n " , x )
84
+ wasError = true
85
+ imageResultError .WriteString (x .Error ())
86
+ imageResultError .WriteRune ('\n' )
76
87
}
77
88
}()
78
89
79
90
var b * bytes.Buffer = & bytes.Buffer {}
80
91
log .Println ("Capturing image" )
81
92
raspicam .Capture (s , b , errCh )
82
93
log .Println ("Returning image" )
83
- ress <- bytes .NewReader (b .Bytes ())
94
+
95
+ if wasError {
96
+ ress <- ImageResult {
97
+ Error : errors .New (imageResultError .String ()),
98
+ }
99
+ } else {
100
+ ress <- ImageResult {
101
+ Reader : bytes .NewReader (b .Bytes ()),
102
+ }
103
+ }
84
104
}
85
105
}()
86
106
87
107
return reqs , ress
88
108
}
89
109
90
- func (c * TimelapseCamera ) CaptureImage (cameraSettings * CameraSettings , w io.Writer ) {
110
+ func (c * TimelapseCamera ) CaptureImage (cameraSettings * CameraSettings , w io.Writer ) error {
91
111
92
112
log .Println ("Requesting image" )
93
113
c .RequestsChannel <- cameraSettings
94
- reader := <- c .ResponsesChannel
114
+ result := <- c .ResponsesChannel
115
+
116
+ if result .Error != nil {
117
+ return fmt .Errorf ("error getting image: %w" , result .Error )
118
+ }
119
+
95
120
log .Println ("Receiving image" )
96
- _ , err := io .Copy (w , reader )
121
+ _ , err := io .Copy (w , result . Reader )
97
122
if err != nil {
98
- log . Printf ( "Error copying %s " , err . Error () )
123
+ return fmt . Errorf ( "error copying: %w " , err )
99
124
}
100
125
126
+ return nil
101
127
}
0 commit comments