Skip to content

Commit 4aa7935

Browse files
committed
Refactor TethrManager
1 parent 794715e commit 4aa7935

File tree

6 files changed

+214
-84
lines changed

6 files changed

+214
-84
lines changed

demo/src/App.vue

Lines changed: 49 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,24 @@
1414
</main>
1515

1616
<aside>
17-
<ul>
18-
<li v-for="(cam, i) in pairedCameras" :key="i">
19-
<button>{{ i }}</button>
20-
</li>
21-
</ul>
2217
<dl>
23-
<dt>Request</dt>
24-
<dt style="display: flex; gap: 1em">
18+
<dt>Connect to</dt>
19+
<dd class="connect-to">
2520
<button class="connect-button" @click="requestCameras('usbptp')">
2621
USB
2722
</button>
2823
<button class="connect-button" @click="requestCameras('webcam')">
2924
Webcam
3025
</button>
31-
</dt>
26+
</dd>
3227
</dl>
28+
<ul class="webcam-list">
29+
<li v-for="(cam, i) in pairedCameras" :key="i">
30+
<button @click="onClickCamera(cam)">
31+
[{{ cam.type }}] {{ cam.name }}
32+
</button>
33+
</li>
34+
</ul>
3335

3436
<template v-if="camera">
3537
<h2>Actions</h2>
@@ -46,7 +48,7 @@
4648
</template>
4749
<template v-if="configs.canRunAutoFocus.value">
4850
<dt>autoFocus</dt>
49-
<dd><button @click="runAutoFocus">Run</button></dd>
51+
<dd><button @click="camera.runAutoFocus">Run</button></dd>
5052
</template>
5153
<template v-if="configs.canRunManualFocus.value">
5254
<dt>manualFocus</dt>
@@ -112,7 +114,7 @@
112114
v-if="config.value !== null"
113115
:key="name"
114116
:label="name"
115-
:config="config as any"
117+
:config="config"
116118
/>
117119
</template>
118120
</dl>
@@ -123,7 +125,7 @@
123125

124126
<script lang="ts" setup>
125127
import {saveAs} from 'file-saver'
126-
import {TethrObject} from 'tethr'
128+
import {Tethr, TethrObject} from 'tethr'
127129
import {ref} from 'vue'
128130
129131
import TethrConfig from './TethrConfig.vue'
@@ -167,14 +169,35 @@ async function onSave(object: TethrObject) {
167169
const {
168170
pairedCameras,
169171
camera,
172+
openCamera,
173+
closeCamera,
170174
requestCameras,
171175
configs,
172176
liveviewMediaStream,
173177
photoURL,
174-
runAutoFocus,
175178
toggleLiveview,
176-
takePhoto,
177-
} = useTethr(onSave)
179+
} = useTethr()
180+
181+
async function takePhoto() {
182+
if (!camera.value) return
183+
const result = await camera.value.takePhoto()
184+
if (result.status === 'ok') {
185+
for (const object of result.value) {
186+
if (object.format !== 'raw') {
187+
photoURL.value = URL.createObjectURL(object.blob)
188+
}
189+
onSave(object)
190+
}
191+
}
192+
}
193+
194+
async function onClickCamera(cam: Tethr) {
195+
if (cam.opened) {
196+
closeCamera(cam)
197+
} else {
198+
openCamera(cam)
199+
}
200+
}
178201
</script>
179202

180203
<style lang="stylus" scoped>
@@ -220,6 +243,7 @@ dl
220243
&:deep(dt)
221244
height 2em
222245
line-height 2em
246+
white-space nowrap
223247
224248
&:deep(dd)
225249
display flex
@@ -231,4 +255,15 @@ dl
231255
display block
232256
width 100%
233257
text-align center
258+
259+
.connect-to
260+
display: flex
261+
gap: 1em
262+
margin-bottom 1em
263+
264+
.webcam-list
265+
grid-column: 1 / span 2
266+
267+
button
268+
width 100%
234269
</style>

demo/src/useTethr.ts

Lines changed: 17 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import {
55
ConfigType,
66
Tethr,
77
TethrManager,
8-
TethrObject,
98
} from 'tethr'
109
import {onUnmounted, reactive, readonly, Ref, ref, shallowRef, watch} from 'vue'
1110

@@ -60,12 +59,12 @@ export function useTethrConfig<N extends ConfigName>(
6059
return readonly(config)
6160
}
6261

63-
export function useTethr(onSave: (object: TethrObject) => void) {
62+
export function useTethr() {
6463
const manager = new TethrManager()
6564

6665
const pairedCameras = shallowRef<Tethr[]>([])
6766

68-
manager.getPairedCameras().then(cameras => {
67+
manager.addListener('pairedCameraChange', cameras => {
6968
pairedCameras.value = cameras
7069
})
7170

@@ -84,26 +83,33 @@ export function useTethr(onSave: (object: TethrObject) => void) {
8483
}
8584

8685
async function openCamera(cam: Tethr) {
86+
if (camera.value) {
87+
await closeCamera(camera.value)
88+
}
89+
8790
await cam.open()
8891
camera.value = cam
8992
cam.on('disconnect', onDisconnect)
9093
cam.on('liveviewStreamUpdate', onLivewviewStreamUpdate)
9194
}
9295

93-
async function closeCurrentSelectedCamera() {
96+
async function closeCamera(cam: Tethr) {
9497
if (!camera.value) return
9598

9699
camera.value.off('disconnect', onDisconnect)
97100
camera.value.off('liveviewStreamUpdate', onLivewviewStreamUpdate)
98101
await camera.value.close()
99-
camera.value = null
102+
103+
if (camera.value === cam) {
104+
camera.value = null
105+
}
100106
}
101107

102108
async function requestCameras(type: 'usbptp' | 'webcam') {
103-
let cams: Tethr[]
109+
let cam: Tethr | null
104110
try {
105-
cams = await manager.requestCameras(type)
106-
if (cams.length === 0) {
111+
cam = await manager.requestCamera(type)
112+
if (!cam) {
107113
return
108114
}
109115
} catch (err) {
@@ -113,26 +119,7 @@ export function useTethr(onSave: (object: TethrObject) => void) {
113119
return
114120
}
115121

116-
await closeCurrentSelectedCamera()
117-
118-
await openCamera(cams[0])
119-
}
120-
121-
async function takePhoto() {
122-
if (!camera.value) return
123-
const result = await camera.value.takePhoto()
124-
if (result.status === 'ok') {
125-
for (const object of result.value) {
126-
if (object.format !== 'raw') {
127-
photoURL.value = URL.createObjectURL(object.blob)
128-
}
129-
onSave(object)
130-
}
131-
}
132-
}
133-
134-
async function runAutoFocus() {
135-
await camera.value?.runAutoFocus()
122+
await openCamera(cam)
136123
}
137124

138125
async function toggleLiveview() {
@@ -158,6 +145,8 @@ export function useTethr(onSave: (object: TethrObject) => void) {
158145

159146
return {
160147
pairedCameras,
148+
openCamera,
149+
closeCamera,
161150
camera,
162151
requestCameras,
163152
// DPC
@@ -199,8 +188,6 @@ export function useTethr(onSave: (object: TethrObject) => void) {
199188
},
200189
liveviewMediaStream,
201190
photoURL,
202-
runAutoFocus,
203191
toggleLiveview,
204-
takePhoto,
205192
}
206193
}

src/Tethr.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@ export abstract class Tethr
116116
abstract close(): Promise<void>
117117

118118
abstract get opened(): boolean
119+
abstract get type(): 'usbptp' | 'webcam'
120+
abstract get name(): string
119121

120122
// eslint-disable-next-line @typescript-eslint/no-unused-vars
121123
setLog(log: boolean) {

0 commit comments

Comments
 (0)