Telescope Control Library

Dependents:   PushToGo-F429

Committer:
caoyuan9642
Date:
Sun Aug 19 05:37:52 2018 +0000
Revision:
1:a4d5537de7ae
Parent:
0:6cb2eaf8b133
Child:
2:2ee28add0821
11

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