@@ -6,6 +6,11 @@ import (
6
6
giDevice "github.com/electricbubble/gidevice"
7
7
)
8
8
9
+ const (
10
+ defaultPort = 8100
11
+ defaultMjpegPort = 9100
12
+ )
13
+
9
14
type Device struct {
10
15
deviceID int
11
16
serialNumber string
@@ -15,6 +20,61 @@ type Device struct {
15
20
d giDevice.Device
16
21
}
17
22
23
+ type DeviceOption func (d * Device )
24
+
25
+ func WithSerialNumber (serialNumber string ) DeviceOption {
26
+ return func (d * Device ) {
27
+ d .serialNumber = serialNumber
28
+ }
29
+ }
30
+
31
+ func WithPort (port int ) DeviceOption {
32
+ return func (d * Device ) {
33
+ d .Port = port
34
+ }
35
+ }
36
+
37
+ func WithMjpegPort (port int ) DeviceOption {
38
+ return func (d * Device ) {
39
+ d .MjpegPort = port
40
+ }
41
+ }
42
+
43
+ func NewDevice (options ... DeviceOption ) (device * Device , err error ) {
44
+ var usbmux giDevice.Usbmux
45
+ if usbmux , err = giDevice .NewUsbmux (); err != nil {
46
+ return nil , fmt .Errorf ("init usbmux failed: %v" , err )
47
+ }
48
+
49
+ var deviceList []giDevice.Device
50
+ if deviceList , err = usbmux .Devices (); err != nil {
51
+ return nil , fmt .Errorf ("get attached devices failed: %v" , err )
52
+ }
53
+
54
+ device = & Device {
55
+ Port : defaultPort ,
56
+ MjpegPort : defaultMjpegPort ,
57
+ }
58
+ for _ , option := range options {
59
+ option (device )
60
+ }
61
+
62
+ serialNumber := device .serialNumber
63
+ for _ , d := range deviceList {
64
+ // find device by serial number if specified
65
+ if serialNumber != "" && d .Properties ().SerialNumber != serialNumber {
66
+ continue
67
+ }
68
+
69
+ device .deviceID = d .Properties ().DeviceID
70
+ device .serialNumber = d .Properties ().SerialNumber
71
+ device .d = d
72
+ return device , nil
73
+ }
74
+
75
+ return nil , fmt .Errorf ("device %s not found" , device .serialNumber )
76
+ }
77
+
18
78
func DeviceList () (devices []Device , err error ) {
19
79
var usbmux giDevice.Usbmux
20
80
if usbmux , err = giDevice .NewUsbmux (); err != nil {
@@ -31,8 +91,8 @@ func DeviceList() (devices []Device, err error) {
31
91
for i := range devices {
32
92
devices [i ].deviceID = deviceList [i ].Properties ().DeviceID
33
93
devices [i ].serialNumber = deviceList [i ].Properties ().SerialNumber
34
- devices [i ].Port = 8100
35
- devices [i ].MjpegPort = 9100
94
+ devices [i ].Port = defaultPort
95
+ devices [i ].MjpegPort = defaultMjpegPort
36
96
devices [i ].d = deviceList [i ]
37
97
}
38
98
0 commit comments