Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 13 additions & 13 deletions example/hotspot_provisioning_example_app/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -157,10 +157,10 @@ packages:
dependency: transitive
description:
name: fake_async
sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44"
sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc"
url: "https://pub.dev"
source: hosted
version: "1.3.3"
version: "1.3.2"
ffi:
dependency: transitive
description:
Expand Down Expand Up @@ -300,26 +300,26 @@ packages:
dependency: transitive
description:
name: leak_tracker
sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de"
sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec
url: "https://pub.dev"
source: hosted
version: "11.0.2"
version: "10.0.8"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1"
sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573
url: "https://pub.dev"
source: hosted
version: "3.0.10"
version: "3.0.9"
leak_tracker_testing:
dependency: transitive
description:
name: leak_tracker_testing
sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1"
sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3"
url: "https://pub.dev"
source: hosted
version: "3.0.2"
version: "3.0.1"
lints:
dependency: transitive
description:
Expand Down Expand Up @@ -633,10 +633,10 @@ packages:
dependency: transitive
description:
name: test_api
sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00"
sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd
url: "https://pub.dev"
source: hosted
version: "0.7.6"
version: "0.7.4"
typed_data:
dependency: transitive
description:
Expand All @@ -657,10 +657,10 @@ packages:
dependency: transitive
description:
name: vector_math
sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b
sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
url: "https://pub.dev"
source: hosted
version: "2.2.0"
version: "2.1.4"
viam_flutter_hotspot_provisioning_widget:
dependency: "direct main"
description:
Expand Down Expand Up @@ -717,5 +717,5 @@ packages:
source: hosted
version: "6.5.0"
sdks:
dart: ">=3.8.0-0 <4.0.0"
dart: ">=3.7.0 <4.0.0"
flutter: ">=3.27.0"
162 changes: 18 additions & 144 deletions lib/widgets/resources/arm.dart
Original file line number Diff line number Diff line change
@@ -1,171 +1,45 @@
import 'package:collection/collection.dart';
import 'package:flutter/material.dart';

import '../../viam_sdk.dart';
import '../../widgets.dart';
import 'arm_widgets/joint_positions_widget.dart';
import 'arm_widgets/pose_widget.dart';

class ArmNotifier extends ChangeNotifier {
void armHasMoved() {
notifyListeners();
}
}

/// A widget to control an [Arm].
class ViamArmWidget extends StatefulWidget {
class ViamArmWidgetNew extends StatefulWidget {
/// The [Arm]
final Arm arm;

const ViamArmWidget({
const ViamArmWidgetNew({
super.key,
required this.arm,
});

@override
State<ViamArmWidget> createState() => _ViamArmWidgetState();
}

enum _PoseField {
x,
y,
z,
theta,
oX,
oY,
oZ;

String get title {
switch (this) {
case x:
return 'X';
case y:
return 'Y';
case z:
return 'Z';
case theta:
return 'Theta';
case oX:
return 'OX';
case oY:
return 'OY';
case oZ:
return 'OZ';
}
}
State<ViamArmWidgetNew> createState() => _ViamArmWidgetNewState();
}

class _ViamArmWidgetState extends State<ViamArmWidget> {
Pose endPosition = Pose();
List<double> jointPositions = [];

Future<void> _getPositions() async {
final ep = await widget.arm.endPosition();
final jp = await widget.arm.jointPositions();
setState(() {
jointPositions = jp;
endPosition = ep;
});
}
class _ViamArmWidgetNewState extends State<ViamArmWidgetNew> {
final ArmNotifier _armNotifier = ArmNotifier();

@override
void initState() {
super.initState();
_getPositions();
}

Future<void> updateEndPosition(_PoseField field, double increment) async {
final ep = endPosition;
switch (field) {
case _PoseField.x:
ep.x += increment;
case _PoseField.y:
ep.y += increment;
case _PoseField.z:
ep.z += increment;
case _PoseField.theta:
ep.theta += increment;
case _PoseField.oX:
ep.oX += increment;
case _PoseField.oY:
ep.oY += increment;
case _PoseField.oZ:
ep.oZ += increment;
}

await widget.arm.moveToPosition(ep);
await _getPositions();
}

Future<void> updateJointPosition(int joint, double increment) async {
final jp = jointPositions;
jp[joint] += increment;
await widget.arm.moveToJointPositions(jp);
await _getPositions();
}

TableRow _getEndPositionRow(_PoseField field) {
double value;
switch (field) {
case _PoseField.x:
value = endPosition.x;
case _PoseField.y:
value = endPosition.y;
case _PoseField.z:
value = endPosition.z;
case _PoseField.theta:
value = endPosition.theta;
case _PoseField.oX:
value = endPosition.oX;
case _PoseField.oY:
value = endPosition.oY;
case _PoseField.oZ:
value = endPosition.oZ;
}

return TableRow(children: [
_ArmTableCell(Text(field.title, textAlign: TextAlign.end)),
_ArmTableCell(ViamButton(onPressed: () => updateEndPosition(field, -10), text: '--', size: ViamButtonSizeClass.small)),
_ArmTableCell(ViamButton(onPressed: () => updateEndPosition(field, -1), text: '-', size: ViamButtonSizeClass.small)),
_ArmTableCell(Text(value.toStringAsFixed(2), textAlign: TextAlign.center)),
_ArmTableCell(ViamButton(onPressed: () => updateEndPosition(field, 1), text: '+', size: ViamButtonSizeClass.small)),
_ArmTableCell(ViamButton(onPressed: () => updateEndPosition(field, 10), text: '++', size: ViamButtonSizeClass.small)),
]);
void dispose() {
_armNotifier.dispose();
super.dispose();
}

@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
const Text('End Positions (mm)', style: TextStyle(fontWeight: FontWeight.bold)),
Table(
columnWidths: const {0: IntrinsicColumnWidth()},
defaultVerticalAlignment: TableCellVerticalAlignment.middle,
children: _PoseField.values.map((e) => _getEndPositionRow(e)).toList(),
),
const SizedBox(height: 16),
const Text('Joints (degrees)', style: TextStyle(fontWeight: FontWeight.bold)),
Table(
columnWidths: const {0: IntrinsicColumnWidth()},
defaultVerticalAlignment: TableCellVerticalAlignment.middle,
children: jointPositions
.mapIndexed((index, element) => TableRow(children: [
_ArmTableCell(Text('Joint $index', textAlign: TextAlign.end)),
_ArmTableCell(
ViamButton(onPressed: () => updateJointPosition(index, -10), text: '--', size: ViamButtonSizeClass.small)),
_ArmTableCell(ViamButton(onPressed: () => updateJointPosition(index, -1), text: '-', size: ViamButtonSizeClass.small)),
_ArmTableCell(Text(element.toStringAsFixed(2), textAlign: TextAlign.center)),
_ArmTableCell(ViamButton(onPressed: () => updateJointPosition(index, 1), text: '+', size: ViamButtonSizeClass.small)),
_ArmTableCell(ViamButton(onPressed: () => updateJointPosition(index, 10), text: '++', size: ViamButtonSizeClass.small)),
]))
.toList(),
)
JointPositionsWidget(arm: widget.arm, updateNotifier: _armNotifier),
PoseWidget(arm: widget.arm, updateNotifier: _armNotifier),
],
);
}
}

class _ArmTableCell extends StatelessWidget {
final Widget child;

const _ArmTableCell(this.child);

@override
Widget build(BuildContext context) {
return TableCell(child: Padding(padding: const EdgeInsets.symmetric(horizontal: 2, vertical: 1), child: child));
}
}
26 changes: 0 additions & 26 deletions lib/widgets/resources/arm_new.dart

This file was deleted.

Loading