Skip to content

Commit 74f9ac9

Browse files
committed
Add serializable messages
Add tests Send configuration on button push, not on start
1 parent 08068ee commit 74f9ac9

File tree

9 files changed

+107
-50
lines changed

9 files changed

+107
-50
lines changed

RobotController/Base.lproj/Main.storyboard

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -82,40 +82,47 @@
8282
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
8383
<nil key="highlightedColor"/>
8484
</label>
85+
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="g7J-5D-BR3">
86+
<rect key="frame" x="194" y="24" width="154" height="30"/>
87+
<fontDescription key="fontDescription" type="system" pointSize="14"/>
88+
<textInputTraits key="textInputTraits" keyboardType="decimalPad"/>
89+
</textField>
90+
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="9eC-Hk-m4U" userLabel="Reset Configuration">
91+
<rect key="frame" x="194" y="229" width="136" height="30"/>
92+
<state key="normal" title="Reset Configuration"/>
93+
<connections>
94+
<action selector="resetConfiguration:" destination="8rJ-Kc-sve" eventType="touchUpInside" id="Vqa-JM-34e"/>
95+
</connections>
96+
</button>
8597
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Robot Port" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="PS6-Ha-MZf">
86-
<rect key="frame" x="74" y="61" width="83" height="21"/>
98+
<rect key="frame" x="74" y="65" width="83" height="21"/>
8799
<fontDescription key="fontDescription" type="system" pointSize="17"/>
88100
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
89101
<nil key="highlightedColor"/>
90102
</label>
91-
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="g7J-5D-BR3">
92-
<rect key="frame" x="194" y="24" width="154" height="30"/>
93-
<fontDescription key="fontDescription" type="system" pointSize="14"/>
94-
<textInputTraits key="textInputTraits"/>
95-
</textField>
96103
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="VPJ-Os-IR2">
97-
<rect key="frame" x="194" y="57" width="154" height="30"/>
104+
<rect key="frame" x="194" y="61" width="154" height="30"/>
98105
<fontDescription key="fontDescription" type="system" pointSize="14"/>
99-
<textInputTraits key="textInputTraits"/>
106+
<textInputTraits key="textInputTraits" keyboardType="decimalPad"/>
100107
</textField>
101108
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="B2u-Ck-Ub8">
102-
<rect key="frame" x="251" y="95" width="97" height="30"/>
109+
<rect key="frame" x="194" y="99" width="97" height="30"/>
103110
<fontDescription key="fontDescription" type="system" pointSize="14"/>
104-
<textInputTraits key="textInputTraits"/>
111+
<textInputTraits key="textInputTraits" keyboardType="decimalPad"/>
105112
</textField>
106113
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="H8j-Pd-UHj">
107-
<rect key="frame" x="251" y="133" width="97" height="30"/>
114+
<rect key="frame" x="194" y="137" width="97" height="30"/>
108115
<fontDescription key="fontDescription" type="system" pointSize="14"/>
109-
<textInputTraits key="textInputTraits"/>
116+
<textInputTraits key="textInputTraits" keyboardType="decimalPad"/>
110117
</textField>
111118
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Left Servo GPIO" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Vd3-Gb-eVF">
112-
<rect key="frame" x="34" y="99" width="123" height="21"/>
119+
<rect key="frame" x="34" y="103" width="123" height="21"/>
113120
<fontDescription key="fontDescription" type="system" pointSize="17"/>
114121
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
115122
<nil key="highlightedColor"/>
116123
</label>
117124
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Right Servo GPIO" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="4jB-OT-Cr1">
118-
<rect key="frame" x="24" y="136" width="133" height="21"/>
125+
<rect key="frame" x="24" y="140" width="133" height="21"/>
119126
<fontDescription key="fontDescription" type="system" pointSize="17"/>
120127
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
121128
<nil key="highlightedColor"/>

RobotController/FirstViewController.swift

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,42 +11,48 @@ import UIKit
1111
class FirstViewController: UIViewController {
1212
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
1313
var robot: Robot?
14+
1415
@IBOutlet weak var leftButton: UIButton?
1516
@IBOutlet weak var rightButton: UIButton?
1617
@IBOutlet weak var forwardButton: UIButton?
1718
@IBOutlet weak var backButton: UIButton?
1819

1920
@IBAction func pressForward(sender: UIButton) {
2021
Swift.print("Go forward")
21-
robot?.send_datagram([0xf0, 0x04, 0x02, 0x01, 0x07, 0xd0, 0xf1])
22+
let msg = RotateServoTypeMessage(mask: 1, pulseWidth: 2000)
23+
robot?.send_datagram(msg.serialize())
2224
}
2325

2426
@IBAction func pressBackward(sender: UIButton) {
2527
Swift.print("Go backward")
26-
robot?.send_datagram([0xf0, 0x04, 0x02, 0x01, 0x03, 0xe8, 0xf1])
28+
let msg = RotateServoTypeMessage(mask: 1, pulseWidth: 1000)
29+
robot?.send_datagram(msg.serialize())
2730
}
2831

2932
@IBAction func pressRight(sender: UIButton) {
3033
Swift.print("Go right")
31-
34+
let msg = RotateServoMessage(gpio: (robot?.leftServo)!, pulseWidth: 2000)
35+
robot?.send_datagram(msg.serialize())
3236
}
3337

3438
@IBAction func pressLeft(sender: UIButton) {
3539
Swift.print("Go left")
36-
40+
let msg = RotateServoMessage(gpio: (robot?.rightServo)!, pulseWidth: 2000)
41+
robot?.send_datagram(msg.serialize())
3742
}
3843

3944
@IBAction func releaseButton(sender: UIButton) {
4045
Swift.print("Stop")
41-
robot?.send_datagram([0xf0, 0x04, 0x02, 0x01, 0x06, 0x0e, 0xf1])
46+
let msg = RotateServoTypeMessage(mask: 1, pulseWidth: 1500)
47+
robot?.send_datagram(msg.serialize())
4248
}
4349

4450
override func viewDidLoad() {
4551
super.viewDidLoad()
4652
robot = appDelegate.robot
4753
Swift.print("Sending config datagrams")
48-
robot?.send_datagram([0xf0, 0x03, 0x01, 0x81, 0x17, 0xf1])
49-
robot?.send_datagram([0xf0, 0x03, 0x01, 0x01, 0x14, 0xf1])
54+
//robot?.send_datagram([0xf0, 0x03, 0x01, 0x81, 0x17, 0xf1])
55+
//robot?.send_datagram([0xf0, 0x03, 0x01, 0x01, 0x14, 0xf1])
5056
Swift.print("Done sending config")
5157
}
5258

RobotController/Message.swift

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ class Message {
2222
}
2323

2424
class AddServoMessage : Message {
25-
let mesageType:UInt8 = 1
26-
let size:UInt8 = 2
25+
let messageType:UInt8 = 1
26+
let size:UInt8 = 3
2727
var _servoType: UInt8
2828
var _gpio: UInt8
2929

@@ -37,12 +37,12 @@ class AddServoMessage : Message {
3737
}
3838

3939
override func serialize() -> [UInt8]{
40-
return [SOM, size, _servoType, _gpio, EOM]
40+
return [SOM, size, messageType, _servoType, _gpio, EOM]
4141
}
4242
}
4343

4444
class RotateServoTypeMessage : Message {
45-
let mesageType:UInt8 = 2
45+
let messageType:UInt8 = 2
4646
let size:UInt8 = 4
4747
var _mask: UInt8
4848
var _pulseWidth: UInt16
@@ -53,22 +53,22 @@ class RotateServoTypeMessage : Message {
5353
}
5454

5555
override func serialize() -> [UInt8]{
56-
return [SOM, size, _mask, UInt8(_pulseWidth >> 8), UInt8(_pulseWidth & 0xff), EOM]
56+
return [SOM, size, messageType, _mask, UInt8(_pulseWidth >> 8), UInt8(_pulseWidth & 0xff), EOM]
5757
}
5858
}
5959

6060
class RotateServoMessage : Message {
61-
let mesageType:UInt8 = 3
61+
let messageType:UInt8 = 3
6262
let size:UInt8 = 4
63-
var gpio: UInt8
64-
var pulseWidth: UInt16
63+
var _gpio: UInt8
64+
var _pulseWidth: UInt16
6565

66-
init(_gpio: UInt8, _pulseWidth: UInt16) {
67-
gpio = _gpio
68-
pulseWidth = _pulseWidth
66+
init(gpio: UInt8, pulseWidth: UInt16) {
67+
_gpio = gpio
68+
_pulseWidth = pulseWidth
6969
}
7070

7171
override func serialize() -> [UInt8]{
72-
return [SOM, size, gpio, UInt8(pulseWidth >> 8), UInt8(pulseWidth), EOM]
72+
return [SOM, size, messageType, _gpio, UInt8(_pulseWidth >> 8), UInt8(_pulseWidth & 0xff), EOM]
7373
}
7474
}

RobotController/Robot.swift

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
import Foundation
1010

1111
class Robot {
12-
var leftServo = 20;
13-
var rightServo = 23;
12+
var leftServo: UInt8 = 20;
13+
var rightServo: UInt8 = 23;
1414
let client: UDPClient = UDPClient(addr: "", port: 0);
1515

1616
var robotIp: String {
@@ -44,4 +44,13 @@ class Robot {
4444
func send_datagram(data:[UInt8]) {
4545
client.send(data: data)
4646
}
47+
48+
func send_config() {
49+
let msg = AddServoMessage(gpio: leftServo, servoType: 1)
50+
send_datagram(msg.serialize())
51+
52+
msg._gpio = rightServo
53+
msg.setInverse()
54+
send_datagram(msg.serialize())
55+
}
4756
}

RobotController/SecondViewController.swift

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,43 @@ class SecondViewController: UIViewController {
1212
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
1313
var robot: Robot?
1414
@IBOutlet weak var robotIp: UITextField?
15-
@IBOutlet weak var robotPort: UITextField?
16-
@IBOutlet weak var leftGpio: UITextField?
17-
@IBOutlet weak var rightGpio: UITextField?
15+
@IBOutlet weak var robotPort: UITextField!
16+
@IBOutlet weak var leftGpio: UITextField!
17+
@IBOutlet weak var rightGpio: UITextField!
18+
19+
@IBAction func resetConfiguration(sender: UIButton) {
20+
Swift.print("Reset robot configuration")
21+
let port:Int? = Int(robotPort.text!)
22+
let left:UInt8? = UInt8(leftGpio.text!)
23+
let right:UInt8? = UInt8(rightGpio.text!)
24+
25+
robot!.robotIp = robotIp!.text!
26+
robot!.robotPort = port!
27+
robot!.leftServo = left!
28+
robot!.rightServo = right!
29+
robot!.send_config()
30+
}
1831

1932
override func viewDidLoad() {
2033
super.viewDidLoad()
2134
robot = appDelegate.robot
22-
robotIp!.text = robot?.robotIp
23-
robotPort!.text = String(robot?.robotPort)
35+
robotIp!.text = robot!.robotIp
36+
robotPort!.text = String(robot!.robotPort)
37+
leftGpio!.text = String(robot!.leftServo)
38+
rightGpio!.text = String(robot!.rightServo)
39+
40+
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "dismissKeyboard")
41+
view.addGestureRecognizer(tap)
2442
}
2543

2644
override func didReceiveMemoryWarning() {
2745
super.didReceiveMemoryWarning()
2846
// Dispose of any resources that can be recreated.
2947
}
3048

31-
49+
func dismissKeyboard() {
50+
//Causes the view (or one of its embedded text fields) to resign the first responder status.
51+
view.endEditing(true)
52+
}
3253
}
3354

RobotControllerTests/RobotControllerTests.swift

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,22 +22,36 @@ class RobotControllerTests: XCTestCase {
2222
}
2323

2424
func testAddServoMessage() {
25-
// This is an example of a functional test case.
26-
// Use XCTAssert and related functions to verify your tests produce the correct results.
27-
let msg = AddServoMessage(gpio: 12, servoType: 1)
25+
let msg = AddServoMessage(gpio: 23, servoType: 1)
2826

29-
XCTAssert(msg.serialize() == [0xf0, 0x02, 0x01, 0x0c, 0xf1])
27+
XCTAssert(msg.serialize() == [0xf0, 0x03, 0x01, 0x01, 0x17, 0xf1])
3028

3129
msg.setInverse()
32-
XCTAssert(msg.serialize() == [0xf0, 0x02, 0x81, 0x0c, 0xf1])
30+
XCTAssert(msg.serialize() == [0xf0, 0x03, 0x01, 0x81, 0x17, 0xf1])
3331
}
3432

35-
func testRotateServoMessage() {
36-
// This is an example of a functional test case.
37-
// Use XCTAssert and related functions to verify your tests produce the correct results.
33+
func testRotateServoTypeMessage() {
3834
let msg = RotateServoTypeMessage(mask: 0x01, pulseWidth: 2000)
3935

40-
XCTAssert(msg.serialize() == [0xf0, 0x04, 0x01, 0x07, 0xd0, 0xf1])
36+
XCTAssert(msg.serialize() == [0xf0, 0x04, 0x02, 0x01, 0x07, 0xd0, 0xf1])
37+
}
38+
39+
func testRotateServoMessage() {
40+
let msg = RotateServoMessage(gpio: 20, pulseWidth: 2000)
41+
42+
Swift.print(msg.serialize())
43+
XCTAssert(msg.serialize() == [0xf0, 0x04, 0x03, 0x14, 0x07, 0xd0, 0xf1])
44+
}
45+
46+
func testSendConfig() {
47+
let robot: Robot?
48+
49+
robot = Robot()
50+
robot?.robotIp = "1.2.3.4"
51+
robot?.robotPort = Int(1234)
52+
robot?.leftServo = UInt8(20)
53+
robot?.rightServo = UInt8(10)
54+
robot?.send_config()
4155
}
4256

4357
func testPerformanceExample() {

0 commit comments

Comments
 (0)