@viamrobotics/test-widgets 0.6.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/README.md +1 -1
  2. package/dist/api-docs-href.d.ts +8 -0
  3. package/dist/api-docs-href.js +17 -0
  4. package/dist/client-map.d.ts +30 -30
  5. package/dist/client-map.js +32 -29
  6. package/dist/components/angle-unit-toggle.svelte +1 -4
  7. package/dist/components/api-section.svelte +21 -23
  8. package/dist/components/api-section.svelte.d.ts +2 -0
  9. package/dist/components/index.d.ts +21 -0
  10. package/dist/components/index.js +21 -0
  11. package/dist/components/is-moving.svelte +4 -5
  12. package/dist/components/is-moving.svelte.d.ts +1 -0
  13. package/dist/components/mutation-section.svelte +20 -23
  14. package/dist/components/mutation-section.svelte.d.ts +2 -0
  15. package/dist/components/section-title.svelte +63 -0
  16. package/dist/components/section-title.svelte.d.ts +14 -0
  17. package/dist/components/widgets/arm/arm.svelte +25 -29
  18. package/dist/components/widgets/arm/get-joint-positions-widget.svelte +36 -0
  19. package/dist/components/widgets/arm/get-joint-positions-widget.svelte.d.ts +7 -0
  20. package/dist/components/widgets/arm/is-moving-widget.svelte +20 -0
  21. package/dist/components/widgets/arm/is-moving-widget.svelte.d.ts +7 -0
  22. package/dist/components/widgets/arm/joint-position-editor.svelte +89 -0
  23. package/dist/components/widgets/arm/joint-position-editor.svelte.d.ts +11 -0
  24. package/dist/components/widgets/arm/joint-position-quick-move.svelte +85 -0
  25. package/dist/components/widgets/arm/joint-position-quick-move.svelte.d.ts +9 -0
  26. package/dist/components/widgets/arm/joint-position-slider.svelte +36 -0
  27. package/dist/components/widgets/arm/joint-position-slider.svelte.d.ts +9 -0
  28. package/dist/components/widgets/arm/move-to-joint-positions-widget.svelte +9 -5
  29. package/dist/components/widgets/arm/move-to-joint-positions.svelte +73 -127
  30. package/dist/components/widgets/arm/move-to-joint-positions.svelte.d.ts +1 -0
  31. package/dist/components/widgets/arm/move-to-position.svelte +31 -3
  32. package/dist/components/widgets/audio-input/audio-input.svelte +2 -0
  33. package/dist/components/widgets/audio-input/get-properties-widget.svelte +43 -0
  34. package/dist/components/widgets/audio-input/get-properties-widget.svelte.d.ts +7 -0
  35. package/dist/components/widgets/audio-output/audio-output.svelte +2 -0
  36. package/dist/components/widgets/audio-output/get-properties-widget.svelte +43 -0
  37. package/dist/components/widgets/audio-output/get-properties-widget.svelte.d.ts +7 -0
  38. package/dist/components/widgets/base/base.svelte +9 -1
  39. package/dist/components/widgets/base/is-moving-widget.svelte +20 -0
  40. package/dist/components/widgets/base/is-moving-widget.svelte.d.ts +7 -0
  41. package/dist/components/widgets/base/quick-move.svelte +12 -5
  42. package/dist/components/widgets/camera/camera.svelte +156 -142
  43. package/dist/components/widgets/camera/live-or-polling-video.svelte +9 -1
  44. package/dist/components/widgets/discovery/discovery.svelte +1 -0
  45. package/dist/components/widgets/encoder/encoder-position-type.d.ts +8 -0
  46. package/dist/components/widgets/encoder/encoder-position-type.js +20 -0
  47. package/dist/components/widgets/encoder/encoder.svelte +5 -20
  48. package/dist/components/widgets/encoder/get-position-widget.svelte +54 -0
  49. package/dist/components/widgets/encoder/get-position-widget.svelte.d.ts +7 -0
  50. package/dist/components/widgets/gantry/gantry.svelte +28 -5
  51. package/dist/components/widgets/gantry/get-position-widget.svelte +43 -0
  52. package/dist/components/widgets/gantry/get-position-widget.svelte.d.ts +7 -0
  53. package/dist/components/widgets/gantry/is-moving-widget.svelte +20 -0
  54. package/dist/components/widgets/gantry/is-moving-widget.svelte.d.ts +7 -0
  55. package/dist/components/widgets/generic/generic.svelte +8 -1
  56. package/dist/components/widgets/gripper/gripper.svelte +11 -5
  57. package/dist/components/widgets/gripper/is-holding-something.svelte +2 -4
  58. package/dist/components/widgets/gripper/is-moving-widget.svelte +20 -0
  59. package/dist/components/widgets/gripper/is-moving-widget.svelte.d.ts +7 -0
  60. package/dist/components/widgets/input-controller/input-controller.svelte +2 -1
  61. package/dist/components/widgets/motor/is-moving-widget.svelte +20 -0
  62. package/dist/components/widgets/motor/is-moving-widget.svelte.d.ts +7 -0
  63. package/dist/components/widgets/motor/motor.svelte +13 -9
  64. package/dist/components/widgets/movement-sensor/get-accuracy-widget.svelte +38 -0
  65. package/dist/components/widgets/movement-sensor/get-accuracy-widget.svelte.d.ts +7 -0
  66. package/dist/components/widgets/movement-sensor/get-compass-heading-widget.svelte +38 -0
  67. package/dist/components/widgets/movement-sensor/get-compass-heading-widget.svelte.d.ts +7 -0
  68. package/dist/components/widgets/movement-sensor/get-orientation-widget.svelte +38 -0
  69. package/dist/components/widgets/movement-sensor/get-orientation-widget.svelte.d.ts +7 -0
  70. package/dist/components/widgets/movement-sensor/get-position-widget.svelte +38 -0
  71. package/dist/components/widgets/movement-sensor/get-position-widget.svelte.d.ts +7 -0
  72. package/dist/components/widgets/movement-sensor/movement-sensor.svelte +53 -26
  73. package/dist/components/widgets/power-sensor/get-current-widget.svelte +38 -0
  74. package/dist/components/widgets/power-sensor/get-current-widget.svelte.d.ts +7 -0
  75. package/dist/components/widgets/power-sensor/get-power-widget.svelte +38 -0
  76. package/dist/components/widgets/power-sensor/get-power-widget.svelte.d.ts +7 -0
  77. package/dist/components/widgets/power-sensor/get-voltage-widget.svelte +38 -0
  78. package/dist/components/widgets/power-sensor/get-voltage-widget.svelte.d.ts +7 -0
  79. package/dist/components/widgets/power-sensor/power-sensor.svelte +4 -0
  80. package/dist/components/widgets/sensor/sensor.svelte +1 -0
  81. package/dist/components/widgets/servo/is-moving-widget.svelte +20 -0
  82. package/dist/components/widgets/servo/is-moving-widget.svelte.d.ts +7 -0
  83. package/dist/components/widgets/servo/servo.svelte +10 -2
  84. package/dist/components/widgets/slam/get-position-widget.svelte +38 -0
  85. package/dist/components/widgets/slam/get-position-widget.svelte.d.ts +7 -0
  86. package/dist/components/widgets/slam/move-on-map.svelte +4 -1
  87. package/dist/components/widgets/slam/slam.svelte +4 -1
  88. package/dist/components/widgets/vision-service/context.svelte.d.ts +1 -0
  89. package/dist/components/widgets/vision-service/context.svelte.js +7 -0
  90. package/dist/components/widgets/vision-service/detection-row.svelte +38 -0
  91. package/dist/components/widgets/vision-service/detection-row.svelte.d.ts +8 -0
  92. package/dist/components/widgets/vision-service/detection.svelte +7 -4
  93. package/dist/components/widgets/vision-service/legend.svelte +14 -11
  94. package/dist/components/widgets/vision-service/vision-service.svelte +9 -10
  95. package/dist/index.d.ts +5 -1
  96. package/dist/index.js +6 -1
  97. package/dist/pip/context.svelte.d.ts +2 -0
  98. package/dist/pip/context.svelte.js +48 -20
  99. package/dist/resource-triplet.d.ts +37 -0
  100. package/dist/resource-triplet.js +37 -0
  101. package/dist/resource-widget.js +187 -0
  102. package/dist/resource.d.ts +0 -9
  103. package/dist/resource.js +0 -72
  104. package/package.json +7 -4
@@ -11,7 +11,6 @@
11
11
  import ApiSection from '../../api-section.svelte'
12
12
  import ConnectionStatus from '../../connection-status.svelte'
13
13
  import IsMoving from '../../is-moving.svelte'
14
- import Queries from '../../queries.svelte'
15
14
  import Query from '../../query.svelte'
16
15
  import StopButton from '../../stop-button.svelte'
17
16
 
@@ -19,7 +18,6 @@
19
18
  import { getJointPositionLimits, type KinematicsJSON } from './joint-position-limits'
20
19
  import MoveToJointPositions from './move-to-joint-positions.svelte'
21
20
  import MoveToPosition from './move-to-position.svelte'
22
- import QuickMove from './quick-move.svelte'
23
21
 
24
22
  interface Props {
25
23
  partID: string
@@ -38,9 +36,9 @@
38
36
  const jointPositionsQuery = createResourceQuery(client, 'getJointPositions', options)
39
37
  const endPositionQuery = createResourceQuery(client, 'getEndPosition', options)
40
38
  const kinematicsQuery = createResourceQuery(client, 'getKinematics', options)
39
+ const isMovingQuery = createResourceQuery(client, 'isMoving', options)
41
40
 
42
41
  const moveToJointPosMutation = createResourceMutation(client, 'moveToJointPositions')
43
- const quickMoveToJointPosMutation = createResourceMutation(client, 'moveToJointPositions')
44
42
  const stopMutation = createResourceMutation(client, 'stop')
45
43
  const moveToPosMutation = createResourceMutation(client, 'moveToPosition')
46
44
 
@@ -48,13 +46,13 @@
48
46
  moveToJointPosMutation.mutate([jointPositionsList], {})
49
47
  }
50
48
 
51
- const quickMoveToJointPositions = (jointPositionsList: number[]) => {
52
- quickMoveToJointPosMutation.mutate([jointPositionsList], {})
53
- }
54
-
55
49
  const moveToPosition = (position: Pose) => {
56
50
  moveToPosMutation.mutate([position], {})
57
51
  }
52
+
53
+ const jointLimitsDegrees = $derived(
54
+ kinematicsQuery.data ? getJointPositionLimits(kinematicsQuery.data as KinematicsJSON) : []
55
+ )
58
56
  </script>
59
57
 
60
58
  <ConnectionStatus {partID}>
@@ -62,10 +60,11 @@
62
60
  <div class="flex flex-col gap-4 lg:flex-row lg:gap-0 lg:divide-x">
63
61
  <!-- Main control sections -->
64
62
  <div
65
- class="flex flex-col gap-4 lg:grid lg:grow lg:grid-cols-2 lg:gap-0 lg:divide-x xl:grid-cols-4"
63
+ class="flex flex-col gap-4 lg:grid lg:grow lg:grid-cols-2 lg:gap-0 lg:divide-x xl:grid-cols-3"
66
64
  >
67
65
  <ApiSection
68
66
  title="GetJointPositions"
67
+ api="rdk:component:arm"
69
68
  bottomText="Updates automatically"
70
69
  >
71
70
  <Query query={jointPositionsQuery}>
@@ -74,19 +73,26 @@
74
73
  {/if}
75
74
  </Query>
76
75
  </ApiSection>
77
- <ApiSection title="MoveToJointPositions">
78
- <Queries queries={[jointPositionsQuery, kinematicsQuery]}>
79
- {#if jointPositionsQuery.data && kinematicsQuery.data}
76
+ <ApiSection
77
+ title="MoveToJointPositions"
78
+ api="rdk:component:arm"
79
+ >
80
+ <Query query={jointPositionsQuery}>
81
+ {#if jointPositionsQuery.data}
80
82
  <MoveToJointPositions
81
83
  positions={jointPositionsQuery.data.values}
82
84
  {moveToJointPositions}
83
85
  lastError={moveToJointPosMutation.error}
84
- jointLimitsDegrees={getJointPositionLimits(kinematicsQuery.data as KinematicsJSON)}
86
+ {jointLimitsDegrees}
87
+ isMoving={isMovingQuery.data ?? false}
85
88
  />
86
89
  {/if}
87
- </Queries>
90
+ </Query>
88
91
  </ApiSection>
89
- <ApiSection title="MoveToPosition">
92
+ <ApiSection
93
+ title="MoveToPosition"
94
+ api="rdk:component:arm"
95
+ >
90
96
  <Query query={endPositionQuery}>
91
97
  {#if endPositionQuery.data}
92
98
  <MoveToPosition
@@ -97,27 +103,16 @@
97
103
  {/if}
98
104
  </Query>
99
105
  </ApiSection>
100
- <ApiSection
101
- title="Quick move"
102
- bottomText="Press a button to execute"
103
- >
104
- <Query query={jointPositionsQuery}>
105
- {#if jointPositionsQuery.data}
106
- <QuickMove
107
- positions={jointPositionsQuery.data.values}
108
- moveToJointPositions={quickMoveToJointPositions}
109
- lastError={quickMoveToJointPosMutation.error}
110
- />
111
- {/if}
112
- </Query>
113
- </ApiSection>
114
106
  </div>
115
107
 
116
108
  <!-- Control actions sidebar -->
117
109
  <div
118
110
  class="flex flex-row gap-4 lg:ml-auto lg:w-full lg:max-w-40 lg:flex-col lg:gap-0 lg:divide-y"
119
111
  >
120
- <ApiSection title="Stop">
112
+ <ApiSection
113
+ title="Stop"
114
+ api="rdk:component:arm"
115
+ >
121
116
  <StopButton
122
117
  error={stopMutation.error}
123
118
  onStop={() => {
@@ -127,6 +122,7 @@
127
122
  </ApiSection>
128
123
  <IsMoving
129
124
  client={ArmClient}
125
+ api="rdk:component:arm"
130
126
  {partID}
131
127
  {resourceName}
132
128
  />
@@ -0,0 +1,36 @@
1
+ <script lang="ts">
2
+ import { ArmClient } from '@viamrobotics/sdk'
3
+ import { createResourceClient, createResourceQuery } from '@viamrobotics/svelte-sdk'
4
+
5
+ import ApiSection from '../../api-section.svelte'
6
+ import Query from '../../query.svelte'
7
+
8
+ import GetJointPositions from './get-joint-positions.svelte'
9
+
10
+ interface Props {
11
+ partID: string
12
+ resourceName: string
13
+ }
14
+
15
+ const { partID, resourceName }: Props = $props()
16
+
17
+ const client = createResourceClient(
18
+ ArmClient,
19
+ () => partID,
20
+ () => resourceName
21
+ )
22
+
23
+ const query = createResourceQuery(client, 'getJointPositions', { refetchInterval: 500 })
24
+ </script>
25
+
26
+ <ApiSection
27
+ title="GetJointPositions"
28
+ bottomText="Updates automatically"
29
+ class="grow"
30
+ >
31
+ <Query {query}>
32
+ {#if query.data}
33
+ <GetJointPositions positions={query.data.values} />
34
+ {/if}
35
+ </Query>
36
+ </ApiSection>
@@ -0,0 +1,7 @@
1
+ interface Props {
2
+ partID: string;
3
+ resourceName: string;
4
+ }
5
+ declare const GetJointPositionsWidget: import("svelte").Component<Props, {}, "">;
6
+ type GetJointPositionsWidget = ReturnType<typeof GetJointPositionsWidget>;
7
+ export default GetJointPositionsWidget;
@@ -0,0 +1,20 @@
1
+ <script lang="ts">
2
+ import { ArmClient } from '@viamrobotics/sdk'
3
+
4
+ import IsMoving from '../../is-moving.svelte'
5
+ import { ResourceTriplets } from '../../../resource-triplet'
6
+
7
+ interface Props {
8
+ partID: string
9
+ resourceName: string
10
+ }
11
+
12
+ const { partID, resourceName }: Props = $props()
13
+ </script>
14
+
15
+ <IsMoving
16
+ client={ArmClient}
17
+ api={ResourceTriplets.Arm}
18
+ {partID}
19
+ {resourceName}
20
+ />
@@ -0,0 +1,7 @@
1
+ interface Props {
2
+ partID: string;
3
+ resourceName: string;
4
+ }
5
+ declare const IsMovingWidget: import("svelte").Component<Props, {}, "">;
6
+ type IsMovingWidget = ReturnType<typeof IsMovingWidget>;
7
+ export default IsMovingWidget;
@@ -0,0 +1,89 @@
1
+ <script lang="ts">
2
+ import { Button, Icon, Tooltip } from '@viamrobotics/prime-core'
3
+
4
+ import Table from '../../table.svelte'
5
+
6
+ import { type JointLimit } from './joint-position-limits'
7
+ import JointPositionSlider from './joint-position-slider.svelte'
8
+
9
+ interface Props {
10
+ desiredPositions: number[]
11
+ positions: number[]
12
+ jointLimitsDegrees: JointLimit[]
13
+ useRadians: boolean
14
+ moveToJointPositions: (jointPositions: number[]) => void
15
+ }
16
+
17
+ let {
18
+ desiredPositions = $bindable(),
19
+ positions,
20
+ jointLimitsDegrees,
21
+ useRadians,
22
+ moveToJointPositions,
23
+ }: Props = $props()
24
+
25
+ const getSliderMin = (index: number): number => jointLimitsDegrees[index]?.minDegrees ?? -180
26
+ const getSliderMax = (index: number): number => jointLimitsDegrees[index]?.maxDegrees ?? 180
27
+
28
+ const execute = () => {
29
+ moveToJointPositions([...desiredPositions])
30
+ }
31
+
32
+ const resetToZero = () => {
33
+ desiredPositions = positions.map(() => 0)
34
+ }
35
+
36
+ const resetToCurrent = () => {
37
+ desiredPositions = [...positions]
38
+ }
39
+ </script>
40
+
41
+ <Table>
42
+ <thead>
43
+ <tr>
44
+ <th>Joint</th>
45
+ <th>Position ({useRadians ? 'radians' : 'degrees'})</th>
46
+ </tr>
47
+ </thead>
48
+ <tbody>
49
+ {#each [...desiredPositions.keys()] as index (index)}
50
+ <tr>
51
+ <th scope="row">{index}</th>
52
+ <th>
53
+ <JointPositionSlider
54
+ bind:value={desiredPositions[index]}
55
+ minDegrees={getSliderMin(index)}
56
+ maxDegrees={getSliderMax(index)}
57
+ {useRadians}
58
+ />
59
+ </th>
60
+ </tr>
61
+ {/each}
62
+ </tbody>
63
+ </Table>
64
+
65
+ <div class="mb-2 flex flex-col gap-2">
66
+ <span class="flex flex-row gap-2">
67
+ <h4 class="text-xs font-semibold">Quick set</h4>
68
+ <Tooltip>
69
+ <Icon
70
+ name="information-outline"
71
+ cx="text-gray-6"
72
+ />
73
+ <span slot="description">Will update the slider values but will not execute</span>
74
+ </Tooltip>
75
+ </span>
76
+ <div class="flex flex-col gap-2 sm:flex-row">
77
+ <Button onclick={resetToZero}>Zero</Button>
78
+ <Button onclick={resetToCurrent}>Current position</Button>
79
+ </div>
80
+ </div>
81
+
82
+ <Button
83
+ class="mt-auto w-fit"
84
+ icon="play-circle-outline"
85
+ variant="dark"
86
+ onclick={execute}
87
+ >
88
+ Execute
89
+ </Button>
@@ -0,0 +1,11 @@
1
+ import { type JointLimit } from './joint-position-limits';
2
+ interface Props {
3
+ desiredPositions: number[];
4
+ positions: number[];
5
+ jointLimitsDegrees: JointLimit[];
6
+ useRadians: boolean;
7
+ moveToJointPositions: (jointPositions: number[]) => void;
8
+ }
9
+ declare const JointPositionEditor: import("svelte").Component<Props, {}, "desiredPositions">;
10
+ type JointPositionEditor = ReturnType<typeof JointPositionEditor>;
11
+ export default JointPositionEditor;
@@ -0,0 +1,85 @@
1
+ <script lang="ts">
2
+ import { Button, Icon, Tooltip } from '@viamrobotics/prime-core'
3
+
4
+ import Table from '../../table.svelte'
5
+ import { degreesToRadians, formatNumeric } from '../../../format'
6
+
7
+ const INCREMENT_DEGREES = 5
8
+
9
+ interface Props {
10
+ positions: number[]
11
+ moveToJointPositions: (jointPositions: number[]) => void
12
+ useRadians: boolean
13
+ isMoving: boolean
14
+ }
15
+
16
+ const { positions, moveToJointPositions, useRadians, isMoving }: Props = $props()
17
+
18
+ const toDisplayAngle = (degrees: number) => (useRadians ? degreesToRadians(degrees) : degrees)
19
+
20
+ const currentDisplayPositions = $derived(positions.map((degrees) => toDisplayAngle(degrees)))
21
+
22
+ const quickMove = (index: number, increment: number) => {
23
+ if (isMoving) {
24
+ return
25
+ }
26
+ const clonedPositions = positions.map((position, positionIndex) =>
27
+ positionIndex === index ? position + increment : position
28
+ )
29
+ moveToJointPositions(clonedPositions)
30
+ }
31
+ </script>
32
+
33
+ <Tooltip>
34
+ <span class="flex items-center gap-1 text-xs text-amber-600">
35
+ <Icon
36
+ name="alert"
37
+ size="sm"
38
+ cx="text-amber-600"
39
+ />
40
+ Quick move executes immediately
41
+ </span>
42
+ <span slot="description">
43
+ Each ±5° button sends a move command as soon as it is pressed. Buttons are disabled while the
44
+ arm is moving.
45
+ </span>
46
+ </Tooltip>
47
+
48
+ <Table>
49
+ <thead>
50
+ <tr>
51
+ <th>Joint</th>
52
+ <th>Move (degrees)</th>
53
+ </tr>
54
+ </thead>
55
+ <tbody>
56
+ {#each positions as position, index (index)}
57
+ {@const currentValue = currentDisplayPositions[index] ?? position}
58
+ {@const unit = useRadians ? ' rad' : '°'}
59
+ <tr>
60
+ <th scope="row">{index}</th>
61
+ <th>
62
+ <div class="flex h-full max-h-6.5 w-full items-center justify-center gap-1.5">
63
+ <Button
64
+ aria-label="Decrease joint {index} by 5 degrees"
65
+ disabled={isMoving}
66
+ onclick={() => quickMove(index, -INCREMENT_DEGREES)}
67
+ >
68
+ −5°
69
+ </Button>
70
+ <span class="min-w-16 grow text-center text-xs text-gray-700 tabular-nums">
71
+ {formatNumeric(currentValue)}{unit}
72
+ </span>
73
+ <Button
74
+ aria-label="Increase joint {index} by 5 degrees"
75
+ disabled={isMoving}
76
+ onclick={() => quickMove(index, INCREMENT_DEGREES)}
77
+ >
78
+ +5°
79
+ </Button>
80
+ </div>
81
+ </th>
82
+ </tr>
83
+ {/each}
84
+ </tbody>
85
+ </Table>
@@ -0,0 +1,9 @@
1
+ interface Props {
2
+ positions: number[];
3
+ moveToJointPositions: (jointPositions: number[]) => void;
4
+ useRadians: boolean;
5
+ isMoving: boolean;
6
+ }
7
+ declare const JointPositionQuickMove: import("svelte").Component<Props, {}, "">;
8
+ type JointPositionQuickMove = ReturnType<typeof JointPositionQuickMove>;
9
+ export default JointPositionQuickMove;
@@ -0,0 +1,36 @@
1
+ <script lang="ts">
2
+ import { Slider, ThemeUtils } from 'svelte-tweakpane-ui'
3
+
4
+ import { degreesToRadians, formatNumeric, radiansToDegrees } from '../../../format'
5
+
6
+ interface Props {
7
+ value: number
8
+ minDegrees: number
9
+ maxDegrees: number
10
+ useRadians: boolean
11
+ }
12
+
13
+ let { value = $bindable(), minDegrees, maxDegrees, useRadians }: Props = $props()
14
+
15
+ const min = $derived(useRadians ? degreesToRadians(minDegrees) : minDegrees)
16
+ const max = $derived(useRadians ? degreesToRadians(maxDegrees) : maxDegrees)
17
+ const step = $derived(useRadians ? 0.01 : 0.1)
18
+
19
+ const sliderFormat = (v: number) => formatNumeric(v, useRadians ? 3 : 1)
20
+ const toDisplay = (degrees: number) => (useRadians ? degreesToRadians(degrees) : degrees)
21
+ const toDegrees = (display: number) => (useRadians ? radiansToDegrees(display) : display)
22
+ </script>
23
+
24
+ <div class="joint-slider min-w-0">
25
+ <Slider
26
+ value={toDisplay(value)}
27
+ on:change={(event) => {
28
+ value = toDegrees(event.detail.value)
29
+ }}
30
+ {min}
31
+ {max}
32
+ {step}
33
+ format={sliderFormat}
34
+ theme={ThemeUtils.presets.light}
35
+ />
36
+ </div>
@@ -0,0 +1,9 @@
1
+ interface Props {
2
+ value: number;
3
+ minDegrees: number;
4
+ maxDegrees: number;
5
+ useRadians: boolean;
6
+ }
7
+ declare const JointPositionSlider: import("svelte").Component<Props, {}, "value">;
8
+ type JointPositionSlider = ReturnType<typeof JointPositionSlider>;
9
+ export default JointPositionSlider;
@@ -6,7 +6,7 @@
6
6
  createResourceQuery,
7
7
  } from '@viamrobotics/svelte-sdk'
8
8
 
9
- import Queries from '../../queries.svelte'
9
+ import Query from '../../query.svelte'
10
10
 
11
11
  import { getJointPositionLimits, type KinematicsJSON } from './joint-position-limits'
12
12
  import MoveToJointPositions from './move-to-joint-positions.svelte'
@@ -36,15 +36,19 @@
36
36
  const moveToJointPositions = (jointPositionsList: number[]) => {
37
37
  moveToJointPosMutation.mutate([jointPositionsList], {})
38
38
  }
39
+
40
+ const jointLimitsDegrees = $derived(
41
+ kinematicsQuery.data ? getJointPositionLimits(kinematicsQuery.data as KinematicsJSON) : []
42
+ )
39
43
  </script>
40
44
 
41
- <Queries queries={[jointPositionsQuery, kinematicsQuery]}>
42
- {#if jointPositionsQuery.data && kinematicsQuery.data}
45
+ <Query query={jointPositionsQuery}>
46
+ {#if jointPositionsQuery.data}
43
47
  <MoveToJointPositions
44
48
  positions={jointPositionsQuery.data.values}
45
49
  {moveToJointPositions}
46
50
  lastError={moveToJointPosMutation.error}
47
- jointLimitsDegrees={getJointPositionLimits(kinematicsQuery.data as KinematicsJSON)}
51
+ {jointLimitsDegrees}
48
52
  />
49
53
  {/if}
50
- </Queries>
54
+ </Query>