-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathtokenManagement.cpp
More file actions
197 lines (176 loc) · 5.75 KB
/
tokenManagement.cpp
File metadata and controls
197 lines (176 loc) · 5.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
/******************************************************************************
Module
tokenManagement.cpp
Description
This library contains code to manage the servo for token deposition..
Arduino IDE version: 0022
History
When Who Description
-------- --- -------------------------------------
03/02/12 ELC created tokenManagement.h for the Arduino UNO R2
******************************************************************************/
/*----------------------------- Include Files -------------------------------*/
// include definitions folder: SERVO_PIN, SERVO_TIMER
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
#include "tokenManagement.h"
#include "defines.h"
#include <Timers.h>
#include <Servo.h>
/*----------------------------- Module Defines ------------------------------*/
#define SERVO_TIMER_LENGTH 15
#define GOING_FORWARD 1
#define GOING_HOME 2
#define AT_REST 3
#define DEGREE_FRACTION 1
#define DELTA 2
#define MAX_BUCKETS 3
#define FORTYFIVE 45
#define NINETY 100
#define ONETHIRTYFIVE 150
#define MAX_ANGLE 150
#define HOME 0
/*----------------------------- Module Variables ---------------------------*/
static int servoAngle;
static int bucketNo;
static int servoState;
static int nextBucketAngle;
static int depositingTokens = 0; // 1 for true, 0 for false
static Servo servo;
/*----------------------------- Module Code --------------------------------*/
/******************************************************************************
Function: depositTokens
Contents: Servo deposits tokens from next bucket. If all buckets have been
used, servo will instead go home.
Parameters: None
Returns: Nothing
Notes:
******************************************************************************/
void depositTokens(void) {
bucketNo = bucketNo + 1;
nextBucketAngle = evaluateBucketAngle(bucketNo);
if (nextBucketAngle == HOME) {
servoState = GOING_HOME; // sets servo to return to home position
////Serial.println("Servo going home (deposit)");
} else {
servoState = GOING_FORWARD;
depositingTokens = 1;
////Serial.println("Servo depositing");
}
}
/******************************************************************************
Function: goHome
Contents: Servo returns to home position (angle = 0)
Parameters: None
Returns: Nothing
Notes:
******************************************************************************/
void goHome(void) {
servoState = GOING_HOME;
bucketNo = HOME;
}
/******************************************************************************
Function: bucketAngle = evaluateBucketAngle(bucketNo)
Contents: Returns the servo angle to reach the bucket.
Parameters: None
Returns: Bucket angle
Notes:
******************************************************************************/
int evaluateBucketAngle(int bucketNo) {
int bucketAngle;
switch (bucketNo) {
case 1:
bucketAngle = FORTYFIVE;
break;
case 2:
bucketAngle = NINETY;
break;
case 3:
bucketAngle = ONETHIRTYFIVE;
break;
case HOME:
bucketAngle = HOME;
break;
default:
bucketAngle = HOME;
break;
}
return bucketAngle<<DEGREE_FRACTION;
}
/******************************************************************************
Function: updateServo(servoAngle)
Contents: Updates the angle of the servo.
Parameters: None
Returns: Nothing
Notes:
******************************************************************************/
void updateServo(void) {
if (TMRArd_IsTimerExpired(SERVO_TIMER)) {
switch (servoState) {
case GOING_FORWARD:
servoAngle = servoAngle + DELTA;
////Serial.println(servoAngle);
if (servoAngle > nextBucketAngle) {
servoAngle = nextBucketAngle;
servoState = AT_REST;
depositingTokens = 0;
//Serial.println("reached rest");
}
break;
case GOING_HOME:
servoAngle = servoAngle - DELTA;
//Serial.println(servoAngle);
if (servoAngle < 0) {
servoAngle = HOME;
servoState = AT_REST;
//Serial.println("reached rest");
}
break;
case AT_REST:
default:
// do nothing
break;
}
////Serial.println(servoAngle>>DEGREE_FRACTION);
servo.write(servoAngle>>DEGREE_FRACTION);
TMRArd_InitTimer(SERVO_TIMER, SERVO_TIMER_LENGTH);
}
}
/******************************************************************************
Function: initializeServo
Contents: Initializes the servo at the beginning of the program.
Parameters: None
Returns: Nothing
Notes:
******************************************************************************/
void initializeServo(void) {
servo.attach(SERVO_PIN);
bucketNo = 0;
servoAngle = 0;
servoState = AT_REST;
TMRArd_InitTimer(SERVO_TIMER, SERVO_TIMER_LENGTH);
}
/******************************************************************************
Function: bucketsLeft
Contents: Returns the number of buckets left presumabely still full
Parameters: None
Returns: number of buckets left
Notes:
******************************************************************************/
int bucketsLeft(void) {
int numBucketsLeft = MAX_BUCKETS - bucketNo;
return numBucketsLeft;
}
/******************************************************************************
Function: isServoDepositingTokens
Contents: Returns 1 if servo is current depositing tokens, 0 if not
Parameters: None
Returns: 1 or 0 depending whether servo is depositing tokens
Notes:
******************************************************************************/
char isServoDepositingTokens(void) {
return depositingTokens != 0;
}