Telescope Control Library

Dependents:   PushToGo-F429

Committer:
caoyuan9642
Date:
Sun Aug 19 05:21:20 2018 +0000
Revision:
0:6cb2eaf8b133
Child:
1:a4d5537de7ae
v0.1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
caoyuan9642 0:6cb2eaf8b133 1 /*
caoyuan9642 0:6cb2eaf8b133 2 * EqMountServer.cpp
caoyuan9642 0:6cb2eaf8b133 3 *
caoyuan9642 0:6cb2eaf8b133 4 * Created on: 2018Äê3ÔÂ1ÈÕ
caoyuan9642 0:6cb2eaf8b133 5 * Author: caoyuan9642
caoyuan9642 0:6cb2eaf8b133 6 */
caoyuan9642 0:6cb2eaf8b133 7
caoyuan9642 0:6cb2eaf8b133 8 #include "EqMountServer.h"
caoyuan9642 0:6cb2eaf8b133 9 #include "mbed_events.h"
caoyuan9642 0:6cb2eaf8b133 10 #include <ctype.h>
caoyuan9642 0:6cb2eaf8b133 11
caoyuan9642 0:6cb2eaf8b133 12 #define EMS_DEBUG 0
caoyuan9642 0:6cb2eaf8b133 13
caoyuan9642 0:6cb2eaf8b133 14 extern ServerCommand commandlist[MAX_COMMAND];
caoyuan9642 0:6cb2eaf8b133 15
caoyuan9642 0:6cb2eaf8b133 16 void stprintf(FileHandle &f, const char *fmt, ...)
caoyuan9642 0:6cb2eaf8b133 17 {
caoyuan9642 0:6cb2eaf8b133 18 char buf[1024];
caoyuan9642 0:6cb2eaf8b133 19 va_list args;
caoyuan9642 0:6cb2eaf8b133 20 va_start(args, fmt);
caoyuan9642 0:6cb2eaf8b133 21 int len = vsnprintf(buf, sizeof(buf), fmt, args);
caoyuan9642 0:6cb2eaf8b133 22 va_end(args);
caoyuan9642 0:6cb2eaf8b133 23
caoyuan9642 0:6cb2eaf8b133 24 f.write(buf, len);
caoyuan9642 0:6cb2eaf8b133 25 }
caoyuan9642 0:6cb2eaf8b133 26
caoyuan9642 0:6cb2eaf8b133 27 EqMountServer::EqMountServer(FileHandle &stream, bool echo) :
caoyuan9642 0:6cb2eaf8b133 28 eq_mount(NULL), stream(stream), thread(osPriorityBelowNormal,
caoyuan9642 0:6cb2eaf8b133 29 OS_STACK_SIZE, NULL, "EqMountServer"), echo(echo)
caoyuan9642 0:6cb2eaf8b133 30 {
caoyuan9642 0:6cb2eaf8b133 31 thread.start(callback(this, &EqMountServer::task_thread));
caoyuan9642 0:6cb2eaf8b133 32 }
caoyuan9642 0:6cb2eaf8b133 33
caoyuan9642 0:6cb2eaf8b133 34 EqMountServer::~EqMountServer()
caoyuan9642 0:6cb2eaf8b133 35 {
caoyuan9642 0:6cb2eaf8b133 36 thread.terminate();
caoyuan9642 0:6cb2eaf8b133 37 }
caoyuan9642 0:6cb2eaf8b133 38
caoyuan9642 0:6cb2eaf8b133 39 void EqMountServer::task_thread()
caoyuan9642 0:6cb2eaf8b133 40 {
caoyuan9642 0:6cb2eaf8b133 41 EventQueue queue(16 * EVENTS_EVENT_SIZE);
caoyuan9642 0:6cb2eaf8b133 42 Thread evq_thd(osThreadGetPriority(Thread::gettid()), OS_STACK_SIZE, NULL,
caoyuan9642 0:6cb2eaf8b133 43 "EqMountServer dispatcher");
caoyuan9642 0:6cb2eaf8b133 44 evq_thd.start(callback(&queue, &EventQueue::dispatch_forever));
caoyuan9642 0:6cb2eaf8b133 45
caoyuan9642 0:6cb2eaf8b133 46 while (true)
caoyuan9642 0:6cb2eaf8b133 47 {
caoyuan9642 0:6cb2eaf8b133 48 const int size = 256;
caoyuan9642 0:6cb2eaf8b133 49 char *buffer = new char[size]; // text buffer
caoyuan9642 0:6cb2eaf8b133 50 if (!buffer)
caoyuan9642 0:6cb2eaf8b133 51 {
caoyuan9642 0:6cb2eaf8b133 52 stprintf(stream, "Error: out of memory\r\n");
caoyuan9642 0:6cb2eaf8b133 53 break;
caoyuan9642 0:6cb2eaf8b133 54 }
caoyuan9642 0:6cb2eaf8b133 55 bool eof = false;
caoyuan9642 0:6cb2eaf8b133 56 char x = 0;
caoyuan9642 0:6cb2eaf8b133 57 int i = 0;
caoyuan9642 0:6cb2eaf8b133 58 while (!eof && i < size - 2)
caoyuan9642 0:6cb2eaf8b133 59 {
caoyuan9642 0:6cb2eaf8b133 60 int s = stream.read(&x, 1);
caoyuan9642 0:6cb2eaf8b133 61 if (s <= 0)
caoyuan9642 0:6cb2eaf8b133 62 { // End of file
caoyuan9642 0:6cb2eaf8b133 63 eof = true;
caoyuan9642 0:6cb2eaf8b133 64 break;
caoyuan9642 0:6cb2eaf8b133 65 }
caoyuan9642 0:6cb2eaf8b133 66 else if (x == '\r' || x == '\n')
caoyuan9642 0:6cb2eaf8b133 67 { // End of line
caoyuan9642 0:6cb2eaf8b133 68 break;
caoyuan9642 0:6cb2eaf8b133 69 }
caoyuan9642 0:6cb2eaf8b133 70 else if (x == '\b' || x == '\x7F')
caoyuan9642 0:6cb2eaf8b133 71 { // Backspace
caoyuan9642 0:6cb2eaf8b133 72 if (i > 0)
caoyuan9642 0:6cb2eaf8b133 73 {
caoyuan9642 0:6cb2eaf8b133 74 stprintf(stream, "\b \b"); // blank the current character properly
caoyuan9642 0:6cb2eaf8b133 75 i--;
caoyuan9642 0:6cb2eaf8b133 76 }
caoyuan9642 0:6cb2eaf8b133 77 continue;
caoyuan9642 0:6cb2eaf8b133 78 }
caoyuan9642 0:6cb2eaf8b133 79 else if (isspace(x))
caoyuan9642 0:6cb2eaf8b133 80 { // Convert to white space
caoyuan9642 0:6cb2eaf8b133 81 x = ' ';
caoyuan9642 0:6cb2eaf8b133 82 }
caoyuan9642 0:6cb2eaf8b133 83 else if (!isprint(x))
caoyuan9642 0:6cb2eaf8b133 84 { // Ignore everything else
caoyuan9642 0:6cb2eaf8b133 85 continue;
caoyuan9642 0:6cb2eaf8b133 86 }
caoyuan9642 0:6cb2eaf8b133 87 // Echo
caoyuan9642 0:6cb2eaf8b133 88 if (echo)
caoyuan9642 0:6cb2eaf8b133 89 {
caoyuan9642 0:6cb2eaf8b133 90 stream.write(&x, 1);
caoyuan9642 0:6cb2eaf8b133 91 }
caoyuan9642 0:6cb2eaf8b133 92 buffer[i++] = (char) x;
caoyuan9642 0:6cb2eaf8b133 93 }
caoyuan9642 0:6cb2eaf8b133 94 if (eof && i == 0)
caoyuan9642 0:6cb2eaf8b133 95 {
caoyuan9642 0:6cb2eaf8b133 96 delete[] buffer;
caoyuan9642 0:6cb2eaf8b133 97 break;
caoyuan9642 0:6cb2eaf8b133 98 }
caoyuan9642 0:6cb2eaf8b133 99 if (echo)
caoyuan9642 0:6cb2eaf8b133 100 {
caoyuan9642 0:6cb2eaf8b133 101 // Echo new line character after command
caoyuan9642 0:6cb2eaf8b133 102 stprintf(stream, "\r\n");
caoyuan9642 0:6cb2eaf8b133 103 }
caoyuan9642 0:6cb2eaf8b133 104 if (i == 0)
caoyuan9642 0:6cb2eaf8b133 105 { // Empty command
caoyuan9642 0:6cb2eaf8b133 106 delete[] buffer;
caoyuan9642 0:6cb2eaf8b133 107 continue;
caoyuan9642 0:6cb2eaf8b133 108 }
caoyuan9642 0:6cb2eaf8b133 109 buffer[i] = '\0'; // insert null character
caoyuan9642 0:6cb2eaf8b133 110
caoyuan9642 0:6cb2eaf8b133 111 if (eq_mount == NULL)
caoyuan9642 0:6cb2eaf8b133 112 {
caoyuan9642 0:6cb2eaf8b133 113 stprintf(stream, "Error: EqMount not binded.\r\n");
caoyuan9642 0:6cb2eaf8b133 114 delete[] buffer;
caoyuan9642 0:6cb2eaf8b133 115 continue;
caoyuan9642 0:6cb2eaf8b133 116 }
caoyuan9642 0:6cb2eaf8b133 117
caoyuan9642 0:6cb2eaf8b133 118 char delim[] = " "; // Delimiter, can be any white character in the actual input
caoyuan9642 0:6cb2eaf8b133 119 char *saveptr;
caoyuan9642 0:6cb2eaf8b133 120
caoyuan9642 0:6cb2eaf8b133 121 char * command = strtok_r(buffer, delim, &saveptr); // Get the first token
caoyuan9642 0:6cb2eaf8b133 122
caoyuan9642 0:6cb2eaf8b133 123 if (strlen(command) == 0)
caoyuan9642 0:6cb2eaf8b133 124 { // Empty command
caoyuan9642 0:6cb2eaf8b133 125 delete[] buffer;
caoyuan9642 0:6cb2eaf8b133 126 continue;
caoyuan9642 0:6cb2eaf8b133 127 }
caoyuan9642 0:6cb2eaf8b133 128
caoyuan9642 0:6cb2eaf8b133 129 for (char *p = command; *p; ++p)
caoyuan9642 0:6cb2eaf8b133 130 *p = tolower(*p); // Convert to lowercase
caoyuan9642 0:6cb2eaf8b133 131
caoyuan9642 0:6cb2eaf8b133 132 char **args = new char*[16];
caoyuan9642 0:6cb2eaf8b133 133
caoyuan9642 0:6cb2eaf8b133 134 // Extract parameters
caoyuan9642 0:6cb2eaf8b133 135 i = 0;
caoyuan9642 0:6cb2eaf8b133 136 do
caoyuan9642 0:6cb2eaf8b133 137 {
caoyuan9642 0:6cb2eaf8b133 138 args[i] = strtok_r(NULL, delim, &saveptr);
caoyuan9642 0:6cb2eaf8b133 139 if (args[i] == NULL || ++i == 16)
caoyuan9642 0:6cb2eaf8b133 140 break;
caoyuan9642 0:6cb2eaf8b133 141 } while (true);
caoyuan9642 0:6cb2eaf8b133 142
caoyuan9642 0:6cb2eaf8b133 143 int argn = i;
caoyuan9642 0:6cb2eaf8b133 144
caoyuan9642 0:6cb2eaf8b133 145 debug_if(EMS_DEBUG, "command: |%s| ", command);
caoyuan9642 0:6cb2eaf8b133 146 for (i = 0; i < argn; i++)
caoyuan9642 0:6cb2eaf8b133 147 {
caoyuan9642 0:6cb2eaf8b133 148 debug_if(EMS_DEBUG, "|%s| ", args[i]);
caoyuan9642 0:6cb2eaf8b133 149 for (char *p = args[i]; *p; ++p)
caoyuan9642 0:6cb2eaf8b133 150 *p = tolower(*p); // Convert to lowercase
caoyuan9642 0:6cb2eaf8b133 151 }
caoyuan9642 0:6cb2eaf8b133 152 debug_if(EMS_DEBUG, "\n");
caoyuan9642 0:6cb2eaf8b133 153
caoyuan9642 0:6cb2eaf8b133 154 int cind = -1;
caoyuan9642 0:6cb2eaf8b133 155
caoyuan9642 0:6cb2eaf8b133 156 for (i = 0; i < MAX_COMMAND && commandlist[i].fptr != NULL; i++)
caoyuan9642 0:6cb2eaf8b133 157 {
caoyuan9642 0:6cb2eaf8b133 158 if (strcmp(commandlist[i].cmd, command) == 0)
caoyuan9642 0:6cb2eaf8b133 159 {
caoyuan9642 0:6cb2eaf8b133 160 cind = i;
caoyuan9642 0:6cb2eaf8b133 161 break;
caoyuan9642 0:6cb2eaf8b133 162 }
caoyuan9642 0:6cb2eaf8b133 163 }
caoyuan9642 0:6cb2eaf8b133 164
caoyuan9642 0:6cb2eaf8b133 165 if (cind == -1)
caoyuan9642 0:6cb2eaf8b133 166 {
caoyuan9642 0:6cb2eaf8b133 167 debug_if(EMS_DEBUG, "Error: command %s not found.\n", command);
caoyuan9642 0:6cb2eaf8b133 168 delete[] buffer;
caoyuan9642 0:6cb2eaf8b133 169 delete[] args;
caoyuan9642 0:6cb2eaf8b133 170 continue;
caoyuan9642 0:6cb2eaf8b133 171 }
caoyuan9642 0:6cb2eaf8b133 172
caoyuan9642 0:6cb2eaf8b133 173 // Commands that can return immediately, directly run them
caoyuan9642 0:6cb2eaf8b133 174 if (cind < 8 || strcmp(command, "config") == 0)
caoyuan9642 0:6cb2eaf8b133 175 {
caoyuan9642 0:6cb2eaf8b133 176 int ret = commandlist[cind].fptr(this, command, argn, args);
caoyuan9642 0:6cb2eaf8b133 177 // Send the return status back
caoyuan9642 0:6cb2eaf8b133 178 stprintf(stream, "%d %s\r\n", ret, command);
caoyuan9642 0:6cb2eaf8b133 179 delete[] buffer;
caoyuan9642 0:6cb2eaf8b133 180 delete[] args;
caoyuan9642 0:6cb2eaf8b133 181 continue;
caoyuan9642 0:6cb2eaf8b133 182 }
caoyuan9642 0:6cb2eaf8b133 183
caoyuan9642 0:6cb2eaf8b133 184 // Queue the command
caoyuan9642 0:6cb2eaf8b133 185 Callback<void(ServerCommand&, int, char**, char*)> cb = callback(this,
caoyuan9642 0:6cb2eaf8b133 186 &EqMountServer::command_execute);
caoyuan9642 0:6cb2eaf8b133 187 while (queue.call(cb, commandlist[cind], argn, args, buffer) == 0)
caoyuan9642 0:6cb2eaf8b133 188 { // Use the event dispatching thread to run this
caoyuan9642 0:6cb2eaf8b133 189 debug("Event queue full. Wait...\r\n");
caoyuan9642 0:6cb2eaf8b133 190 Thread::wait(100);
caoyuan9642 0:6cb2eaf8b133 191 }
caoyuan9642 0:6cb2eaf8b133 192
caoyuan9642 0:6cb2eaf8b133 193 // The buffer and argument list will be deleted when the command finishes execution in the event dispatch thread
caoyuan9642 0:6cb2eaf8b133 194 }
caoyuan9642 0:6cb2eaf8b133 195 // If we reach here, it must be end of file
caoyuan9642 0:6cb2eaf8b133 196 }
caoyuan9642 0:6cb2eaf8b133 197
caoyuan9642 0:6cb2eaf8b133 198 void EqMountServer::command_execute(ServerCommand &cmd, int argn, char *args[],
caoyuan9642 0:6cb2eaf8b133 199 char *buffer)
caoyuan9642 0:6cb2eaf8b133 200 {
caoyuan9642 0:6cb2eaf8b133 201 int ret = cmd.fptr(this, cmd.cmd, argn, args);
caoyuan9642 0:6cb2eaf8b133 202
caoyuan9642 0:6cb2eaf8b133 203 if (ret == ERR_WRONG_NUM_PARAM)
caoyuan9642 0:6cb2eaf8b133 204 {
caoyuan9642 0:6cb2eaf8b133 205 // Wrong number of arguments
caoyuan9642 0:6cb2eaf8b133 206 debug_if(EMS_DEBUG, "Error: %s wrong number of args.\n", cmd.cmd);
caoyuan9642 0:6cb2eaf8b133 207 }
caoyuan9642 0:6cb2eaf8b133 208 else if (ret == 2)
caoyuan9642 0:6cb2eaf8b133 209 {
caoyuan9642 0:6cb2eaf8b133 210 // Wrong number of arguments
caoyuan9642 0:6cb2eaf8b133 211 debug_if(EMS_DEBUG, "Error: %s parameters out of range.\n", cmd.cmd);
caoyuan9642 0:6cb2eaf8b133 212 }
caoyuan9642 0:6cb2eaf8b133 213 else if (ret)
caoyuan9642 0:6cb2eaf8b133 214 {
caoyuan9642 0:6cb2eaf8b133 215 debug_if(EMS_DEBUG, "Error: %s returned code %d.\n", cmd.cmd, ret);
caoyuan9642 0:6cb2eaf8b133 216 }
caoyuan9642 0:6cb2eaf8b133 217
caoyuan9642 0:6cb2eaf8b133 218 // Send the return status back
caoyuan9642 0:6cb2eaf8b133 219 stprintf(stream, "%d %s\r\n", ret, cmd.cmd);
caoyuan9642 0:6cb2eaf8b133 220
caoyuan9642 0:6cb2eaf8b133 221 delete[] buffer;
caoyuan9642 0:6cb2eaf8b133 222 delete[] args;
caoyuan9642 0:6cb2eaf8b133 223 }
caoyuan9642 0:6cb2eaf8b133 224
caoyuan9642 0:6cb2eaf8b133 225 static int eqmount_stop(EqMountServer *server, const char *cmd, int argn,
caoyuan9642 0:6cb2eaf8b133 226 char *argv[])
caoyuan9642 0:6cb2eaf8b133 227 {
caoyuan9642 0:6cb2eaf8b133 228 if (argn == 0)
caoyuan9642 0:6cb2eaf8b133 229 {
caoyuan9642 0:6cb2eaf8b133 230 server->getEqMount()->stopAsync();
caoyuan9642 0:6cb2eaf8b133 231 }
caoyuan9642 0:6cb2eaf8b133 232 else if (argn == 1 && strcmp(argv[0], "track") == 0)
caoyuan9642 0:6cb2eaf8b133 233 {
caoyuan9642 0:6cb2eaf8b133 234 server->getEqMount()->stopTracking();
caoyuan9642 0:6cb2eaf8b133 235 }
caoyuan9642 0:6cb2eaf8b133 236 else
caoyuan9642 0:6cb2eaf8b133 237 {
caoyuan9642 0:6cb2eaf8b133 238 return ERR_WRONG_NUM_PARAM;
caoyuan9642 0:6cb2eaf8b133 239 }
caoyuan9642 0:6cb2eaf8b133 240 return 0;
caoyuan9642 0:6cb2eaf8b133 241 }
caoyuan9642 0:6cb2eaf8b133 242
caoyuan9642 0:6cb2eaf8b133 243 static int eqmount_estop(EqMountServer *server, const char *cmd, int argn,
caoyuan9642 0:6cb2eaf8b133 244 char *argv[])
caoyuan9642 0:6cb2eaf8b133 245 {
caoyuan9642 0:6cb2eaf8b133 246 server->getEqMount()->emergencyStop();
caoyuan9642 0:6cb2eaf8b133 247 return 0;
caoyuan9642 0:6cb2eaf8b133 248 }
caoyuan9642 0:6cb2eaf8b133 249
caoyuan9642 0:6cb2eaf8b133 250 static int eqmount_goto(EqMountServer *server, const char *cmd, int argn,
caoyuan9642 0:6cb2eaf8b133 251 char *argv[])
caoyuan9642 0:6cb2eaf8b133 252 {
caoyuan9642 0:6cb2eaf8b133 253 if (argn == 1)
caoyuan9642 0:6cb2eaf8b133 254 {
caoyuan9642 0:6cb2eaf8b133 255 if (strcmp(argv[0], "index") == 0)
caoyuan9642 0:6cb2eaf8b133 256 {
caoyuan9642 0:6cb2eaf8b133 257 return server->getEqMount()->goToIndex();
caoyuan9642 0:6cb2eaf8b133 258 }
caoyuan9642 0:6cb2eaf8b133 259 }
caoyuan9642 0:6cb2eaf8b133 260 else if (argn == 2 || (argn == 3 && strcmp(argv[0], "eq") == 0))
caoyuan9642 0:6cb2eaf8b133 261 {
caoyuan9642 0:6cb2eaf8b133 262 if (argn == 3 && strcmp(argv[0], "eq") == 0)
caoyuan9642 0:6cb2eaf8b133 263 {
caoyuan9642 0:6cb2eaf8b133 264 argv[0] = argv[1];
caoyuan9642 0:6cb2eaf8b133 265 argv[1] = argv[2];
caoyuan9642 0:6cb2eaf8b133 266 }
caoyuan9642 0:6cb2eaf8b133 267 char *tp;
caoyuan9642 0:6cb2eaf8b133 268 // First try HMS format
caoyuan9642 0:6cb2eaf8b133 269 double ra = CelestialMath::parseHMSAngle(argv[0]);
caoyuan9642 0:6cb2eaf8b133 270 if (isnan(ra))
caoyuan9642 0:6cb2eaf8b133 271 {
caoyuan9642 0:6cb2eaf8b133 272 // If doesn't work, then we use as a double
caoyuan9642 0:6cb2eaf8b133 273 ra = strtod(argv[0], &tp);
caoyuan9642 0:6cb2eaf8b133 274 if (tp == argv[0])
caoyuan9642 0:6cb2eaf8b133 275 {
caoyuan9642 0:6cb2eaf8b133 276 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 277 }
caoyuan9642 0:6cb2eaf8b133 278 }
caoyuan9642 0:6cb2eaf8b133 279 // First try DMS format
caoyuan9642 0:6cb2eaf8b133 280 double dec = CelestialMath::parseDMSAngle(argv[1]);
caoyuan9642 0:6cb2eaf8b133 281 if (isnan(dec))
caoyuan9642 0:6cb2eaf8b133 282 {
caoyuan9642 0:6cb2eaf8b133 283 // If doesn't work, then we use as a double
caoyuan9642 0:6cb2eaf8b133 284 dec = strtod(argv[1], &tp);
caoyuan9642 0:6cb2eaf8b133 285 if (tp == argv[1])
caoyuan9642 0:6cb2eaf8b133 286 {
caoyuan9642 0:6cb2eaf8b133 287 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 288 }
caoyuan9642 0:6cb2eaf8b133 289 }
caoyuan9642 0:6cb2eaf8b133 290
caoyuan9642 0:6cb2eaf8b133 291 if (!((ra <= 180.0) && (ra >= -180.0) && (dec <= 90.0) && (dec >= -90.0)))
caoyuan9642 0:6cb2eaf8b133 292 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 293
caoyuan9642 0:6cb2eaf8b133 294 osStatus s;
caoyuan9642 0:6cb2eaf8b133 295 if ((s = server->getEqMount()->goTo(ra, dec)) != osOK)
caoyuan9642 0:6cb2eaf8b133 296 return s;
caoyuan9642 0:6cb2eaf8b133 297 }
caoyuan9642 0:6cb2eaf8b133 298 else if (argn == 3)
caoyuan9642 0:6cb2eaf8b133 299 {
caoyuan9642 0:6cb2eaf8b133 300 if (strcmp(argv[0], "mount") == 0)
caoyuan9642 0:6cb2eaf8b133 301 {
caoyuan9642 0:6cb2eaf8b133 302 char *tp;
caoyuan9642 0:6cb2eaf8b133 303 double ra = strtod(argv[1], &tp);
caoyuan9642 0:6cb2eaf8b133 304 if (tp == argv[1])
caoyuan9642 0:6cb2eaf8b133 305 {
caoyuan9642 0:6cb2eaf8b133 306 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 307 }
caoyuan9642 0:6cb2eaf8b133 308 double dec = strtod(argv[2], &tp);
caoyuan9642 0:6cb2eaf8b133 309 if (tp == argv[2])
caoyuan9642 0:6cb2eaf8b133 310 {
caoyuan9642 0:6cb2eaf8b133 311 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 312 }
caoyuan9642 0:6cb2eaf8b133 313
caoyuan9642 0:6cb2eaf8b133 314 if (!((ra <= 180.0) && (ra >= -180.0) && (dec <= 180.0)
caoyuan9642 0:6cb2eaf8b133 315 && (dec >= -180.0)))
caoyuan9642 0:6cb2eaf8b133 316 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 317
caoyuan9642 0:6cb2eaf8b133 318 osStatus s;
caoyuan9642 0:6cb2eaf8b133 319 if ((s = server->getEqMount()->goToMount(MountCoordinates(dec, ra)))
caoyuan9642 0:6cb2eaf8b133 320 != osOK)
caoyuan9642 0:6cb2eaf8b133 321 return s;
caoyuan9642 0:6cb2eaf8b133 322 }
caoyuan9642 0:6cb2eaf8b133 323 }
caoyuan9642 0:6cb2eaf8b133 324 else
caoyuan9642 0:6cb2eaf8b133 325 {
caoyuan9642 0:6cb2eaf8b133 326 return ERR_WRONG_NUM_PARAM;
caoyuan9642 0:6cb2eaf8b133 327 }
caoyuan9642 0:6cb2eaf8b133 328
caoyuan9642 0:6cb2eaf8b133 329 return 0;
caoyuan9642 0:6cb2eaf8b133 330 }
caoyuan9642 0:6cb2eaf8b133 331
caoyuan9642 0:6cb2eaf8b133 332 static int eqmount_speed(EqMountServer *server, const char *cmd, int argn,
caoyuan9642 0:6cb2eaf8b133 333 char *argv[])
caoyuan9642 0:6cb2eaf8b133 334 {
caoyuan9642 0:6cb2eaf8b133 335 if (argn == 1)
caoyuan9642 0:6cb2eaf8b133 336 {
caoyuan9642 0:6cb2eaf8b133 337 // Print speed
caoyuan9642 0:6cb2eaf8b133 338 double speed = 0;
caoyuan9642 0:6cb2eaf8b133 339 if (strcmp(argv[0], "slew") == 0)
caoyuan9642 0:6cb2eaf8b133 340 {
caoyuan9642 0:6cb2eaf8b133 341 speed = server->getEqMount()->getSlewSpeed();
caoyuan9642 0:6cb2eaf8b133 342 }
caoyuan9642 0:6cb2eaf8b133 343 else if (strcmp(argv[0], "track") == 0)
caoyuan9642 0:6cb2eaf8b133 344 {
caoyuan9642 0:6cb2eaf8b133 345 speed = server->getEqMount()->getTrackSpeedSidereal();
caoyuan9642 0:6cb2eaf8b133 346 }
caoyuan9642 0:6cb2eaf8b133 347 else if (strcmp(argv[0], "guide") == 0)
caoyuan9642 0:6cb2eaf8b133 348 {
caoyuan9642 0:6cb2eaf8b133 349 speed = server->getEqMount()->getGuideSpeedSidereal();
caoyuan9642 0:6cb2eaf8b133 350 }
caoyuan9642 0:6cb2eaf8b133 351 else
caoyuan9642 0:6cb2eaf8b133 352 {
caoyuan9642 0:6cb2eaf8b133 353 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 354 }
caoyuan9642 0:6cb2eaf8b133 355 stprintf(server->getStream(), "%s %f\r\n", cmd, speed);
caoyuan9642 0:6cb2eaf8b133 356 }
caoyuan9642 0:6cb2eaf8b133 357 else if (argn == 2)
caoyuan9642 0:6cb2eaf8b133 358 {
caoyuan9642 0:6cb2eaf8b133 359 char *tp;
caoyuan9642 0:6cb2eaf8b133 360 double speed = strtod(argv[1], &tp);
caoyuan9642 0:6cb2eaf8b133 361 if (tp == argv[1])
caoyuan9642 0:6cb2eaf8b133 362 {
caoyuan9642 0:6cb2eaf8b133 363 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 364 }
caoyuan9642 0:6cb2eaf8b133 365 if (strcmp(argv[0], "slew") == 0)
caoyuan9642 0:6cb2eaf8b133 366 {
caoyuan9642 0:6cb2eaf8b133 367 if (speed <= 0
caoyuan9642 0:6cb2eaf8b133 368 || speed > TelescopeConfiguration::getDouble("max_speed"))
caoyuan9642 0:6cb2eaf8b133 369 {
caoyuan9642 0:6cb2eaf8b133 370 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 371 }
caoyuan9642 0:6cb2eaf8b133 372 server->getEqMount()->setSlewSpeed(speed);
caoyuan9642 0:6cb2eaf8b133 373 }
caoyuan9642 0:6cb2eaf8b133 374 else if (strcmp(argv[0], "track") == 0)
caoyuan9642 0:6cb2eaf8b133 375 {
caoyuan9642 0:6cb2eaf8b133 376 if (speed <= 0 || speed > 64)
caoyuan9642 0:6cb2eaf8b133 377 {
caoyuan9642 0:6cb2eaf8b133 378 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 379 }
caoyuan9642 0:6cb2eaf8b133 380 server->getEqMount()->setTrackSpeedSidereal(speed);
caoyuan9642 0:6cb2eaf8b133 381 }
caoyuan9642 0:6cb2eaf8b133 382 else if (strcmp(argv[0], "guide") == 0)
caoyuan9642 0:6cb2eaf8b133 383 {
caoyuan9642 0:6cb2eaf8b133 384 if (speed <= 0 || speed > 64)
caoyuan9642 0:6cb2eaf8b133 385 {
caoyuan9642 0:6cb2eaf8b133 386 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 387 }
caoyuan9642 0:6cb2eaf8b133 388 server->getEqMount()->setGuideSpeedSidereal(speed);
caoyuan9642 0:6cb2eaf8b133 389 }
caoyuan9642 0:6cb2eaf8b133 390 }
caoyuan9642 0:6cb2eaf8b133 391 else
caoyuan9642 0:6cb2eaf8b133 392 {
caoyuan9642 0:6cb2eaf8b133 393 return ERR_WRONG_NUM_PARAM;
caoyuan9642 0:6cb2eaf8b133 394 }
caoyuan9642 0:6cb2eaf8b133 395
caoyuan9642 0:6cb2eaf8b133 396 return 0;
caoyuan9642 0:6cb2eaf8b133 397 }
caoyuan9642 0:6cb2eaf8b133 398
caoyuan9642 0:6cb2eaf8b133 399 static int eqmount_align(EqMountServer *server, const char *cmd, int argn,
caoyuan9642 0:6cb2eaf8b133 400 char *argv[])
caoyuan9642 0:6cb2eaf8b133 401 {
caoyuan9642 0:6cb2eaf8b133 402 if (argn == 0)
caoyuan9642 0:6cb2eaf8b133 403 {
caoyuan9642 0:6cb2eaf8b133 404 stprintf(server->getStream(),
caoyuan9642 0:6cb2eaf8b133 405 "%s usage: align add [star]\nalign replace [n] [star]\nalign delete [n]\nalign show\nalign show [n]\n\nalign clear\n",
caoyuan9642 0:6cb2eaf8b133 406 cmd);
caoyuan9642 0:6cb2eaf8b133 407 return ERR_WRONG_NUM_PARAM;
caoyuan9642 0:6cb2eaf8b133 408 }
caoyuan9642 0:6cb2eaf8b133 409 if (strcmp(argv[0], "add") == 0)
caoyuan9642 0:6cb2eaf8b133 410 {
caoyuan9642 0:6cb2eaf8b133 411 AlignmentStar as;
caoyuan9642 0:6cb2eaf8b133 412 if (argn != 3 && argn != 5)
caoyuan9642 0:6cb2eaf8b133 413 {
caoyuan9642 0:6cb2eaf8b133 414 stprintf(server->getStream(),
caoyuan9642 0:6cb2eaf8b133 415 "%s usage: align add {ref_ra} {ref_dec}\n%s usage: align add {ref_ra} {ref_dec} {meas_ra} {meas_dec}\n",
caoyuan9642 0:6cb2eaf8b133 416 cmd, cmd);
caoyuan9642 0:6cb2eaf8b133 417 return ERR_WRONG_NUM_PARAM;
caoyuan9642 0:6cb2eaf8b133 418 }
caoyuan9642 0:6cb2eaf8b133 419 char *tp;
caoyuan9642 0:6cb2eaf8b133 420 double ref_ra = strtod(argv[1], &tp);
caoyuan9642 0:6cb2eaf8b133 421 if (tp == argv[1])
caoyuan9642 0:6cb2eaf8b133 422 {
caoyuan9642 0:6cb2eaf8b133 423 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 424 }
caoyuan9642 0:6cb2eaf8b133 425 double ref_dec = strtod(argv[2], &tp);
caoyuan9642 0:6cb2eaf8b133 426 if (tp == argv[2])
caoyuan9642 0:6cb2eaf8b133 427 {
caoyuan9642 0:6cb2eaf8b133 428 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 429 }
caoyuan9642 0:6cb2eaf8b133 430 as.star_ref = EquatorialCoordinates(ref_dec, ref_ra);
caoyuan9642 0:6cb2eaf8b133 431 if (argn == 5)
caoyuan9642 0:6cb2eaf8b133 432 {
caoyuan9642 0:6cb2eaf8b133 433 double meas_ra = strtod(argv[3], &tp);
caoyuan9642 0:6cb2eaf8b133 434 if (tp == argv[3])
caoyuan9642 0:6cb2eaf8b133 435 {
caoyuan9642 0:6cb2eaf8b133 436 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 437 }
caoyuan9642 0:6cb2eaf8b133 438 double meas_dec = strtod(argv[4], &tp);
caoyuan9642 0:6cb2eaf8b133 439 if (tp == argv[4])
caoyuan9642 0:6cb2eaf8b133 440 {
caoyuan9642 0:6cb2eaf8b133 441 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 442 }
caoyuan9642 0:6cb2eaf8b133 443 as.star_meas = MountCoordinates(meas_dec, meas_ra);
caoyuan9642 0:6cb2eaf8b133 444 }
caoyuan9642 0:6cb2eaf8b133 445 else
caoyuan9642 0:6cb2eaf8b133 446 as.star_meas = server->getEqMount()->getMountCoordinates();
caoyuan9642 0:6cb2eaf8b133 447 as.timestamp = server->getEqMount()->getClock().getTime();
caoyuan9642 0:6cb2eaf8b133 448 return server->getEqMount()->addAlignmentStar(as);
caoyuan9642 0:6cb2eaf8b133 449 }
caoyuan9642 0:6cb2eaf8b133 450 else if (strcmp(argv[0], "replace") == 0)
caoyuan9642 0:6cb2eaf8b133 451 {
caoyuan9642 0:6cb2eaf8b133 452 AlignmentStar as;
caoyuan9642 0:6cb2eaf8b133 453 if (argn != 4 && argn != 6)
caoyuan9642 0:6cb2eaf8b133 454 {
caoyuan9642 0:6cb2eaf8b133 455 stprintf(server->getStream(),
caoyuan9642 0:6cb2eaf8b133 456 "%s usage: align replace [index] {ref_ra} {ref_dec}\n%s usage: align replace [index] {ref_ra} {ref_dec} {meas_ra} {meas_dec}\n",
caoyuan9642 0:6cb2eaf8b133 457 cmd, cmd);
caoyuan9642 0:6cb2eaf8b133 458 return ERR_WRONG_NUM_PARAM;
caoyuan9642 0:6cb2eaf8b133 459 }
caoyuan9642 0:6cb2eaf8b133 460 char *tp;
caoyuan9642 0:6cb2eaf8b133 461
caoyuan9642 0:6cb2eaf8b133 462 int index = strtol(argv[1], &tp, 10);
caoyuan9642 0:6cb2eaf8b133 463 if (tp == argv[1])
caoyuan9642 0:6cb2eaf8b133 464 {
caoyuan9642 0:6cb2eaf8b133 465 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 466 }
caoyuan9642 0:6cb2eaf8b133 467
caoyuan9642 0:6cb2eaf8b133 468 double ref_ra = strtod(argv[2], &tp);
caoyuan9642 0:6cb2eaf8b133 469 if (tp == argv[2])
caoyuan9642 0:6cb2eaf8b133 470 {
caoyuan9642 0:6cb2eaf8b133 471 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 472 }
caoyuan9642 0:6cb2eaf8b133 473 double ref_dec = strtod(argv[3], &tp);
caoyuan9642 0:6cb2eaf8b133 474 if (tp == argv[3])
caoyuan9642 0:6cb2eaf8b133 475 {
caoyuan9642 0:6cb2eaf8b133 476 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 477 }
caoyuan9642 0:6cb2eaf8b133 478 as.star_ref = EquatorialCoordinates(ref_dec, ref_ra);
caoyuan9642 0:6cb2eaf8b133 479 if (argn == 6)
caoyuan9642 0:6cb2eaf8b133 480 {
caoyuan9642 0:6cb2eaf8b133 481 double meas_ra = strtod(argv[4], &tp);
caoyuan9642 0:6cb2eaf8b133 482 if (tp == argv[4])
caoyuan9642 0:6cb2eaf8b133 483 {
caoyuan9642 0:6cb2eaf8b133 484 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 485 }
caoyuan9642 0:6cb2eaf8b133 486 double meas_dec = strtod(argv[5], &tp);
caoyuan9642 0:6cb2eaf8b133 487 if (tp == argv[5])
caoyuan9642 0:6cb2eaf8b133 488 {
caoyuan9642 0:6cb2eaf8b133 489 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 490 }
caoyuan9642 0:6cb2eaf8b133 491 as.star_meas = MountCoordinates(meas_dec, meas_ra);
caoyuan9642 0:6cb2eaf8b133 492 }
caoyuan9642 0:6cb2eaf8b133 493 else
caoyuan9642 0:6cb2eaf8b133 494 as.star_meas = server->getEqMount()->getMountCoordinates();
caoyuan9642 0:6cb2eaf8b133 495 as.timestamp = server->getEqMount()->getClock().getTime();
caoyuan9642 0:6cb2eaf8b133 496 return server->getEqMount()->replaceAlignmentStar(index, as);
caoyuan9642 0:6cb2eaf8b133 497 }
caoyuan9642 0:6cb2eaf8b133 498 else if (strcmp(argv[0], "delete") == 0)
caoyuan9642 0:6cb2eaf8b133 499 {
caoyuan9642 0:6cb2eaf8b133 500 char *tp;
caoyuan9642 0:6cb2eaf8b133 501 int n = strtol(argv[1], &tp, 10);
caoyuan9642 0:6cb2eaf8b133 502 if (tp == argv[1] || n >= server->getEqMount()->getNumAlignmentStar()
caoyuan9642 0:6cb2eaf8b133 503 || n < 0)
caoyuan9642 0:6cb2eaf8b133 504 {
caoyuan9642 0:6cb2eaf8b133 505 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 506 }
caoyuan9642 0:6cb2eaf8b133 507 if (server->getEqMount()->getNumAlignmentStar() > 1)
caoyuan9642 0:6cb2eaf8b133 508 return server->getEqMount()->removeAlignmentStar(n);
caoyuan9642 0:6cb2eaf8b133 509 else
caoyuan9642 0:6cb2eaf8b133 510 server->getEqMount()->clearCalibration();
caoyuan9642 0:6cb2eaf8b133 511 }
caoyuan9642 0:6cb2eaf8b133 512 else if (strcmp(argv[0], "show") == 0)
caoyuan9642 0:6cb2eaf8b133 513 {
caoyuan9642 0:6cb2eaf8b133 514 if (argn == 1)
caoyuan9642 0:6cb2eaf8b133 515 {
caoyuan9642 0:6cb2eaf8b133 516 // Show all alignment stars
caoyuan9642 0:6cb2eaf8b133 517 // int N = server->getEqMount()->getNumAlignmentStar();
caoyuan9642 0:6cb2eaf8b133 518 // for (int i = 0; i < N; i++)
caoyuan9642 0:6cb2eaf8b133 519 // {
caoyuan9642 0:6cb2eaf8b133 520 // AlignmentStar *as = server->getEqMount()->getAlignmentStar(i);
caoyuan9642 0:6cb2eaf8b133 521 // stprintf(server->getStream(), "%s %d %.8f %.8f %.8f %.8f %d\n",
caoyuan9642 0:6cb2eaf8b133 522 // cmd, i, as->star_ref.ra, as->star_ref.dec,
caoyuan9642 0:6cb2eaf8b133 523 // as->star_meas.ra_delta, as->star_meas.dec_delta,
caoyuan9642 0:6cb2eaf8b133 524 // as->timestamp);
caoyuan9642 0:6cb2eaf8b133 525 // }
caoyuan9642 0:6cb2eaf8b133 526 stprintf(server->getStream(), "%s offset %.8f %.8f\n", cmd,
caoyuan9642 0:6cb2eaf8b133 527 server->getEqMount()->getCalibration().offset.ra_off,
caoyuan9642 0:6cb2eaf8b133 528 server->getEqMount()->getCalibration().offset.dec_off);
caoyuan9642 0:6cb2eaf8b133 529 stprintf(server->getStream(), "%s pa %.8f %.8f\n", cmd,
caoyuan9642 0:6cb2eaf8b133 530 server->getEqMount()->getCalibration().pa.alt,
caoyuan9642 0:6cb2eaf8b133 531 server->getEqMount()->getCalibration().pa.azi);
caoyuan9642 0:6cb2eaf8b133 532 stprintf(server->getStream(), "%s cone %.8f\n", cmd,
caoyuan9642 0:6cb2eaf8b133 533 server->getEqMount()->getCalibration().cone);
caoyuan9642 0:6cb2eaf8b133 534 stprintf(server->getStream(), "%s error %g\n", cmd,
caoyuan9642 0:6cb2eaf8b133 535 server->getEqMount()->getCalibration().error);
caoyuan9642 0:6cb2eaf8b133 536 }
caoyuan9642 0:6cb2eaf8b133 537 else if (argn == 2)
caoyuan9642 0:6cb2eaf8b133 538 {
caoyuan9642 0:6cb2eaf8b133 539 if (strcmp(argv[1], "num") == 0)
caoyuan9642 0:6cb2eaf8b133 540 {
caoyuan9642 0:6cb2eaf8b133 541 stprintf(server->getStream(), "%s %d\n", cmd,
caoyuan9642 0:6cb2eaf8b133 542 server->getEqMount()->getNumAlignmentStar());
caoyuan9642 0:6cb2eaf8b133 543 }
caoyuan9642 0:6cb2eaf8b133 544 else
caoyuan9642 0:6cb2eaf8b133 545 {
caoyuan9642 0:6cb2eaf8b133 546 char *tp;
caoyuan9642 0:6cb2eaf8b133 547 int index = strtol(argv[1], &tp, 0);
caoyuan9642 0:6cb2eaf8b133 548 if (tp == argv[1]
caoyuan9642 0:6cb2eaf8b133 549 || index >= server->getEqMount()->getNumAlignmentStar()
caoyuan9642 0:6cb2eaf8b133 550 || index < 0)
caoyuan9642 0:6cb2eaf8b133 551 {
caoyuan9642 0:6cb2eaf8b133 552 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 553 }
caoyuan9642 0:6cb2eaf8b133 554 AlignmentStar *as = server->getEqMount()->getAlignmentStar(
caoyuan9642 0:6cb2eaf8b133 555 index);
caoyuan9642 0:6cb2eaf8b133 556 if (!as)
caoyuan9642 0:6cb2eaf8b133 557 {
caoyuan9642 0:6cb2eaf8b133 558 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 559 }
caoyuan9642 0:6cb2eaf8b133 560 stprintf(server->getStream(), "%s %.8f %.8f %.8f %.8f %d\n",
caoyuan9642 0:6cb2eaf8b133 561 cmd, as->star_ref.ra, as->star_ref.dec,
caoyuan9642 0:6cb2eaf8b133 562 as->star_meas.ra_delta, as->star_meas.dec_delta,
caoyuan9642 0:6cb2eaf8b133 563 as->timestamp);
caoyuan9642 0:6cb2eaf8b133 564 }
caoyuan9642 0:6cb2eaf8b133 565 }
caoyuan9642 0:6cb2eaf8b133 566 else
caoyuan9642 0:6cb2eaf8b133 567 {
caoyuan9642 0:6cb2eaf8b133 568 return ERR_WRONG_NUM_PARAM;
caoyuan9642 0:6cb2eaf8b133 569 }
caoyuan9642 0:6cb2eaf8b133 570 }
caoyuan9642 0:6cb2eaf8b133 571 else if (strcmp(argv[0], "clear") == 0)
caoyuan9642 0:6cb2eaf8b133 572 {
caoyuan9642 0:6cb2eaf8b133 573 if (argn != 1)
caoyuan9642 0:6cb2eaf8b133 574 {
caoyuan9642 0:6cb2eaf8b133 575 return ERR_WRONG_NUM_PARAM;
caoyuan9642 0:6cb2eaf8b133 576 }
caoyuan9642 0:6cb2eaf8b133 577 server->getEqMount()->clearCalibration();
caoyuan9642 0:6cb2eaf8b133 578 }
caoyuan9642 0:6cb2eaf8b133 579 else if (strcmp(argv[0], "convert") == 0)
caoyuan9642 0:6cb2eaf8b133 580 {
caoyuan9642 0:6cb2eaf8b133 581 if (argn != 4)
caoyuan9642 0:6cb2eaf8b133 582 {
caoyuan9642 0:6cb2eaf8b133 583 return ERR_WRONG_NUM_PARAM;
caoyuan9642 0:6cb2eaf8b133 584 }
caoyuan9642 0:6cb2eaf8b133 585 char *tp;
caoyuan9642 0:6cb2eaf8b133 586 double ra = strtod(argv[2], &tp);
caoyuan9642 0:6cb2eaf8b133 587 if (tp == argv[2])
caoyuan9642 0:6cb2eaf8b133 588 {
caoyuan9642 0:6cb2eaf8b133 589 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 590 }
caoyuan9642 0:6cb2eaf8b133 591 double dec = strtod(argv[3], &tp);
caoyuan9642 0:6cb2eaf8b133 592 if (tp == argv[3])
caoyuan9642 0:6cb2eaf8b133 593 {
caoyuan9642 0:6cb2eaf8b133 594 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 595 }
caoyuan9642 0:6cb2eaf8b133 596 if (strcmp(argv[1], "mount") == 0)
caoyuan9642 0:6cb2eaf8b133 597 {
caoyuan9642 0:6cb2eaf8b133 598 // Convert to eq
caoyuan9642 0:6cb2eaf8b133 599 EquatorialCoordinates eq =
caoyuan9642 0:6cb2eaf8b133 600 server->getEqMount()->convertToEqCoordinates(
caoyuan9642 0:6cb2eaf8b133 601 MountCoordinates(dec, ra));
caoyuan9642 0:6cb2eaf8b133 602 stprintf(server->getStream(), "%s %.8f %.8f\n", cmd, eq.ra, eq.dec);
caoyuan9642 0:6cb2eaf8b133 603 }
caoyuan9642 0:6cb2eaf8b133 604 else if (strcmp(argv[1], "eq") == 0)
caoyuan9642 0:6cb2eaf8b133 605 {
caoyuan9642 0:6cb2eaf8b133 606 // Convert to eq
caoyuan9642 0:6cb2eaf8b133 607 MountCoordinates mc =
caoyuan9642 0:6cb2eaf8b133 608 server->getEqMount()->convertToMountCoordinates(
caoyuan9642 0:6cb2eaf8b133 609 EquatorialCoordinates(dec, ra));
caoyuan9642 0:6cb2eaf8b133 610 stprintf(server->getStream(), "%s %.8f %.8f\n", cmd, mc.ra_delta,
caoyuan9642 0:6cb2eaf8b133 611 mc.dec_delta);
caoyuan9642 0:6cb2eaf8b133 612 }
caoyuan9642 0:6cb2eaf8b133 613 else
caoyuan9642 0:6cb2eaf8b133 614 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 615 }
caoyuan9642 0:6cb2eaf8b133 616 else
caoyuan9642 0:6cb2eaf8b133 617 {
caoyuan9642 0:6cb2eaf8b133 618 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 619 }
caoyuan9642 0:6cb2eaf8b133 620 return 0;
caoyuan9642 0:6cb2eaf8b133 621 }
caoyuan9642 0:6cb2eaf8b133 622
caoyuan9642 0:6cb2eaf8b133 623 static int eqmount_nudge(EqMountServer *server, const char *cmd, int argn,
caoyuan9642 0:6cb2eaf8b133 624 char *argv[])
caoyuan9642 0:6cb2eaf8b133 625 {
caoyuan9642 0:6cb2eaf8b133 626 if (argn != 1 && argn != 2)
caoyuan9642 0:6cb2eaf8b133 627 {
caoyuan9642 0:6cb2eaf8b133 628 return ERR_WRONG_NUM_PARAM;
caoyuan9642 0:6cb2eaf8b133 629 }
caoyuan9642 0:6cb2eaf8b133 630 int dir = 0;
caoyuan9642 0:6cb2eaf8b133 631 for (int i = 0; i < argn; i++)
caoyuan9642 0:6cb2eaf8b133 632 {
caoyuan9642 0:6cb2eaf8b133 633 if (strcmp(argv[i], "south") == 0)
caoyuan9642 0:6cb2eaf8b133 634 dir |= NUDGE_SOUTH;
caoyuan9642 0:6cb2eaf8b133 635 else if (strcmp(argv[i], "north") == 0)
caoyuan9642 0:6cb2eaf8b133 636 dir |= NUDGE_NORTH;
caoyuan9642 0:6cb2eaf8b133 637 else if (strcmp(argv[i], "east") == 0)
caoyuan9642 0:6cb2eaf8b133 638 dir |= NUDGE_EAST;
caoyuan9642 0:6cb2eaf8b133 639 else if (strcmp(argv[i], "west") == 0)
caoyuan9642 0:6cb2eaf8b133 640 dir |= NUDGE_WEST;
caoyuan9642 0:6cb2eaf8b133 641 else if (strcmp(argv[i], "stop") == 0)
caoyuan9642 0:6cb2eaf8b133 642 {
caoyuan9642 0:6cb2eaf8b133 643 // STOP nudging
caoyuan9642 0:6cb2eaf8b133 644 dir = NUDGE_NONE;
caoyuan9642 0:6cb2eaf8b133 645 break;
caoyuan9642 0:6cb2eaf8b133 646 }
caoyuan9642 0:6cb2eaf8b133 647 else
caoyuan9642 0:6cb2eaf8b133 648 {
caoyuan9642 0:6cb2eaf8b133 649 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 650 }
caoyuan9642 0:6cb2eaf8b133 651 }
caoyuan9642 0:6cb2eaf8b133 652
caoyuan9642 0:6cb2eaf8b133 653 osStatus s;
caoyuan9642 0:6cb2eaf8b133 654 if ((s = server->getEqMount()->startNudge((nudgedir_t) dir)) != osOK)
caoyuan9642 0:6cb2eaf8b133 655 return s;
caoyuan9642 0:6cb2eaf8b133 656
caoyuan9642 0:6cb2eaf8b133 657 return 0;
caoyuan9642 0:6cb2eaf8b133 658 }
caoyuan9642 0:6cb2eaf8b133 659
caoyuan9642 0:6cb2eaf8b133 660 static int eqmount_track(EqMountServer *server, const char *cmd, int argn,
caoyuan9642 0:6cb2eaf8b133 661 char *argv[])
caoyuan9642 0:6cb2eaf8b133 662 {
caoyuan9642 0:6cb2eaf8b133 663 if (argn != 0)
caoyuan9642 0:6cb2eaf8b133 664 {
caoyuan9642 0:6cb2eaf8b133 665 return ERR_WRONG_NUM_PARAM;
caoyuan9642 0:6cb2eaf8b133 666 }
caoyuan9642 0:6cb2eaf8b133 667 osStatus s;
caoyuan9642 0:6cb2eaf8b133 668 if ((s = server->getEqMount()->startTracking()) != osOK)
caoyuan9642 0:6cb2eaf8b133 669 return s;
caoyuan9642 0:6cb2eaf8b133 670 return 0;
caoyuan9642 0:6cb2eaf8b133 671 }
caoyuan9642 0:6cb2eaf8b133 672
caoyuan9642 0:6cb2eaf8b133 673 static int eqmount_read(EqMountServer *server, const char *cmd, int argn,
caoyuan9642 0:6cb2eaf8b133 674 char *argv[])
caoyuan9642 0:6cb2eaf8b133 675 {
caoyuan9642 0:6cb2eaf8b133 676
caoyuan9642 0:6cb2eaf8b133 677 if (argn == 0)
caoyuan9642 0:6cb2eaf8b133 678 {
caoyuan9642 0:6cb2eaf8b133 679 EquatorialCoordinates eq =
caoyuan9642 0:6cb2eaf8b133 680 server->getEqMount()->getEquatorialCoordinates();
caoyuan9642 0:6cb2eaf8b133 681 stprintf(server->getStream(), "%s %.8f %.8f\r\n", cmd, eq.ra, eq.dec);
caoyuan9642 0:6cb2eaf8b133 682 }
caoyuan9642 0:6cb2eaf8b133 683 else if (argn == 1)
caoyuan9642 0:6cb2eaf8b133 684 {
caoyuan9642 0:6cb2eaf8b133 685 if (strcmp(argv[0], "eq") == 0)
caoyuan9642 0:6cb2eaf8b133 686 {
caoyuan9642 0:6cb2eaf8b133 687 EquatorialCoordinates eq =
caoyuan9642 0:6cb2eaf8b133 688 server->getEqMount()->getEquatorialCoordinates();
caoyuan9642 0:6cb2eaf8b133 689 stprintf(server->getStream(), "%s %.8f %.8f\r\n", cmd, eq.ra,
caoyuan9642 0:6cb2eaf8b133 690 eq.dec);
caoyuan9642 0:6cb2eaf8b133 691 }
caoyuan9642 0:6cb2eaf8b133 692 else if (strcmp(argv[0], "mount") == 0)
caoyuan9642 0:6cb2eaf8b133 693 {
caoyuan9642 0:6cb2eaf8b133 694 MountCoordinates mc = server->getEqMount()->getMountCoordinates();
caoyuan9642 0:6cb2eaf8b133 695 stprintf(server->getStream(), "%s %.8f %.8f %c\r\n", cmd,
caoyuan9642 0:6cb2eaf8b133 696 mc.ra_delta, mc.dec_delta,
caoyuan9642 0:6cb2eaf8b133 697 (mc.side == PIER_SIDE_WEST) ? 'W' : 'E');
caoyuan9642 0:6cb2eaf8b133 698 }
caoyuan9642 0:6cb2eaf8b133 699 else
caoyuan9642 0:6cb2eaf8b133 700 {
caoyuan9642 0:6cb2eaf8b133 701 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 702 }
caoyuan9642 0:6cb2eaf8b133 703 }
caoyuan9642 0:6cb2eaf8b133 704 else
caoyuan9642 0:6cb2eaf8b133 705 {
caoyuan9642 0:6cb2eaf8b133 706 return ERR_WRONG_NUM_PARAM;
caoyuan9642 0:6cb2eaf8b133 707 }
caoyuan9642 0:6cb2eaf8b133 708
caoyuan9642 0:6cb2eaf8b133 709 return 0;
caoyuan9642 0:6cb2eaf8b133 710 }
caoyuan9642 0:6cb2eaf8b133 711
caoyuan9642 0:6cb2eaf8b133 712 static int eqmount_state(EqMountServer *server, const char *cmd, int argn,
caoyuan9642 0:6cb2eaf8b133 713 char *argv[])
caoyuan9642 0:6cb2eaf8b133 714 {
caoyuan9642 0:6cb2eaf8b133 715
caoyuan9642 0:6cb2eaf8b133 716 if (argn == 0)
caoyuan9642 0:6cb2eaf8b133 717 {
caoyuan9642 0:6cb2eaf8b133 718 const char *s;
caoyuan9642 0:6cb2eaf8b133 719 switch (server->getEqMount()->getStatus())
caoyuan9642 0:6cb2eaf8b133 720 {
caoyuan9642 0:6cb2eaf8b133 721 case MOUNT_STOPPED:
caoyuan9642 0:6cb2eaf8b133 722 s = "stopped";
caoyuan9642 0:6cb2eaf8b133 723 break;
caoyuan9642 0:6cb2eaf8b133 724 case MOUNT_SLEWING:
caoyuan9642 0:6cb2eaf8b133 725 s = "slewing";
caoyuan9642 0:6cb2eaf8b133 726 break;
caoyuan9642 0:6cb2eaf8b133 727 case MOUNT_TRACKING:
caoyuan9642 0:6cb2eaf8b133 728 s = "tracking";
caoyuan9642 0:6cb2eaf8b133 729 break;
caoyuan9642 0:6cb2eaf8b133 730 case MOUNT_NUDGING:
caoyuan9642 0:6cb2eaf8b133 731 s = "nudging";
caoyuan9642 0:6cb2eaf8b133 732 break;
caoyuan9642 0:6cb2eaf8b133 733 case MOUNT_NUDGING_TRACKING:
caoyuan9642 0:6cb2eaf8b133 734 s = "nudging_tracking";
caoyuan9642 0:6cb2eaf8b133 735 break;
caoyuan9642 0:6cb2eaf8b133 736 }
caoyuan9642 0:6cb2eaf8b133 737 stprintf(server->getStream(), "%s %s\r\n", cmd, s);
caoyuan9642 0:6cb2eaf8b133 738 }
caoyuan9642 0:6cb2eaf8b133 739 else
caoyuan9642 0:6cb2eaf8b133 740 {
caoyuan9642 0:6cb2eaf8b133 741 return ERR_WRONG_NUM_PARAM;
caoyuan9642 0:6cb2eaf8b133 742 }
caoyuan9642 0:6cb2eaf8b133 743
caoyuan9642 0:6cb2eaf8b133 744 return 0;
caoyuan9642 0:6cb2eaf8b133 745 }
caoyuan9642 0:6cb2eaf8b133 746
caoyuan9642 0:6cb2eaf8b133 747 static int eqmount_help(EqMountServer *server, const char *cmd, int argn,
caoyuan9642 0:6cb2eaf8b133 748 char *argv[])
caoyuan9642 0:6cb2eaf8b133 749 {
caoyuan9642 0:6cb2eaf8b133 750 stprintf(server->getStream(), "%s Available commands: \r\n", cmd);
caoyuan9642 0:6cb2eaf8b133 751 for (int i = 0; i < MAX_COMMAND; i++)
caoyuan9642 0:6cb2eaf8b133 752 {
caoyuan9642 0:6cb2eaf8b133 753 if (commandlist[i].fptr == NULL)
caoyuan9642 0:6cb2eaf8b133 754 break;
caoyuan9642 0:6cb2eaf8b133 755 stprintf(server->getStream(), "%s - %s : %s\r\n", cmd,
caoyuan9642 0:6cb2eaf8b133 756 commandlist[i].cmd, commandlist[i].desc);
caoyuan9642 0:6cb2eaf8b133 757 }
caoyuan9642 0:6cb2eaf8b133 758 return 0;
caoyuan9642 0:6cb2eaf8b133 759 }
caoyuan9642 0:6cb2eaf8b133 760
caoyuan9642 0:6cb2eaf8b133 761 static int eqmount_guide(EqMountServer *server, const char *cmd, int argn,
caoyuan9642 0:6cb2eaf8b133 762 char *argv[])
caoyuan9642 0:6cb2eaf8b133 763 {
caoyuan9642 0:6cb2eaf8b133 764
caoyuan9642 0:6cb2eaf8b133 765 if (argn != 2)
caoyuan9642 0:6cb2eaf8b133 766 {
caoyuan9642 0:6cb2eaf8b133 767 stprintf(server->getStream(),
caoyuan9642 0:6cb2eaf8b133 768 "%s Usage: guide {north|west|south|east} milliseconds\r\n",
caoyuan9642 0:6cb2eaf8b133 769 cmd);
caoyuan9642 0:6cb2eaf8b133 770 return ERR_WRONG_NUM_PARAM;
caoyuan9642 0:6cb2eaf8b133 771 }
caoyuan9642 0:6cb2eaf8b133 772
caoyuan9642 0:6cb2eaf8b133 773 char *tp;
caoyuan9642 0:6cb2eaf8b133 774 int ms = strtod(argv[1], &tp);
caoyuan9642 0:6cb2eaf8b133 775 if (tp == argv[1] || ms < 1
caoyuan9642 0:6cb2eaf8b133 776 || ms > TelescopeConfiguration::getInt("max_guide_time"))
caoyuan9642 0:6cb2eaf8b133 777 {
caoyuan9642 0:6cb2eaf8b133 778 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 779 }
caoyuan9642 0:6cb2eaf8b133 780
caoyuan9642 0:6cb2eaf8b133 781 if (strcmp("north", argv[0]) == 0)
caoyuan9642 0:6cb2eaf8b133 782 {
caoyuan9642 0:6cb2eaf8b133 783 return server->getEqMount()->guide(GUIDE_NORTH, ms);
caoyuan9642 0:6cb2eaf8b133 784 }
caoyuan9642 0:6cb2eaf8b133 785 else if (strcmp("south", argv[0]) == 0)
caoyuan9642 0:6cb2eaf8b133 786 {
caoyuan9642 0:6cb2eaf8b133 787 return server->getEqMount()->guide(GUIDE_SOUTH, ms);
caoyuan9642 0:6cb2eaf8b133 788 }
caoyuan9642 0:6cb2eaf8b133 789 else if (strcmp("west", argv[0]) == 0)
caoyuan9642 0:6cb2eaf8b133 790 {
caoyuan9642 0:6cb2eaf8b133 791 return server->getEqMount()->guide(GUIDE_WEST, ms);
caoyuan9642 0:6cb2eaf8b133 792 }
caoyuan9642 0:6cb2eaf8b133 793 else if (strcmp("east", argv[0]) == 0)
caoyuan9642 0:6cb2eaf8b133 794 {
caoyuan9642 0:6cb2eaf8b133 795 return server->getEqMount()->guide(GUIDE_EAST, ms);
caoyuan9642 0:6cb2eaf8b133 796 }
caoyuan9642 0:6cb2eaf8b133 797 else
caoyuan9642 0:6cb2eaf8b133 798 {
caoyuan9642 0:6cb2eaf8b133 799 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 800 }
caoyuan9642 0:6cb2eaf8b133 801
caoyuan9642 0:6cb2eaf8b133 802 return 0;
caoyuan9642 0:6cb2eaf8b133 803 }
caoyuan9642 0:6cb2eaf8b133 804
caoyuan9642 0:6cb2eaf8b133 805 static int eqmount_time(EqMountServer *server, const char *cmd, int argn,
caoyuan9642 0:6cb2eaf8b133 806 char *argv[])
caoyuan9642 0:6cb2eaf8b133 807 {
caoyuan9642 0:6cb2eaf8b133 808 char buf[32];
caoyuan9642 0:6cb2eaf8b133 809 //Get time
caoyuan9642 0:6cb2eaf8b133 810 time_t t = server->getEqMount()->getClock().getTime();
caoyuan9642 0:6cb2eaf8b133 811
caoyuan9642 0:6cb2eaf8b133 812 if (argn >= 2)
caoyuan9642 0:6cb2eaf8b133 813 {
caoyuan9642 0:6cb2eaf8b133 814 return ERR_WRONG_NUM_PARAM;
caoyuan9642 0:6cb2eaf8b133 815 }
caoyuan9642 0:6cb2eaf8b133 816 else if (argn == 1)
caoyuan9642 0:6cb2eaf8b133 817 {
caoyuan9642 0:6cb2eaf8b133 818 if (strcmp(argv[0], "stamp") == 0)
caoyuan9642 0:6cb2eaf8b133 819 {
caoyuan9642 0:6cb2eaf8b133 820 // Print timestamp value
caoyuan9642 0:6cb2eaf8b133 821 stprintf(server->getStream(), "%s %d\r\n", cmd, t);
caoyuan9642 0:6cb2eaf8b133 822 return 0;
caoyuan9642 0:6cb2eaf8b133 823 }
caoyuan9642 0:6cb2eaf8b133 824 else if (strcmp(argv[0], "sidereal") == 0)
caoyuan9642 0:6cb2eaf8b133 825 {
caoyuan9642 0:6cb2eaf8b133 826 // Print sidereal time at current location
caoyuan9642 0:6cb2eaf8b133 827 // 0.0 is sidereal midnight, 180/-180 is sidereal noon
caoyuan9642 0:6cb2eaf8b133 828 double st = CelestialMath::getLocalSiderealTime(t,
caoyuan9642 0:6cb2eaf8b133 829 server->getEqMount()->getLocation());
caoyuan9642 0:6cb2eaf8b133 830 // int hh = ((int) floor(st / 15) + 24) % 24;
caoyuan9642 0:6cb2eaf8b133 831 // int mm = (int) floor((st + 360.0 - hh * 15) * 4) % 60;
caoyuan9642 0:6cb2eaf8b133 832 // int ss = (int) floor((st + 360.0 - hh * 15 - mm * 0.25) * 240) % 60;
caoyuan9642 0:6cb2eaf8b133 833 stprintf(server->getStream(), "%s %f\r\n", cmd, st);
caoyuan9642 0:6cb2eaf8b133 834 // stprintf(server->getStream(), "%d:%d:%d LST\r\n", hh, mm, ss);
caoyuan9642 0:6cb2eaf8b133 835 return 0;
caoyuan9642 0:6cb2eaf8b133 836 }
caoyuan9642 0:6cb2eaf8b133 837 else if (strcmp(argv[0], "local") == 0)
caoyuan9642 0:6cb2eaf8b133 838 {
caoyuan9642 0:6cb2eaf8b133 839 t += (int) (remainder(server->getEqMount()->getLocation().lon, 360)
caoyuan9642 0:6cb2eaf8b133 840 * 240);
caoyuan9642 0:6cb2eaf8b133 841 ctime_r(&t, buf);
caoyuan9642 0:6cb2eaf8b133 842 stprintf(server->getStream(), "%s %s\r\n", cmd, buf);
caoyuan9642 0:6cb2eaf8b133 843 return 0;
caoyuan9642 0:6cb2eaf8b133 844 }
caoyuan9642 0:6cb2eaf8b133 845 else if (strcmp(argv[0], "zone") == 0)
caoyuan9642 0:6cb2eaf8b133 846 {
caoyuan9642 0:6cb2eaf8b133 847 t += (int) (TelescopeConfiguration::getInt("timezone") * 3600);
caoyuan9642 0:6cb2eaf8b133 848 ctime_r(&t, buf);
caoyuan9642 0:6cb2eaf8b133 849 stprintf(server->getStream(), "%s %s\r\n", cmd, buf);
caoyuan9642 0:6cb2eaf8b133 850 return 0;
caoyuan9642 0:6cb2eaf8b133 851 }
caoyuan9642 0:6cb2eaf8b133 852
caoyuan9642 0:6cb2eaf8b133 853 }
caoyuan9642 0:6cb2eaf8b133 854
caoyuan9642 0:6cb2eaf8b133 855 // Print of formatted string of current time
caoyuan9642 0:6cb2eaf8b133 856 ctime_r(&t, buf);
caoyuan9642 0:6cb2eaf8b133 857 stprintf(server->getStream(), "%s %s\r\n", cmd, buf);
caoyuan9642 0:6cb2eaf8b133 858
caoyuan9642 0:6cb2eaf8b133 859 return 0;
caoyuan9642 0:6cb2eaf8b133 860 }
caoyuan9642 0:6cb2eaf8b133 861
caoyuan9642 0:6cb2eaf8b133 862 static int eqmount_settime(EqMountServer *server, const char *cmd, int argn,
caoyuan9642 0:6cb2eaf8b133 863 char *argv[])
caoyuan9642 0:6cb2eaf8b133 864 {
caoyuan9642 0:6cb2eaf8b133 865 if (argn == 1)
caoyuan9642 0:6cb2eaf8b133 866 {
caoyuan9642 0:6cb2eaf8b133 867 //Use the first argument as UTC timestamp
caoyuan9642 0:6cb2eaf8b133 868 time_t t = strtol(argv[0], NULL, 10);
caoyuan9642 0:6cb2eaf8b133 869 server->getEqMount()->getClock().setTime(t);
caoyuan9642 0:6cb2eaf8b133 870 }
caoyuan9642 0:6cb2eaf8b133 871 else if (argn == 6)
caoyuan9642 0:6cb2eaf8b133 872 {
caoyuan9642 0:6cb2eaf8b133 873 int year = strtol(argv[0], NULL, 10);
caoyuan9642 0:6cb2eaf8b133 874 int month = strtol(argv[1], NULL, 10);
caoyuan9642 0:6cb2eaf8b133 875 int day = strtol(argv[2], NULL, 10);
caoyuan9642 0:6cb2eaf8b133 876 int hour = strtol(argv[3], NULL, 10);
caoyuan9642 0:6cb2eaf8b133 877 int min = strtol(argv[4], NULL, 10);
caoyuan9642 0:6cb2eaf8b133 878 int sec = strtol(argv[5], NULL, 10);
caoyuan9642 0:6cb2eaf8b133 879 struct tm ts;
caoyuan9642 0:6cb2eaf8b133 880 ts.tm_sec = sec;
caoyuan9642 0:6cb2eaf8b133 881 ts.tm_min = min;
caoyuan9642 0:6cb2eaf8b133 882 ts.tm_hour = hour;
caoyuan9642 0:6cb2eaf8b133 883 ts.tm_mday = day;
caoyuan9642 0:6cb2eaf8b133 884 ts.tm_mon = month - 1;
caoyuan9642 0:6cb2eaf8b133 885 ts.tm_year = year - 1900;
caoyuan9642 0:6cb2eaf8b133 886 ts.tm_isdst = 0;
caoyuan9642 0:6cb2eaf8b133 887
caoyuan9642 0:6cb2eaf8b133 888 time_t t = mktime(&ts);
caoyuan9642 0:6cb2eaf8b133 889 if (t == -1)
caoyuan9642 0:6cb2eaf8b133 890 {
caoyuan9642 0:6cb2eaf8b133 891 // Parameter out of range
caoyuan9642 0:6cb2eaf8b133 892 return 2;
caoyuan9642 0:6cb2eaf8b133 893 }
caoyuan9642 0:6cb2eaf8b133 894
caoyuan9642 0:6cb2eaf8b133 895 server->getEqMount()->getClock().setTime(t);
caoyuan9642 0:6cb2eaf8b133 896 }
caoyuan9642 0:6cb2eaf8b133 897 else
caoyuan9642 0:6cb2eaf8b133 898 {
caoyuan9642 0:6cb2eaf8b133 899 stprintf(server->getStream(),
caoyuan9642 0:6cb2eaf8b133 900 "%s usage: settime <timestamp>, or, settime <year> <month> <day> <hour> <minute> <second> (UTC time should be used)\r\n",
caoyuan9642 0:6cb2eaf8b133 901 cmd);
caoyuan9642 0:6cb2eaf8b133 902 return 1;
caoyuan9642 0:6cb2eaf8b133 903 }
caoyuan9642 0:6cb2eaf8b133 904
caoyuan9642 0:6cb2eaf8b133 905 return 0;
caoyuan9642 0:6cb2eaf8b133 906 }
caoyuan9642 0:6cb2eaf8b133 907
caoyuan9642 0:6cb2eaf8b133 908 void EqMountServer::addCommand(const ServerCommand& cmd)
caoyuan9642 0:6cb2eaf8b133 909 {
caoyuan9642 0:6cb2eaf8b133 910 int i = 0;
caoyuan9642 0:6cb2eaf8b133 911 while (i < MAX_COMMAND && commandlist[i].fptr != NULL)
caoyuan9642 0:6cb2eaf8b133 912 i++;
caoyuan9642 0:6cb2eaf8b133 913 if (i >= MAX_COMMAND - 1)
caoyuan9642 0:6cb2eaf8b133 914 {
caoyuan9642 0:6cb2eaf8b133 915 debug("Error: max command reached.\n");
caoyuan9642 0:6cb2eaf8b133 916 return;
caoyuan9642 0:6cb2eaf8b133 917 }
caoyuan9642 0:6cb2eaf8b133 918
caoyuan9642 0:6cb2eaf8b133 919 commandlist[i] = cmd;
caoyuan9642 0:6cb2eaf8b133 920 commandlist[++i] = ServerCommand("", "", NULL);
caoyuan9642 0:6cb2eaf8b133 921 }
caoyuan9642 0:6cb2eaf8b133 922
caoyuan9642 0:6cb2eaf8b133 923 ServerCommand commandlist[MAX_COMMAND] =
caoyuan9642 0:6cb2eaf8b133 924 { /// List of all commands
caoyuan9642 0:6cb2eaf8b133 925 ServerCommand("stop", "Stop mount motion", eqmount_stop), /// Stop
caoyuan9642 0:6cb2eaf8b133 926 ServerCommand("estop", "Emergency stop", eqmount_estop), /// Emergency Stop
caoyuan9642 0:6cb2eaf8b133 927 ServerCommand("read", "Read current RA/DEC position", eqmount_read), /// Read Position
caoyuan9642 0:6cb2eaf8b133 928 ServerCommand("time", "Get and set system time", eqmount_time), /// System time
caoyuan9642 0:6cb2eaf8b133 929 ServerCommand("status", "Get the mount state", eqmount_state), /// System state
caoyuan9642 0:6cb2eaf8b133 930 ServerCommand("help", "Print this help menu", eqmount_help), /// Help menu
caoyuan9642 0:6cb2eaf8b133 931 ServerCommand("speed", "Set slew and tracking speed", eqmount_speed), /// Set speed
caoyuan9642 0:6cb2eaf8b133 932 ServerCommand("align", "Star alignment", eqmount_align), /// Alignment
caoyuan9642 0:6cb2eaf8b133 933 /// Above are allowed commands when another command is running
caoyuan9642 0:6cb2eaf8b133 934
caoyuan9642 0:6cb2eaf8b133 935 ServerCommand("goto",
caoyuan9642 0:6cb2eaf8b133 936 "Perform go to operation to specified ra, dec coordinates",
caoyuan9642 0:6cb2eaf8b133 937 eqmount_goto), /// Go to
caoyuan9642 0:6cb2eaf8b133 938 ServerCommand("nudge", "Perform nudging on specified direction",
caoyuan9642 0:6cb2eaf8b133 939 eqmount_nudge), /// Nudge
caoyuan9642 0:6cb2eaf8b133 940 ServerCommand("track", "Start tracking in specified direction",
caoyuan9642 0:6cb2eaf8b133 941 eqmount_track), /// Track
caoyuan9642 0:6cb2eaf8b133 942 ServerCommand("guide", "Guide on specified direction",
caoyuan9642 0:6cb2eaf8b133 943 eqmount_guide), /// Guide
caoyuan9642 0:6cb2eaf8b133 944 ServerCommand("settime", "Set system time", eqmount_settime), /// System time
caoyuan9642 0:6cb2eaf8b133 945 ServerCommand("", "", NULL) };
caoyuan9642 0:6cb2eaf8b133 946
caoyuan9642 0:6cb2eaf8b133 947