1
1
package main
2
2
3
3
import (
4
+ "bytes"
4
5
"fmt"
5
6
"io"
6
7
"log"
@@ -12,13 +13,19 @@ import (
12
13
)
13
14
14
15
type TimelapseCamera struct {
15
- Store * TimelapseStore
16
- CurrentTicker * time.Ticker
17
- Mutex sync.Mutex
16
+ Store * TimelapseStore
17
+ CurrentTicker * time.Ticker
18
+ Mutex sync.Mutex
19
+ RequestsChannel chan <- * CameraSettings
20
+ ResponsesChannel <- chan * bytes.Reader
18
21
}
19
22
20
23
func (tt * TimelapseCamera ) StartTimelapse (t * TimelapseSettings ) {
21
24
25
+ reqs , res := tt .CameraServer ()
26
+ tt .RequestsChannel = reqs
27
+ tt .ResponsesChannel = res
28
+
22
29
if tt .CurrentTicker != nil {
23
30
tt .CurrentTicker .Stop ()
24
31
tt .CurrentTicker = nil
@@ -43,33 +50,52 @@ func (tt *TimelapseCamera) StartTimelapse(t *TimelapseSettings) {
43
50
44
51
}
45
52
46
- func (c * TimelapseCamera ) CaptureImage (cameraSettings * CameraSettings , w io.Writer ) {
47
- log .Printf ("Camera settings for capture: %+v" , cameraSettings )
48
- s := raspicam .NewStill ()
49
- s .Camera .VFlip = cameraSettings .VFlip
50
- s .Camera .HFlip = cameraSettings .HFlip
51
- s .Camera .Rotation = cameraSettings .Rotation
52
- s .Camera .MeteringMode = raspicam .MeteringAverage
53
- s .Camera .AWBMode = raspicam .AWBOff
54
- s .Camera .ISO = 200
55
- s .Args = []string {"--flicker" , "50hz" , "-awbg" , "1.7,1.9" , "--drc" , "high" }
56
- s .Width = cameraSettings .Width
57
- s .Height = cameraSettings .Height
58
- s .Encoding = raspicam .EncodingPNG
59
- s .Timeout = time .Duration (1 ) * time .Minute
60
-
61
- errCh := make (chan error )
53
+ func (c * TimelapseCamera ) CameraServer () (requests chan <- * CameraSettings , responses <- chan * bytes.Reader ) {
54
+ reqs := make (chan * CameraSettings , 1 )
55
+ ress := make (chan * bytes.Reader , 1 )
56
+
62
57
go func () {
63
- for x := range errCh {
64
- fmt .Fprintf (os .Stderr , "%v\n " , x )
58
+ for cameraSettings := range reqs {
59
+
60
+ s := raspicam .NewStill ()
61
+ s .Camera .VFlip = cameraSettings .VFlip
62
+ s .Camera .HFlip = cameraSettings .HFlip
63
+ s .Camera .Rotation = cameraSettings .Rotation
64
+ s .Camera .MeteringMode = raspicam .MeteringAverage
65
+ s .Camera .AWBMode = raspicam .AWBOff
66
+ s .Camera .ISO = 200
67
+ s .Args = []string {"--flicker" , "50hz" , "-awbg" , "1.7,1.9" , "--drc" , "high" }
68
+ s .Width = cameraSettings .Width
69
+ s .Height = cameraSettings .Height
70
+ s .Encoding = raspicam .EncodingPNG
71
+
72
+ errCh := make (chan error )
73
+ go func () {
74
+ for x := range errCh {
75
+ fmt .Fprintf (os .Stderr , "%v\n " , x )
76
+ }
77
+ }()
78
+
79
+ var b * bytes.Buffer = & bytes.Buffer {}
80
+ log .Println ("Capturing image" )
81
+ raspicam .Capture (s , b , errCh )
82
+ log .Println ("Returning image" )
83
+ ress <- bytes .NewReader (b .Bytes ())
65
84
}
66
85
}()
67
- c .Mutex .Lock ()
68
- log .Println ("Reserved camera - taking photo" )
69
- defer func () {
70
- c .Mutex .Unlock ()
71
- log .Println ("Freed camera" )
72
- }()
73
- raspicam .Capture (s , w , errCh )
74
- log .Println ("Finished taking photo" )
86
+
87
+ return reqs , ress
88
+ }
89
+
90
+ func (c * TimelapseCamera ) CaptureImage (cameraSettings * CameraSettings , w io.Writer ) {
91
+
92
+ log .Println ("Requesting image" )
93
+ c .RequestsChannel <- cameraSettings
94
+ reader := <- c .ResponsesChannel
95
+ log .Println ("Receiving image" )
96
+ _ , err := io .Copy (w , reader )
97
+ if err != nil {
98
+ log .Printf ("Error copying %s" , err .Error ())
99
+ }
100
+
75
101
}
0 commit comments