-
Notifications
You must be signed in to change notification settings - Fork 6
/
dual.c
177 lines (146 loc) · 4.77 KB
/
dual.c
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
///////////////////////////////////////////////////////////////////////////////////////////////////
//
// Select Tele-Operation Executable Program for FTC Tele-operation Contest Phase
//
// FTC competition programs can be operated in two modes:
// 1. A single user program is used for both autonomous and tele-operated phases of a
// competition.
// 2. Separate programs are used for each of the two phases.
//
// When dual mode is used, the name of the tele-operated phase is stored in a text file.
// The Competition field management system will read this file to obtain the name of the
// program to run for the tele-op phase.
//
// This nifty little utility is used to setup the configuration file.
//
// It also illustrates the use of easily creating programs using standard menus
// with ROBOTC.
//
///////////////////////////////////////////////////////////////////////////////////////////////////
#pragma fileExtension("rtm")
#include "MenusAndIcons.c"
string sTextFileName = "FTCConfig.txt"; // Name of the file containg tele-op name
//
// Global variables to hold a list of all executable files
//
const int kMaxFiles = 25;
int nNumbOfFiles;
string sFileNames[kMaxFiles];
///////////////////////////////////////////////////////////////////////////////////////////////////
//
// Build List of Executable Files
//
///////////////////////////////////////////////////////////////////////////////////////////////////
void buildFileList()
{
TFileHandle hFileHandle;
TFileIOResult nIoResult;
string sFileName;
short nFileSize;
string sFileSearch = "*.rxe"; // Wildcard to search for any executable file
FindFirstFile(hFileHandle, nIoResult, sFileSearch, sFileName, nFileSize);
nNumbOfFiles = 0;
while (nIoResult == ioRsltSuccess)
{
stringDelete(sFileName, strlen(sFileName) - 4, 4); // Trim File Extension
sFileNames[nNumbOfFiles] = sFileName;
++nNumbOfFiles;
FindNextFile(hFileHandle, nIoResult, sFileName, nFileSize);
}
Close(hFileHandle, nIoResult);
return;
}
///////////////////////////////////////////////////////////////////////////////////////////////////
//
// displayCommandProgress
//
///////////////////////////////////////////////////////////////////////////////////////////////////
void deleteTeleOpConfigFile()
{
TFileIOResult nIoResult;
do // Make a loop in case, due to error, there are multiple copies
{
Delete(sTextFileName, nIoResult);
} while (nIoResult == ioRsltSuccess);
}
///////////////////////////////////////////////////////////////////////////////////////////////////
//
// createTeleopConfigFile
//
///////////////////////////////////////////////////////////////////////////////////////////////////
void createTeleopConfigFile(string &sExecutableName)
{
TFileIOResult nIoResult;
TFileHandle hFileHandle;
short nFileSize;
deleteTeleOpConfigFile(); // Erase existing file
// Create the file
nFileSize = strlen(sExecutableName) + 4;
OpenWrite(hFileHandle, nIoResult, sTextFileName, nFileSize);
WriteText(hFileHandle, nIoResult, sExecutableName);
WriteText(hFileHandle, nIoResult, ".rxe");
Close(hFileHandle, nIoResult);
// Display Message
displayTextLine(5, "");
if(nIoResult == ioRsltSuccess)
displayCenteredTextLine(6, "File Created" );
else
displayCenteredTextLine(6, "File Error");
displayTextLine(7, "");
wait1Msec(1250);
return;
}
///////////////////////////////////////////////////////////////////////////////////////////////////
//
// Menu Processing -- Select an Executable File
//
// Presents a menu of the available executable files on the NXT so that the user can select the
// name of the file to run for the tele-op phase of a FTC competition.
//
///////////////////////////////////////////////////////////////////////////////////////////////////
bool doDualModeFileSelection()
{
int nFileIndex;
TMenuAnimationType nDrawType;
nDrawType = menuOverwrite;
nFileIndex = 0;
while (true)
{
switch (nNxtButtonTransition)
{
case kRightButton:
++nFileIndex;
if (nFileIndex >= nNumbOfFiles)
nFileIndex = 0;
nDrawType = menuFromLeft;
break;
case kLeftButton:
--nFileIndex;
if (nFileIndex < 0)
nFileIndex = nNumbOfFiles - 1;
nDrawType = menuFromRight;
break;
case kEnterButton:
createTeleopConfigFile(sFileNames[nFileIndex]);
nDrawType = menuFromBottom;
return true;
case kExitButton:
return false;
default:
break;
}
if (nDrawType != menuRefreshComplete)
{
drawMenu(nDrawType, iconFileTypeExeFiles, iconFileTypeExeFiles, iconFileTypeExeFiles,
sFileNames[nFileIndex], "Pick Teleop File");
nDrawType = menuRefreshComplete;
}
}
}
task main()
{
nNxtButtonTask = -2;
nNxtExitClicks = 4;
buildFileList();
doDualModeFileSelection();
}