Telescope Control Library

Dependents:   PushToGo-F429

Committer:
caoyu@caoyuan9642-desktop.MIT.EDU
Date:
Mon Sep 24 19:36:48 2018 -0400
Revision:
19:fd854309cb4c
Parent:
15:0bdda8dadafe
Fix bug in nudging with small speeds mentioned in the last commit

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 2:2ee28add0821 232 // Stop nudging or slewing
caoyuan9642 2:2ee28add0821 233 if (server->getEqMount()->getStatus() & MOUNT_NUDGING){
caoyuan9642 2:2ee28add0821 234 server->getEqMount()->stopNudge();
caoyuan9642 2:2ee28add0821 235 }
caoyuan9642 2:2ee28add0821 236 else if (server->getEqMount()->getStatus() == MOUNT_SLEWING){
caoyuan9642 2:2ee28add0821 237 server->getEqMount()->stopAsync();
caoyuan9642 2:2ee28add0821 238 }
caoyuan9642 0:6cb2eaf8b133 239 }
caoyuan9642 0:6cb2eaf8b133 240 else if (argn == 1 && strcmp(argv[0], "track") == 0)
caoyuan9642 0:6cb2eaf8b133 241 {
caoyuan9642 0:6cb2eaf8b133 242 server->getEqMount()->stopTracking();
caoyuan9642 0:6cb2eaf8b133 243 }
caoyuan9642 0:6cb2eaf8b133 244 else
caoyuan9642 0:6cb2eaf8b133 245 {
caoyuan9642 0:6cb2eaf8b133 246 return ERR_WRONG_NUM_PARAM;
caoyuan9642 0:6cb2eaf8b133 247 }
caoyuan9642 0:6cb2eaf8b133 248 return 0;
caoyuan9642 0:6cb2eaf8b133 249 }
caoyuan9642 0:6cb2eaf8b133 250
caoyuan9642 0:6cb2eaf8b133 251 static int eqmount_estop(EqMountServer *server, const char *cmd, int argn,
caoyuan9642 0:6cb2eaf8b133 252 char *argv[])
caoyuan9642 0:6cb2eaf8b133 253 {
caoyuan9642 0:6cb2eaf8b133 254 server->getEqMount()->emergencyStop();
caoyuan9642 0:6cb2eaf8b133 255 return 0;
caoyuan9642 0:6cb2eaf8b133 256 }
caoyuan9642 0:6cb2eaf8b133 257
caoyuan9642 0:6cb2eaf8b133 258 static int eqmount_goto(EqMountServer *server, const char *cmd, int argn,
caoyuan9642 0:6cb2eaf8b133 259 char *argv[])
caoyuan9642 0:6cb2eaf8b133 260 {
caoyuan9642 0:6cb2eaf8b133 261 if (argn == 1)
caoyuan9642 0:6cb2eaf8b133 262 {
caoyuan9642 0:6cb2eaf8b133 263 if (strcmp(argv[0], "index") == 0)
caoyuan9642 0:6cb2eaf8b133 264 {
caoyuan9642 0:6cb2eaf8b133 265 return server->getEqMount()->goToIndex();
caoyuan9642 0:6cb2eaf8b133 266 }
caoyuan9642 0:6cb2eaf8b133 267 }
caoyuan9642 0:6cb2eaf8b133 268 else if (argn == 2 || (argn == 3 && strcmp(argv[0], "eq") == 0))
caoyuan9642 0:6cb2eaf8b133 269 {
caoyuan9642 0:6cb2eaf8b133 270 if (argn == 3 && strcmp(argv[0], "eq") == 0)
caoyuan9642 0:6cb2eaf8b133 271 {
caoyuan9642 0:6cb2eaf8b133 272 argv[0] = argv[1];
caoyuan9642 0:6cb2eaf8b133 273 argv[1] = argv[2];
caoyuan9642 0:6cb2eaf8b133 274 }
caoyuan9642 0:6cb2eaf8b133 275 char *tp;
caoyuan9642 0:6cb2eaf8b133 276 // First try HMS format
caoyuan9642 0:6cb2eaf8b133 277 double ra = CelestialMath::parseHMSAngle(argv[0]);
caoyuan9642 0:6cb2eaf8b133 278 if (isnan(ra))
caoyuan9642 0:6cb2eaf8b133 279 {
caoyuan9642 0:6cb2eaf8b133 280 // If doesn't work, then we use as a double
caoyuan9642 0:6cb2eaf8b133 281 ra = strtod(argv[0], &tp);
caoyuan9642 0:6cb2eaf8b133 282 if (tp == argv[0])
caoyuan9642 0:6cb2eaf8b133 283 {
caoyuan9642 0:6cb2eaf8b133 284 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 285 }
caoyuan9642 0:6cb2eaf8b133 286 }
caoyuan9642 0:6cb2eaf8b133 287 // First try DMS format
caoyuan9642 0:6cb2eaf8b133 288 double dec = CelestialMath::parseDMSAngle(argv[1]);
caoyuan9642 0:6cb2eaf8b133 289 if (isnan(dec))
caoyuan9642 0:6cb2eaf8b133 290 {
caoyuan9642 0:6cb2eaf8b133 291 // If doesn't work, then we use as a double
caoyuan9642 0:6cb2eaf8b133 292 dec = strtod(argv[1], &tp);
caoyuan9642 0:6cb2eaf8b133 293 if (tp == argv[1])
caoyuan9642 0:6cb2eaf8b133 294 {
caoyuan9642 0:6cb2eaf8b133 295 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 296 }
caoyuan9642 0:6cb2eaf8b133 297 }
caoyuan9642 0:6cb2eaf8b133 298
caoyuan9642 0:6cb2eaf8b133 299 if (!((ra <= 180.0) && (ra >= -180.0) && (dec <= 90.0) && (dec >= -90.0)))
caoyuan9642 0:6cb2eaf8b133 300 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 301
caoyuan9642 0:6cb2eaf8b133 302 osStatus s;
caoyuan9642 0:6cb2eaf8b133 303 if ((s = server->getEqMount()->goTo(ra, dec)) != osOK)
caoyuan9642 0:6cb2eaf8b133 304 return s;
caoyuan9642 0:6cb2eaf8b133 305 }
caoyuan9642 0:6cb2eaf8b133 306 else if (argn == 3)
caoyuan9642 0:6cb2eaf8b133 307 {
caoyuan9642 0:6cb2eaf8b133 308 if (strcmp(argv[0], "mount") == 0)
caoyuan9642 0:6cb2eaf8b133 309 {
caoyuan9642 0:6cb2eaf8b133 310 char *tp;
caoyuan9642 0:6cb2eaf8b133 311 double ra = strtod(argv[1], &tp);
caoyuan9642 0:6cb2eaf8b133 312 if (tp == argv[1])
caoyuan9642 0:6cb2eaf8b133 313 {
caoyuan9642 0:6cb2eaf8b133 314 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 315 }
caoyuan9642 0:6cb2eaf8b133 316 double dec = strtod(argv[2], &tp);
caoyuan9642 0:6cb2eaf8b133 317 if (tp == argv[2])
caoyuan9642 0:6cb2eaf8b133 318 {
caoyuan9642 0:6cb2eaf8b133 319 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 320 }
caoyuan9642 0:6cb2eaf8b133 321
caoyuan9642 0:6cb2eaf8b133 322 if (!((ra <= 180.0) && (ra >= -180.0) && (dec <= 180.0)
caoyuan9642 0:6cb2eaf8b133 323 && (dec >= -180.0)))
caoyuan9642 0:6cb2eaf8b133 324 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 325
caoyuan9642 0:6cb2eaf8b133 326 osStatus s;
caoyuan9642 0:6cb2eaf8b133 327 if ((s = server->getEqMount()->goToMount(MountCoordinates(dec, ra)))
caoyuan9642 0:6cb2eaf8b133 328 != osOK)
caoyuan9642 0:6cb2eaf8b133 329 return s;
caoyuan9642 0:6cb2eaf8b133 330 }
caoyuan9642 0:6cb2eaf8b133 331 }
caoyuan9642 0:6cb2eaf8b133 332 else
caoyuan9642 0:6cb2eaf8b133 333 {
caoyuan9642 0:6cb2eaf8b133 334 return ERR_WRONG_NUM_PARAM;
caoyuan9642 0:6cb2eaf8b133 335 }
caoyuan9642 0:6cb2eaf8b133 336
caoyuan9642 0:6cb2eaf8b133 337 return 0;
caoyuan9642 0:6cb2eaf8b133 338 }
caoyuan9642 0:6cb2eaf8b133 339
caoyuan9642 0:6cb2eaf8b133 340 static int eqmount_speed(EqMountServer *server, const char *cmd, int argn,
caoyuan9642 0:6cb2eaf8b133 341 char *argv[])
caoyuan9642 0:6cb2eaf8b133 342 {
caoyuan9642 0:6cb2eaf8b133 343 if (argn == 1)
caoyuan9642 0:6cb2eaf8b133 344 {
caoyuan9642 0:6cb2eaf8b133 345 // Print speed
caoyuan9642 0:6cb2eaf8b133 346 double speed = 0;
caoyuan9642 0:6cb2eaf8b133 347 if (strcmp(argv[0], "slew") == 0)
caoyuan9642 0:6cb2eaf8b133 348 {
caoyuan9642 0:6cb2eaf8b133 349 speed = server->getEqMount()->getSlewSpeed();
caoyuan9642 0:6cb2eaf8b133 350 }
caoyuan9642 0:6cb2eaf8b133 351 else if (strcmp(argv[0], "track") == 0)
caoyuan9642 0:6cb2eaf8b133 352 {
caoyuan9642 0:6cb2eaf8b133 353 speed = server->getEqMount()->getTrackSpeedSidereal();
caoyuan9642 0:6cb2eaf8b133 354 }
caoyuan9642 0:6cb2eaf8b133 355 else if (strcmp(argv[0], "guide") == 0)
caoyuan9642 0:6cb2eaf8b133 356 {
caoyuan9642 0:6cb2eaf8b133 357 speed = server->getEqMount()->getGuideSpeedSidereal();
caoyuan9642 0:6cb2eaf8b133 358 }
caoyuan9642 0:6cb2eaf8b133 359 else
caoyuan9642 0:6cb2eaf8b133 360 {
caoyuan9642 0:6cb2eaf8b133 361 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 362 }
caoyuan9642 0:6cb2eaf8b133 363 stprintf(server->getStream(), "%s %f\r\n", cmd, speed);
caoyuan9642 0:6cb2eaf8b133 364 }
caoyuan9642 0:6cb2eaf8b133 365 else if (argn == 2)
caoyuan9642 0:6cb2eaf8b133 366 {
caoyuan9642 0:6cb2eaf8b133 367 char *tp;
caoyuan9642 0:6cb2eaf8b133 368 double speed = strtod(argv[1], &tp);
caoyuan9642 0:6cb2eaf8b133 369 if (tp == argv[1])
caoyuan9642 0:6cb2eaf8b133 370 {
caoyuan9642 0:6cb2eaf8b133 371 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 372 }
caoyuan9642 0:6cb2eaf8b133 373 if (strcmp(argv[0], "slew") == 0)
caoyuan9642 0:6cb2eaf8b133 374 {
caoyuan9642 0:6cb2eaf8b133 375 if (speed <= 0
caoyuan9642 0:6cb2eaf8b133 376 || speed > TelescopeConfiguration::getDouble("max_speed"))
caoyuan9642 0:6cb2eaf8b133 377 {
caoyuan9642 0:6cb2eaf8b133 378 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 379 }
caoyuan9642 0:6cb2eaf8b133 380 server->getEqMount()->setSlewSpeed(speed);
caoyuan9642 0:6cb2eaf8b133 381 }
caoyuan9642 0:6cb2eaf8b133 382 else if (strcmp(argv[0], "track") == 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()->setTrackSpeedSidereal(speed);
caoyuan9642 0:6cb2eaf8b133 389 }
caoyuan9642 0:6cb2eaf8b133 390 else if (strcmp(argv[0], "guide") == 0)
caoyuan9642 0:6cb2eaf8b133 391 {
caoyuan9642 0:6cb2eaf8b133 392 if (speed <= 0 || speed > 64)
caoyuan9642 0:6cb2eaf8b133 393 {
caoyuan9642 0:6cb2eaf8b133 394 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 395 }
caoyuan9642 0:6cb2eaf8b133 396 server->getEqMount()->setGuideSpeedSidereal(speed);
caoyuan9642 0:6cb2eaf8b133 397 }
caoyuan9642 0:6cb2eaf8b133 398 }
caoyuan9642 0:6cb2eaf8b133 399 else
caoyuan9642 0:6cb2eaf8b133 400 {
caoyuan9642 0:6cb2eaf8b133 401 return ERR_WRONG_NUM_PARAM;
caoyuan9642 0:6cb2eaf8b133 402 }
caoyuan9642 0:6cb2eaf8b133 403
caoyuan9642 0:6cb2eaf8b133 404 return 0;
caoyuan9642 0:6cb2eaf8b133 405 }
caoyuan9642 0:6cb2eaf8b133 406
caoyuan9642 0:6cb2eaf8b133 407 static int eqmount_align(EqMountServer *server, const char *cmd, int argn,
caoyuan9642 0:6cb2eaf8b133 408 char *argv[])
caoyuan9642 0:6cb2eaf8b133 409 {
caoyuan9642 0:6cb2eaf8b133 410 if (argn == 0)
caoyuan9642 0:6cb2eaf8b133 411 {
caoyuan9642 0:6cb2eaf8b133 412 stprintf(server->getStream(),
caoyuan9642 4:b8ad57bbf9e1 413 "%s usage: align add [star]\r\nalign replace [n] [star]\r\nalign delete [n]\r\nalign show\r\nalign show [n]\r\nalign clear\r\nalign set\r\nalign force\r\nalign update\r\n",
caoyuan9642 0:6cb2eaf8b133 414 cmd);
caoyuan9642 0:6cb2eaf8b133 415 return ERR_WRONG_NUM_PARAM;
caoyuan9642 0:6cb2eaf8b133 416 }
caoyuan9642 0:6cb2eaf8b133 417 if (strcmp(argv[0], "add") == 0)
caoyuan9642 0:6cb2eaf8b133 418 {
caoyuan9642 0:6cb2eaf8b133 419 AlignmentStar as;
caoyuan9642 0:6cb2eaf8b133 420 if (argn != 3 && argn != 5)
caoyuan9642 0:6cb2eaf8b133 421 {
caoyuan9642 0:6cb2eaf8b133 422 stprintf(server->getStream(),
caoyuan9642 4:b8ad57bbf9e1 423 "%s usage: align add {ref_ra} {ref_dec}\r\n%s usage: align add {ref_ra} {ref_dec} {meas_ra} {meas_dec}\r\n",
caoyuan9642 0:6cb2eaf8b133 424 cmd, cmd);
caoyuan9642 0:6cb2eaf8b133 425 return ERR_WRONG_NUM_PARAM;
caoyuan9642 0:6cb2eaf8b133 426 }
caoyuan9642 0:6cb2eaf8b133 427 char *tp;
caoyuan9642 0:6cb2eaf8b133 428 double ref_ra = strtod(argv[1], &tp);
caoyuan9642 0:6cb2eaf8b133 429 if (tp == argv[1])
caoyuan9642 0:6cb2eaf8b133 430 {
caoyuan9642 0:6cb2eaf8b133 431 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 432 }
caoyuan9642 0:6cb2eaf8b133 433 double ref_dec = strtod(argv[2], &tp);
caoyuan9642 0:6cb2eaf8b133 434 if (tp == argv[2])
caoyuan9642 0:6cb2eaf8b133 435 {
caoyuan9642 0:6cb2eaf8b133 436 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 437 }
caoyuan9642 0:6cb2eaf8b133 438 as.star_ref = EquatorialCoordinates(ref_dec, ref_ra);
caoyuan9642 0:6cb2eaf8b133 439 if (argn == 5)
caoyuan9642 0:6cb2eaf8b133 440 {
caoyuan9642 0:6cb2eaf8b133 441 double meas_ra = strtod(argv[3], &tp);
caoyuan9642 0:6cb2eaf8b133 442 if (tp == argv[3])
caoyuan9642 0:6cb2eaf8b133 443 {
caoyuan9642 0:6cb2eaf8b133 444 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 445 }
caoyuan9642 0:6cb2eaf8b133 446 double meas_dec = strtod(argv[4], &tp);
caoyuan9642 0:6cb2eaf8b133 447 if (tp == argv[4])
caoyuan9642 0:6cb2eaf8b133 448 {
caoyuan9642 0:6cb2eaf8b133 449 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 450 }
caoyuan9642 0:6cb2eaf8b133 451 as.star_meas = MountCoordinates(meas_dec, meas_ra);
caoyuan9642 0:6cb2eaf8b133 452 }
caoyuan9642 0:6cb2eaf8b133 453 else
caoyuan9642 0:6cb2eaf8b133 454 as.star_meas = server->getEqMount()->getMountCoordinates();
caoyuan9642 0:6cb2eaf8b133 455 as.timestamp = server->getEqMount()->getClock().getTime();
caoyuan9642 0:6cb2eaf8b133 456 return server->getEqMount()->addAlignmentStar(as);
caoyuan9642 0:6cb2eaf8b133 457 }
caoyuan9642 0:6cb2eaf8b133 458 else if (strcmp(argv[0], "replace") == 0)
caoyuan9642 0:6cb2eaf8b133 459 {
caoyuan9642 0:6cb2eaf8b133 460 AlignmentStar as;
caoyuan9642 0:6cb2eaf8b133 461 if (argn != 4 && argn != 6)
caoyuan9642 0:6cb2eaf8b133 462 {
caoyuan9642 0:6cb2eaf8b133 463 stprintf(server->getStream(),
caoyuan9642 4:b8ad57bbf9e1 464 "%s usage: align replace [index] {ref_ra} {ref_dec}\r\n%s usage: align replace [index] {ref_ra} {ref_dec} {meas_ra} {meas_dec}\r\n",
caoyuan9642 0:6cb2eaf8b133 465 cmd, cmd);
caoyuan9642 0:6cb2eaf8b133 466 return ERR_WRONG_NUM_PARAM;
caoyuan9642 0:6cb2eaf8b133 467 }
caoyuan9642 0:6cb2eaf8b133 468 char *tp;
caoyuan9642 0:6cb2eaf8b133 469
caoyuan9642 0:6cb2eaf8b133 470 int index = strtol(argv[1], &tp, 10);
caoyuan9642 0:6cb2eaf8b133 471 if (tp == argv[1])
caoyuan9642 0:6cb2eaf8b133 472 {
caoyuan9642 0:6cb2eaf8b133 473 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 474 }
caoyuan9642 0:6cb2eaf8b133 475
caoyuan9642 0:6cb2eaf8b133 476 double ref_ra = strtod(argv[2], &tp);
caoyuan9642 0:6cb2eaf8b133 477 if (tp == argv[2])
caoyuan9642 0:6cb2eaf8b133 478 {
caoyuan9642 0:6cb2eaf8b133 479 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 480 }
caoyuan9642 0:6cb2eaf8b133 481 double ref_dec = strtod(argv[3], &tp);
caoyuan9642 0:6cb2eaf8b133 482 if (tp == argv[3])
caoyuan9642 0:6cb2eaf8b133 483 {
caoyuan9642 0:6cb2eaf8b133 484 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 485 }
caoyuan9642 0:6cb2eaf8b133 486 as.star_ref = EquatorialCoordinates(ref_dec, ref_ra);
caoyuan9642 0:6cb2eaf8b133 487 if (argn == 6)
caoyuan9642 0:6cb2eaf8b133 488 {
caoyuan9642 0:6cb2eaf8b133 489 double meas_ra = strtod(argv[4], &tp);
caoyuan9642 0:6cb2eaf8b133 490 if (tp == argv[4])
caoyuan9642 0:6cb2eaf8b133 491 {
caoyuan9642 0:6cb2eaf8b133 492 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 493 }
caoyuan9642 0:6cb2eaf8b133 494 double meas_dec = strtod(argv[5], &tp);
caoyuan9642 0:6cb2eaf8b133 495 if (tp == argv[5])
caoyuan9642 0:6cb2eaf8b133 496 {
caoyuan9642 0:6cb2eaf8b133 497 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 498 }
caoyuan9642 0:6cb2eaf8b133 499 as.star_meas = MountCoordinates(meas_dec, meas_ra);
caoyuan9642 0:6cb2eaf8b133 500 }
caoyuan9642 0:6cb2eaf8b133 501 else
caoyuan9642 0:6cb2eaf8b133 502 as.star_meas = server->getEqMount()->getMountCoordinates();
caoyuan9642 0:6cb2eaf8b133 503 as.timestamp = server->getEqMount()->getClock().getTime();
caoyuan9642 0:6cb2eaf8b133 504 return server->getEqMount()->replaceAlignmentStar(index, as);
caoyuan9642 0:6cb2eaf8b133 505 }
caoyuan9642 0:6cb2eaf8b133 506 else if (strcmp(argv[0], "delete") == 0)
caoyuan9642 0:6cb2eaf8b133 507 {
caoyuan9642 0:6cb2eaf8b133 508 char *tp;
caoyuan9642 0:6cb2eaf8b133 509 int n = strtol(argv[1], &tp, 10);
caoyuan9642 0:6cb2eaf8b133 510 if (tp == argv[1] || n >= server->getEqMount()->getNumAlignmentStar()
caoyuan9642 0:6cb2eaf8b133 511 || n < 0)
caoyuan9642 0:6cb2eaf8b133 512 {
caoyuan9642 0:6cb2eaf8b133 513 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 514 }
caoyuan9642 4:b8ad57bbf9e1 515 int ret = server->getEqMount()->removeAlignmentStar(n);
caoyuan9642 4:b8ad57bbf9e1 516 if (server->getEqMount()->getNumAlignmentStar() == 0){
caoyuan9642 4:b8ad57bbf9e1 517 server->getEqMount()->clearCalibrationExceptOffsets();
caoyuan9642 4:b8ad57bbf9e1 518 }
caoyuan9642 4:b8ad57bbf9e1 519 return ret;
caoyuan9642 0:6cb2eaf8b133 520 }
caoyuan9642 0:6cb2eaf8b133 521 else if (strcmp(argv[0], "show") == 0)
caoyuan9642 0:6cb2eaf8b133 522 {
caoyuan9642 0:6cb2eaf8b133 523 if (argn == 1)
caoyuan9642 0:6cb2eaf8b133 524 {
caoyuan9642 4:b8ad57bbf9e1 525 stprintf(server->getStream(), "%s offset %.8f %.8f\r\n", cmd,
caoyuan9642 0:6cb2eaf8b133 526 server->getEqMount()->getCalibration().offset.ra_off,
caoyuan9642 0:6cb2eaf8b133 527 server->getEqMount()->getCalibration().offset.dec_off);
caoyuan9642 4:b8ad57bbf9e1 528 stprintf(server->getStream(), "%s pa %.8f %.8f\r\n", cmd,
caoyuan9642 0:6cb2eaf8b133 529 server->getEqMount()->getCalibration().pa.alt,
caoyuan9642 0:6cb2eaf8b133 530 server->getEqMount()->getCalibration().pa.azi);
caoyuan9642 4:b8ad57bbf9e1 531 stprintf(server->getStream(), "%s cone %.8f\r\n", cmd,
caoyuan9642 0:6cb2eaf8b133 532 server->getEqMount()->getCalibration().cone);
caoyuan9642 4:b8ad57bbf9e1 533 stprintf(server->getStream(), "%s error %g\r\n", cmd,
caoyuan9642 0:6cb2eaf8b133 534 server->getEqMount()->getCalibration().error);
caoyuan9642 0:6cb2eaf8b133 535 }
caoyuan9642 0:6cb2eaf8b133 536 else if (argn == 2)
caoyuan9642 0:6cb2eaf8b133 537 {
caoyuan9642 0:6cb2eaf8b133 538 if (strcmp(argv[1], "num") == 0)
caoyuan9642 0:6cb2eaf8b133 539 {
caoyuan9642 4:b8ad57bbf9e1 540 stprintf(server->getStream(), "%s %d\r\n", cmd,
caoyuan9642 0:6cb2eaf8b133 541 server->getEqMount()->getNumAlignmentStar());
caoyuan9642 0:6cb2eaf8b133 542 }
caoyuan9642 0:6cb2eaf8b133 543 else
caoyuan9642 0:6cb2eaf8b133 544 {
caoyuan9642 0:6cb2eaf8b133 545 char *tp;
caoyuan9642 0:6cb2eaf8b133 546 int index = strtol(argv[1], &tp, 0);
caoyuan9642 0:6cb2eaf8b133 547 if (tp == argv[1]
caoyuan9642 0:6cb2eaf8b133 548 || index >= server->getEqMount()->getNumAlignmentStar()
caoyuan9642 0:6cb2eaf8b133 549 || index < 0)
caoyuan9642 0:6cb2eaf8b133 550 {
caoyuan9642 0:6cb2eaf8b133 551 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 552 }
caoyuan9642 0:6cb2eaf8b133 553 AlignmentStar *as = server->getEqMount()->getAlignmentStar(
caoyuan9642 0:6cb2eaf8b133 554 index);
caoyuan9642 0:6cb2eaf8b133 555 if (!as)
caoyuan9642 0:6cb2eaf8b133 556 {
caoyuan9642 0:6cb2eaf8b133 557 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 558 }
caoyuan9642 4:b8ad57bbf9e1 559 stprintf(server->getStream(), "%s %.8f %.8f %.8f %.8f %d\r\n",
caoyuan9642 0:6cb2eaf8b133 560 cmd, as->star_ref.ra, as->star_ref.dec,
caoyuan9642 0:6cb2eaf8b133 561 as->star_meas.ra_delta, as->star_meas.dec_delta,
caoyuan9642 0:6cb2eaf8b133 562 as->timestamp);
caoyuan9642 0:6cb2eaf8b133 563 }
caoyuan9642 0:6cb2eaf8b133 564 }
caoyuan9642 0:6cb2eaf8b133 565 else
caoyuan9642 0:6cb2eaf8b133 566 {
caoyuan9642 0:6cb2eaf8b133 567 return ERR_WRONG_NUM_PARAM;
caoyuan9642 0:6cb2eaf8b133 568 }
caoyuan9642 0:6cb2eaf8b133 569 }
caoyuan9642 0:6cb2eaf8b133 570 else if (strcmp(argv[0], "clear") == 0)
caoyuan9642 0:6cb2eaf8b133 571 {
caoyuan9642 0:6cb2eaf8b133 572 if (argn != 1)
caoyuan9642 0:6cb2eaf8b133 573 {
caoyuan9642 0:6cb2eaf8b133 574 return ERR_WRONG_NUM_PARAM;
caoyuan9642 0:6cb2eaf8b133 575 }
caoyuan9642 0:6cb2eaf8b133 576 server->getEqMount()->clearCalibration();
caoyuan9642 0:6cb2eaf8b133 577 }
caoyuan9642 0:6cb2eaf8b133 578 else if (strcmp(argv[0], "convert") == 0)
caoyuan9642 0:6cb2eaf8b133 579 {
caoyuan9642 0:6cb2eaf8b133 580 if (argn != 4)
caoyuan9642 0:6cb2eaf8b133 581 {
caoyuan9642 0:6cb2eaf8b133 582 return ERR_WRONG_NUM_PARAM;
caoyuan9642 0:6cb2eaf8b133 583 }
caoyuan9642 0:6cb2eaf8b133 584 char *tp;
caoyuan9642 0:6cb2eaf8b133 585 double ra = strtod(argv[2], &tp);
caoyuan9642 0:6cb2eaf8b133 586 if (tp == argv[2])
caoyuan9642 0:6cb2eaf8b133 587 {
caoyuan9642 0:6cb2eaf8b133 588 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 589 }
caoyuan9642 0:6cb2eaf8b133 590 double dec = strtod(argv[3], &tp);
caoyuan9642 0:6cb2eaf8b133 591 if (tp == argv[3])
caoyuan9642 0:6cb2eaf8b133 592 {
caoyuan9642 0:6cb2eaf8b133 593 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 594 }
caoyuan9642 0:6cb2eaf8b133 595 if (strcmp(argv[1], "mount") == 0)
caoyuan9642 0:6cb2eaf8b133 596 {
caoyuan9642 0:6cb2eaf8b133 597 // Convert to eq
caoyuan9642 0:6cb2eaf8b133 598 EquatorialCoordinates eq =
caoyuan9642 0:6cb2eaf8b133 599 server->getEqMount()->convertToEqCoordinates(
caoyuan9642 0:6cb2eaf8b133 600 MountCoordinates(dec, ra));
caoyuan9642 4:b8ad57bbf9e1 601 stprintf(server->getStream(), "%s %.8f %.8f\r\n", cmd, eq.ra, eq.dec);
caoyuan9642 0:6cb2eaf8b133 602 }
caoyuan9642 0:6cb2eaf8b133 603 else if (strcmp(argv[1], "eq") == 0)
caoyuan9642 0:6cb2eaf8b133 604 {
caoyuan9642 0:6cb2eaf8b133 605 // Convert to eq
caoyuan9642 0:6cb2eaf8b133 606 MountCoordinates mc =
caoyuan9642 0:6cb2eaf8b133 607 server->getEqMount()->convertToMountCoordinates(
caoyuan9642 0:6cb2eaf8b133 608 EquatorialCoordinates(dec, ra));
caoyuan9642 4:b8ad57bbf9e1 609 stprintf(server->getStream(), "%s %.8f %.8f\r\n", cmd, mc.ra_delta,
caoyuan9642 0:6cb2eaf8b133 610 mc.dec_delta);
caoyuan9642 0:6cb2eaf8b133 611 }
caoyuan9642 0:6cb2eaf8b133 612 else
caoyuan9642 0:6cb2eaf8b133 613 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 614 }
caoyuan9642 4:b8ad57bbf9e1 615 else if (strcmp(argv[0], "set") == 0)
caoyuan9642 4:b8ad57bbf9e1 616 {
caoyuan9642 4:b8ad57bbf9e1 617 if (argn != 6)
caoyuan9642 4:b8ad57bbf9e1 618 {
caoyuan9642 4:b8ad57bbf9e1 619 stprintf(server->getStream(),
caoyuan9642 4:b8ad57bbf9e1 620 "%s usage: align set [offset_ra] [offset_dec] [pa_alt] [pa_az] [cone]\r\n", cmd);
caoyuan9642 4:b8ad57bbf9e1 621 return ERR_WRONG_NUM_PARAM;
caoyuan9642 4:b8ad57bbf9e1 622 }
caoyuan9642 4:b8ad57bbf9e1 623 char *tp;
caoyuan9642 4:b8ad57bbf9e1 624 EqCalibration calib;
caoyuan9642 4:b8ad57bbf9e1 625 calib.offset.ra_off = strtod(argv[1], &tp);
caoyuan9642 4:b8ad57bbf9e1 626 if (tp == argv[1])
caoyuan9642 4:b8ad57bbf9e1 627 {
caoyuan9642 4:b8ad57bbf9e1 628 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 4:b8ad57bbf9e1 629 }
caoyuan9642 4:b8ad57bbf9e1 630 calib.offset.dec_off = strtod(argv[2], &tp);
caoyuan9642 4:b8ad57bbf9e1 631 if (tp == argv[2])
caoyuan9642 4:b8ad57bbf9e1 632 {
caoyuan9642 4:b8ad57bbf9e1 633 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 4:b8ad57bbf9e1 634 }
caoyuan9642 4:b8ad57bbf9e1 635 calib.pa.alt = strtod(argv[3], &tp);
caoyuan9642 4:b8ad57bbf9e1 636 if (tp == argv[3])
caoyuan9642 4:b8ad57bbf9e1 637 {
caoyuan9642 4:b8ad57bbf9e1 638 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 4:b8ad57bbf9e1 639 }
caoyuan9642 4:b8ad57bbf9e1 640 calib.pa.azi = strtod(argv[4], &tp);
caoyuan9642 4:b8ad57bbf9e1 641 if (tp == argv[4])
caoyuan9642 4:b8ad57bbf9e1 642 {
caoyuan9642 4:b8ad57bbf9e1 643 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 4:b8ad57bbf9e1 644 }
caoyuan9642 4:b8ad57bbf9e1 645 calib.cone = strtod(argv[5], &tp);
caoyuan9642 4:b8ad57bbf9e1 646 if (tp == argv[5])
caoyuan9642 4:b8ad57bbf9e1 647 {
caoyuan9642 4:b8ad57bbf9e1 648 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 4:b8ad57bbf9e1 649 }
caoyuan9642 4:b8ad57bbf9e1 650
caoyuan9642 4:b8ad57bbf9e1 651 server->getEqMount()->setCalibration(calib);
caoyuan9642 4:b8ad57bbf9e1 652 }
caoyuan9642 4:b8ad57bbf9e1 653 else if (strcmp(argv[0], "force") == 0)
caoyuan9642 4:b8ad57bbf9e1 654 {
caoyuan9642 4:b8ad57bbf9e1 655 if (argn != 1)
caoyuan9642 4:b8ad57bbf9e1 656 {
caoyuan9642 4:b8ad57bbf9e1 657 return ERR_WRONG_NUM_PARAM;
caoyuan9642 4:b8ad57bbf9e1 658 }
caoyuan9642 4:b8ad57bbf9e1 659 server->getEqMount()->forceAlignment();
caoyuan9642 4:b8ad57bbf9e1 660 }
caoyuan9642 4:b8ad57bbf9e1 661 else if (strcmp(argv[0], "update") == 0)
caoyuan9642 4:b8ad57bbf9e1 662 {
caoyuan9642 4:b8ad57bbf9e1 663 if (argn != 1)
caoyuan9642 4:b8ad57bbf9e1 664 {
caoyuan9642 4:b8ad57bbf9e1 665 return ERR_WRONG_NUM_PARAM;
caoyuan9642 4:b8ad57bbf9e1 666 }
caoyuan9642 4:b8ad57bbf9e1 667 server->getEqMount()->recalibrate();
caoyuan9642 4:b8ad57bbf9e1 668 }
caoyuan9642 0:6cb2eaf8b133 669 else
caoyuan9642 0:6cb2eaf8b133 670 {
caoyuan9642 0:6cb2eaf8b133 671 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 672 }
caoyuan9642 0:6cb2eaf8b133 673 return 0;
caoyuan9642 0:6cb2eaf8b133 674 }
caoyuan9642 0:6cb2eaf8b133 675
caoyuan9642 0:6cb2eaf8b133 676 static int eqmount_nudge(EqMountServer *server, const char *cmd, int argn,
caoyuan9642 0:6cb2eaf8b133 677 char *argv[])
caoyuan9642 0:6cb2eaf8b133 678 {
caoyuan9642 0:6cb2eaf8b133 679 if (argn != 1 && argn != 2)
caoyuan9642 0:6cb2eaf8b133 680 {
caoyuan9642 0:6cb2eaf8b133 681 return ERR_WRONG_NUM_PARAM;
caoyuan9642 0:6cb2eaf8b133 682 }
caoyuan9642 0:6cb2eaf8b133 683 int dir = 0;
caoyuan9642 0:6cb2eaf8b133 684 for (int i = 0; i < argn; i++)
caoyuan9642 0:6cb2eaf8b133 685 {
caoyuan9642 0:6cb2eaf8b133 686 if (strcmp(argv[i], "south") == 0)
caoyuan9642 0:6cb2eaf8b133 687 dir |= NUDGE_SOUTH;
caoyuan9642 0:6cb2eaf8b133 688 else if (strcmp(argv[i], "north") == 0)
caoyuan9642 0:6cb2eaf8b133 689 dir |= NUDGE_NORTH;
caoyuan9642 0:6cb2eaf8b133 690 else if (strcmp(argv[i], "east") == 0)
caoyuan9642 0:6cb2eaf8b133 691 dir |= NUDGE_EAST;
caoyuan9642 0:6cb2eaf8b133 692 else if (strcmp(argv[i], "west") == 0)
caoyuan9642 0:6cb2eaf8b133 693 dir |= NUDGE_WEST;
caoyuan9642 0:6cb2eaf8b133 694 else if (strcmp(argv[i], "stop") == 0)
caoyuan9642 0:6cb2eaf8b133 695 {
caoyuan9642 0:6cb2eaf8b133 696 // STOP nudging
caoyuan9642 0:6cb2eaf8b133 697 dir = NUDGE_NONE;
caoyuan9642 0:6cb2eaf8b133 698 break;
caoyuan9642 0:6cb2eaf8b133 699 }
caoyuan9642 0:6cb2eaf8b133 700 else
caoyuan9642 0:6cb2eaf8b133 701 {
caoyuan9642 0:6cb2eaf8b133 702 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 703 }
caoyuan9642 0:6cb2eaf8b133 704 }
caoyuan9642 0:6cb2eaf8b133 705
caoyuan9642 0:6cb2eaf8b133 706 osStatus s;
caoyuan9642 0:6cb2eaf8b133 707 if ((s = server->getEqMount()->startNudge((nudgedir_t) dir)) != osOK)
caoyuan9642 0:6cb2eaf8b133 708 return s;
caoyuan9642 0:6cb2eaf8b133 709
caoyuan9642 0:6cb2eaf8b133 710 return 0;
caoyuan9642 0:6cb2eaf8b133 711 }
caoyuan9642 0:6cb2eaf8b133 712
caoyuan9642 0:6cb2eaf8b133 713 static int eqmount_track(EqMountServer *server, const char *cmd, int argn,
caoyuan9642 0:6cb2eaf8b133 714 char *argv[])
caoyuan9642 0:6cb2eaf8b133 715 {
caoyuan9642 0:6cb2eaf8b133 716 if (argn != 0)
caoyuan9642 0:6cb2eaf8b133 717 {
caoyuan9642 0:6cb2eaf8b133 718 return ERR_WRONG_NUM_PARAM;
caoyuan9642 0:6cb2eaf8b133 719 }
caoyuan9642 0:6cb2eaf8b133 720 osStatus s;
caoyuan9642 0:6cb2eaf8b133 721 if ((s = server->getEqMount()->startTracking()) != osOK)
caoyuan9642 0:6cb2eaf8b133 722 return s;
caoyuan9642 0:6cb2eaf8b133 723 return 0;
caoyuan9642 0:6cb2eaf8b133 724 }
caoyuan9642 0:6cb2eaf8b133 725
caoyuan9642 0:6cb2eaf8b133 726 static int eqmount_read(EqMountServer *server, const char *cmd, int argn,
caoyuan9642 0:6cb2eaf8b133 727 char *argv[])
caoyuan9642 0:6cb2eaf8b133 728 {
caoyuan9642 0:6cb2eaf8b133 729
caoyuan9642 0:6cb2eaf8b133 730 if (argn == 0)
caoyuan9642 0:6cb2eaf8b133 731 {
caoyuan9642 0:6cb2eaf8b133 732 EquatorialCoordinates eq =
caoyuan9642 0:6cb2eaf8b133 733 server->getEqMount()->getEquatorialCoordinates();
caoyuan9642 0:6cb2eaf8b133 734 stprintf(server->getStream(), "%s %.8f %.8f\r\n", cmd, eq.ra, eq.dec);
caoyuan9642 0:6cb2eaf8b133 735 }
caoyuan9642 0:6cb2eaf8b133 736 else if (argn == 1)
caoyuan9642 0:6cb2eaf8b133 737 {
caoyuan9642 0:6cb2eaf8b133 738 if (strcmp(argv[0], "eq") == 0)
caoyuan9642 0:6cb2eaf8b133 739 {
caoyuan9642 0:6cb2eaf8b133 740 EquatorialCoordinates eq =
caoyuan9642 0:6cb2eaf8b133 741 server->getEqMount()->getEquatorialCoordinates();
caoyuan9642 0:6cb2eaf8b133 742 stprintf(server->getStream(), "%s %.8f %.8f\r\n", cmd, eq.ra,
caoyuan9642 0:6cb2eaf8b133 743 eq.dec);
caoyuan9642 0:6cb2eaf8b133 744 }
caoyuan9642 0:6cb2eaf8b133 745 else if (strcmp(argv[0], "mount") == 0)
caoyuan9642 0:6cb2eaf8b133 746 {
caoyuan9642 0:6cb2eaf8b133 747 MountCoordinates mc = server->getEqMount()->getMountCoordinates();
caoyuan9642 0:6cb2eaf8b133 748 stprintf(server->getStream(), "%s %.8f %.8f %c\r\n", cmd,
caoyuan9642 0:6cb2eaf8b133 749 mc.ra_delta, mc.dec_delta,
caoyuan9642 0:6cb2eaf8b133 750 (mc.side == PIER_SIDE_WEST) ? 'W' : 'E');
caoyuan9642 0:6cb2eaf8b133 751 }
caoyuan9642 0:6cb2eaf8b133 752 else
caoyuan9642 0:6cb2eaf8b133 753 {
caoyuan9642 0:6cb2eaf8b133 754 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 755 }
caoyuan9642 0:6cb2eaf8b133 756 }
caoyuan9642 0:6cb2eaf8b133 757 else
caoyuan9642 0:6cb2eaf8b133 758 {
caoyuan9642 0:6cb2eaf8b133 759 return ERR_WRONG_NUM_PARAM;
caoyuan9642 0:6cb2eaf8b133 760 }
caoyuan9642 0:6cb2eaf8b133 761
caoyuan9642 0:6cb2eaf8b133 762 return 0;
caoyuan9642 0:6cb2eaf8b133 763 }
caoyuan9642 0:6cb2eaf8b133 764
caoyuan9642 0:6cb2eaf8b133 765 static int eqmount_state(EqMountServer *server, const char *cmd, int argn,
caoyuan9642 0:6cb2eaf8b133 766 char *argv[])
caoyuan9642 0:6cb2eaf8b133 767 {
caoyuan9642 0:6cb2eaf8b133 768
caoyuan9642 0:6cb2eaf8b133 769 if (argn == 0)
caoyuan9642 0:6cb2eaf8b133 770 {
caoyuan9642 0:6cb2eaf8b133 771 const char *s;
caoyuan9642 0:6cb2eaf8b133 772 switch (server->getEqMount()->getStatus())
caoyuan9642 0:6cb2eaf8b133 773 {
caoyuan9642 0:6cb2eaf8b133 774 case MOUNT_STOPPED:
caoyuan9642 0:6cb2eaf8b133 775 s = "stopped";
caoyuan9642 0:6cb2eaf8b133 776 break;
caoyuan9642 0:6cb2eaf8b133 777 case MOUNT_SLEWING:
caoyuan9642 0:6cb2eaf8b133 778 s = "slewing";
caoyuan9642 0:6cb2eaf8b133 779 break;
caoyuan9642 0:6cb2eaf8b133 780 case MOUNT_TRACKING:
caoyuan9642 0:6cb2eaf8b133 781 s = "tracking";
caoyuan9642 0:6cb2eaf8b133 782 break;
caoyuan9642 2:2ee28add0821 783 case MOUNT_TRACKING | MOUNT_GUIDING:
caoyuan9642 2:2ee28add0821 784 s = "tracking_guiding";
caoyuan9642 2:2ee28add0821 785 break;
caoyuan9642 0:6cb2eaf8b133 786 case MOUNT_NUDGING:
caoyuan9642 0:6cb2eaf8b133 787 s = "nudging";
caoyuan9642 0:6cb2eaf8b133 788 break;
caoyuan9642 0:6cb2eaf8b133 789 case MOUNT_NUDGING_TRACKING:
caoyuan9642 0:6cb2eaf8b133 790 s = "nudging_tracking";
caoyuan9642 0:6cb2eaf8b133 791 break;
caoyu@caoyuan9642-desktop.MIT.EDU 15:0bdda8dadafe 792 default:
caoyu@caoyuan9642-desktop.MIT.EDU 15:0bdda8dadafe 793 s = "undefined";
caoyuan9642 0:6cb2eaf8b133 794 }
caoyuan9642 0:6cb2eaf8b133 795 stprintf(server->getStream(), "%s %s\r\n", cmd, s);
caoyuan9642 0:6cb2eaf8b133 796 }
caoyuan9642 0:6cb2eaf8b133 797 else
caoyuan9642 0:6cb2eaf8b133 798 {
caoyuan9642 0:6cb2eaf8b133 799 return ERR_WRONG_NUM_PARAM;
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_help(EqMountServer *server, const char *cmd, int argn,
caoyuan9642 0:6cb2eaf8b133 806 char *argv[])
caoyuan9642 0:6cb2eaf8b133 807 {
caoyuan9642 0:6cb2eaf8b133 808 stprintf(server->getStream(), "%s Available commands: \r\n", cmd);
caoyuan9642 0:6cb2eaf8b133 809 for (int i = 0; i < MAX_COMMAND; i++)
caoyuan9642 0:6cb2eaf8b133 810 {
caoyuan9642 0:6cb2eaf8b133 811 if (commandlist[i].fptr == NULL)
caoyuan9642 0:6cb2eaf8b133 812 break;
caoyuan9642 0:6cb2eaf8b133 813 stprintf(server->getStream(), "%s - %s : %s\r\n", cmd,
caoyuan9642 0:6cb2eaf8b133 814 commandlist[i].cmd, commandlist[i].desc);
caoyuan9642 0:6cb2eaf8b133 815 }
caoyuan9642 0:6cb2eaf8b133 816 return 0;
caoyuan9642 0:6cb2eaf8b133 817 }
caoyuan9642 0:6cb2eaf8b133 818
caoyuan9642 0:6cb2eaf8b133 819 static int eqmount_guide(EqMountServer *server, const char *cmd, int argn,
caoyuan9642 0:6cb2eaf8b133 820 char *argv[])
caoyuan9642 0:6cb2eaf8b133 821 {
caoyuan9642 0:6cb2eaf8b133 822
caoyuan9642 0:6cb2eaf8b133 823 if (argn != 2)
caoyuan9642 0:6cb2eaf8b133 824 {
caoyuan9642 0:6cb2eaf8b133 825 stprintf(server->getStream(),
caoyuan9642 0:6cb2eaf8b133 826 "%s Usage: guide {north|west|south|east} milliseconds\r\n",
caoyuan9642 0:6cb2eaf8b133 827 cmd);
caoyuan9642 0:6cb2eaf8b133 828 return ERR_WRONG_NUM_PARAM;
caoyuan9642 0:6cb2eaf8b133 829 }
caoyuan9642 0:6cb2eaf8b133 830
caoyuan9642 0:6cb2eaf8b133 831 char *tp;
caoyuan9642 0:6cb2eaf8b133 832 int ms = strtod(argv[1], &tp);
caoyuan9642 0:6cb2eaf8b133 833 if (tp == argv[1] || ms < 1
caoyuan9642 0:6cb2eaf8b133 834 || ms > TelescopeConfiguration::getInt("max_guide_time"))
caoyuan9642 0:6cb2eaf8b133 835 {
caoyuan9642 0:6cb2eaf8b133 836 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 837 }
caoyuan9642 0:6cb2eaf8b133 838
caoyuan9642 0:6cb2eaf8b133 839 if (strcmp("north", argv[0]) == 0)
caoyuan9642 0:6cb2eaf8b133 840 {
caoyuan9642 0:6cb2eaf8b133 841 return server->getEqMount()->guide(GUIDE_NORTH, ms);
caoyuan9642 0:6cb2eaf8b133 842 }
caoyuan9642 0:6cb2eaf8b133 843 else if (strcmp("south", argv[0]) == 0)
caoyuan9642 0:6cb2eaf8b133 844 {
caoyuan9642 0:6cb2eaf8b133 845 return server->getEqMount()->guide(GUIDE_SOUTH, ms);
caoyuan9642 0:6cb2eaf8b133 846 }
caoyuan9642 0:6cb2eaf8b133 847 else if (strcmp("west", argv[0]) == 0)
caoyuan9642 0:6cb2eaf8b133 848 {
caoyuan9642 0:6cb2eaf8b133 849 return server->getEqMount()->guide(GUIDE_WEST, ms);
caoyuan9642 0:6cb2eaf8b133 850 }
caoyuan9642 0:6cb2eaf8b133 851 else if (strcmp("east", argv[0]) == 0)
caoyuan9642 0:6cb2eaf8b133 852 {
caoyuan9642 0:6cb2eaf8b133 853 return server->getEqMount()->guide(GUIDE_EAST, ms);
caoyuan9642 0:6cb2eaf8b133 854 }
caoyuan9642 0:6cb2eaf8b133 855 else
caoyuan9642 0:6cb2eaf8b133 856 {
caoyuan9642 0:6cb2eaf8b133 857 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 858 }
caoyuan9642 0:6cb2eaf8b133 859
caoyuan9642 0:6cb2eaf8b133 860 return 0;
caoyuan9642 0:6cb2eaf8b133 861 }
caoyuan9642 0:6cb2eaf8b133 862
caoyuan9642 0:6cb2eaf8b133 863 static int eqmount_time(EqMountServer *server, const char *cmd, int argn,
caoyuan9642 0:6cb2eaf8b133 864 char *argv[])
caoyuan9642 0:6cb2eaf8b133 865 {
caoyuan9642 0:6cb2eaf8b133 866 char buf[32];
caoyuan9642 0:6cb2eaf8b133 867 //Get time
caoyuan9642 0:6cb2eaf8b133 868 time_t t = server->getEqMount()->getClock().getTime();
caoyuan9642 0:6cb2eaf8b133 869
caoyuan9642 0:6cb2eaf8b133 870 if (argn >= 2)
caoyuan9642 0:6cb2eaf8b133 871 {
caoyuan9642 0:6cb2eaf8b133 872 return ERR_WRONG_NUM_PARAM;
caoyuan9642 0:6cb2eaf8b133 873 }
caoyuan9642 0:6cb2eaf8b133 874 else if (argn == 1)
caoyuan9642 0:6cb2eaf8b133 875 {
caoyuan9642 0:6cb2eaf8b133 876 if (strcmp(argv[0], "stamp") == 0)
caoyuan9642 0:6cb2eaf8b133 877 {
caoyuan9642 0:6cb2eaf8b133 878 // Print timestamp value
caoyu@caoyuan9642-desktop.MIT.EDU 11:ec6af14e7816 879 stprintf(server->getStream(), "%s %d\r\n", cmd, (uint32_t) t);
caoyuan9642 0:6cb2eaf8b133 880 return 0;
caoyuan9642 0:6cb2eaf8b133 881 }
caoyuan9642 0:6cb2eaf8b133 882 else if (strcmp(argv[0], "sidereal") == 0)
caoyuan9642 0:6cb2eaf8b133 883 {
caoyuan9642 0:6cb2eaf8b133 884 // Print sidereal time at current location
caoyuan9642 0:6cb2eaf8b133 885 // 0.0 is sidereal midnight, 180/-180 is sidereal noon
caoyuan9642 0:6cb2eaf8b133 886 double st = CelestialMath::getLocalSiderealTime(t,
caoyuan9642 0:6cb2eaf8b133 887 server->getEqMount()->getLocation());
caoyuan9642 0:6cb2eaf8b133 888 // int hh = ((int) floor(st / 15) + 24) % 24;
caoyuan9642 0:6cb2eaf8b133 889 // int mm = (int) floor((st + 360.0 - hh * 15) * 4) % 60;
caoyuan9642 0:6cb2eaf8b133 890 // int ss = (int) floor((st + 360.0 - hh * 15 - mm * 0.25) * 240) % 60;
caoyuan9642 0:6cb2eaf8b133 891 stprintf(server->getStream(), "%s %f\r\n", cmd, st);
caoyuan9642 0:6cb2eaf8b133 892 // stprintf(server->getStream(), "%d:%d:%d LST\r\n", hh, mm, ss);
caoyuan9642 0:6cb2eaf8b133 893 return 0;
caoyuan9642 0:6cb2eaf8b133 894 }
caoyuan9642 0:6cb2eaf8b133 895 else if (strcmp(argv[0], "local") == 0)
caoyuan9642 0:6cb2eaf8b133 896 {
caoyuan9642 0:6cb2eaf8b133 897 t += (int) (remainder(server->getEqMount()->getLocation().lon, 360)
caoyuan9642 0:6cb2eaf8b133 898 * 240);
caoyu@caoyuan9642-desktop.MIT.EDU 10:e356188d208e 899
caoyu@caoyuan9642-desktop.MIT.EDU 10:e356188d208e 900
caoyuan9642 12:35f5cb75743e 901 #if !( defined(__ARMCC_VERSION) || defined(__CC_ARM) )
caoyu@caoyuan9642-desktop.MIT.EDU 10:e356188d208e 902 char ibuf[64];
caoyu@caoyuan9642-desktop.MIT.EDU 10:e356188d208e 903 ctime_r(&t, ibuf);
caoyu@caoyuan9642-desktop.MIT.EDU 10:e356188d208e 904 strncpy(buf, ibuf, sizeof(buf));
caoyu@caoyuan9642-desktop.MIT.EDU 10:e356188d208e 905 #else
caoyuan9642 1:a4d5537de7ae 906 core_util_critical_section_enter();
caoyuan9642 1:a4d5537de7ae 907 char *ibuf = ctime(&t);
caoyuan9642 1:a4d5537de7ae 908 strncpy(buf, ibuf, sizeof(buf));
caoyuan9642 1:a4d5537de7ae 909 core_util_critical_section_exit();
caoyu@caoyuan9642-desktop.MIT.EDU 10:e356188d208e 910 #endif
caoyuan9642 1:a4d5537de7ae 911
caoyuan9642 0:6cb2eaf8b133 912 stprintf(server->getStream(), "%s %s\r\n", cmd, buf);
caoyuan9642 0:6cb2eaf8b133 913 return 0;
caoyuan9642 0:6cb2eaf8b133 914 }
caoyuan9642 0:6cb2eaf8b133 915 else if (strcmp(argv[0], "zone") == 0)
caoyuan9642 0:6cb2eaf8b133 916 {
caoyuan9642 0:6cb2eaf8b133 917 t += (int) (TelescopeConfiguration::getInt("timezone") * 3600);
caoyu@caoyuan9642-desktop.MIT.EDU 10:e356188d208e 918
caoyuan9642 12:35f5cb75743e 919 #if !( defined(__ARMCC_VERSION) || defined(__CC_ARM) )
caoyu@caoyuan9642-desktop.MIT.EDU 10:e356188d208e 920 char ibuf[64];
caoyu@caoyuan9642-desktop.MIT.EDU 10:e356188d208e 921 ctime_r(&t, ibuf);
caoyu@caoyuan9642-desktop.MIT.EDU 10:e356188d208e 922 strncpy(buf, ibuf, sizeof(buf));
caoyu@caoyuan9642-desktop.MIT.EDU 10:e356188d208e 923 #else
caoyuan9642 1:a4d5537de7ae 924 core_util_critical_section_enter();
caoyuan9642 1:a4d5537de7ae 925 char *ibuf = ctime(&t);
caoyuan9642 1:a4d5537de7ae 926 strncpy(buf, ibuf, sizeof(buf));
caoyuan9642 1:a4d5537de7ae 927 core_util_critical_section_exit();
caoyu@caoyuan9642-desktop.MIT.EDU 10:e356188d208e 928 #endif
caoyuan9642 1:a4d5537de7ae 929
caoyuan9642 0:6cb2eaf8b133 930 stprintf(server->getStream(), "%s %s\r\n", cmd, buf);
caoyuan9642 0:6cb2eaf8b133 931 return 0;
caoyuan9642 0:6cb2eaf8b133 932 }
caoyuan9642 0:6cb2eaf8b133 933
caoyuan9642 0:6cb2eaf8b133 934 }
caoyuan9642 0:6cb2eaf8b133 935
caoyuan9642 0:6cb2eaf8b133 936 // Print of formatted string of current time
caoyu@caoyuan9642-desktop.MIT.EDU 10:e356188d208e 937
caoyuan9642 12:35f5cb75743e 938 #if !( defined(__ARMCC_VERSION) || defined(__CC_ARM) )
caoyu@caoyuan9642-desktop.MIT.EDU 10:e356188d208e 939 char ibuf[64];
caoyu@caoyuan9642-desktop.MIT.EDU 10:e356188d208e 940 ctime_r(&t, ibuf);
caoyu@caoyuan9642-desktop.MIT.EDU 10:e356188d208e 941 strncpy(buf, ibuf, sizeof(buf));
caoyu@caoyuan9642-desktop.MIT.EDU 10:e356188d208e 942 #else
caoyuan9642 1:a4d5537de7ae 943 core_util_critical_section_enter();
caoyuan9642 1:a4d5537de7ae 944 char *ibuf = ctime(&t);
caoyuan9642 1:a4d5537de7ae 945 strncpy(buf, ibuf, sizeof(buf));
caoyuan9642 1:a4d5537de7ae 946 core_util_critical_section_exit();
caoyu@caoyuan9642-desktop.MIT.EDU 10:e356188d208e 947 #endif
caoyuan9642 1:a4d5537de7ae 948
caoyuan9642 0:6cb2eaf8b133 949 stprintf(server->getStream(), "%s %s\r\n", cmd, buf);
caoyuan9642 0:6cb2eaf8b133 950
caoyuan9642 0:6cb2eaf8b133 951 return 0;
caoyuan9642 0:6cb2eaf8b133 952 }
caoyuan9642 0:6cb2eaf8b133 953
caoyuan9642 0:6cb2eaf8b133 954 static int eqmount_settime(EqMountServer *server, const char *cmd, int argn,
caoyuan9642 0:6cb2eaf8b133 955 char *argv[])
caoyuan9642 0:6cb2eaf8b133 956 {
caoyuan9642 0:6cb2eaf8b133 957 if (argn == 1)
caoyuan9642 0:6cb2eaf8b133 958 {
caoyuan9642 0:6cb2eaf8b133 959 //Use the first argument as UTC timestamp
caoyuan9642 0:6cb2eaf8b133 960 time_t t = strtol(argv[0], NULL, 10);
caoyuan9642 0:6cb2eaf8b133 961 server->getEqMount()->getClock().setTime(t);
caoyuan9642 0:6cb2eaf8b133 962 }
caoyuan9642 0:6cb2eaf8b133 963 else if (argn == 6)
caoyuan9642 0:6cb2eaf8b133 964 {
caoyuan9642 0:6cb2eaf8b133 965 int year = strtol(argv[0], NULL, 10);
caoyuan9642 0:6cb2eaf8b133 966 int month = strtol(argv[1], NULL, 10);
caoyuan9642 0:6cb2eaf8b133 967 int day = strtol(argv[2], NULL, 10);
caoyuan9642 0:6cb2eaf8b133 968 int hour = strtol(argv[3], NULL, 10);
caoyuan9642 0:6cb2eaf8b133 969 int min = strtol(argv[4], NULL, 10);
caoyuan9642 0:6cb2eaf8b133 970 int sec = strtol(argv[5], NULL, 10);
caoyuan9642 0:6cb2eaf8b133 971 struct tm ts;
caoyuan9642 0:6cb2eaf8b133 972 ts.tm_sec = sec;
caoyuan9642 0:6cb2eaf8b133 973 ts.tm_min = min;
caoyuan9642 0:6cb2eaf8b133 974 ts.tm_hour = hour;
caoyuan9642 0:6cb2eaf8b133 975 ts.tm_mday = day;
caoyuan9642 0:6cb2eaf8b133 976 ts.tm_mon = month - 1;
caoyuan9642 0:6cb2eaf8b133 977 ts.tm_year = year - 1900;
caoyuan9642 0:6cb2eaf8b133 978 ts.tm_isdst = 0;
caoyuan9642 0:6cb2eaf8b133 979
caoyuan9642 0:6cb2eaf8b133 980 time_t t = mktime(&ts);
caoyuan9642 0:6cb2eaf8b133 981 if (t == -1)
caoyuan9642 0:6cb2eaf8b133 982 {
caoyuan9642 0:6cb2eaf8b133 983 // Parameter out of range
caoyuan9642 0:6cb2eaf8b133 984 return 2;
caoyuan9642 0:6cb2eaf8b133 985 }
caoyuan9642 0:6cb2eaf8b133 986
caoyuan9642 0:6cb2eaf8b133 987 server->getEqMount()->getClock().setTime(t);
caoyuan9642 0:6cb2eaf8b133 988 }
caoyuan9642 0:6cb2eaf8b133 989 else
caoyuan9642 0:6cb2eaf8b133 990 {
caoyuan9642 0:6cb2eaf8b133 991 stprintf(server->getStream(),
caoyuan9642 0:6cb2eaf8b133 992 "%s usage: settime <timestamp>, or, settime <year> <month> <day> <hour> <minute> <second> (UTC time should be used)\r\n",
caoyuan9642 0:6cb2eaf8b133 993 cmd);
caoyuan9642 0:6cb2eaf8b133 994 return 1;
caoyuan9642 0:6cb2eaf8b133 995 }
caoyuan9642 0:6cb2eaf8b133 996
caoyuan9642 0:6cb2eaf8b133 997 return 0;
caoyuan9642 0:6cb2eaf8b133 998 }
caoyuan9642 0:6cb2eaf8b133 999
caoyuan9642 0:6cb2eaf8b133 1000 void EqMountServer::addCommand(const ServerCommand& cmd)
caoyuan9642 0:6cb2eaf8b133 1001 {
caoyuan9642 0:6cb2eaf8b133 1002 int i = 0;
caoyuan9642 0:6cb2eaf8b133 1003 while (i < MAX_COMMAND && commandlist[i].fptr != NULL)
caoyuan9642 0:6cb2eaf8b133 1004 i++;
caoyuan9642 0:6cb2eaf8b133 1005 if (i >= MAX_COMMAND - 1)
caoyuan9642 0:6cb2eaf8b133 1006 {
caoyuan9642 0:6cb2eaf8b133 1007 debug("Error: max command reached.\n");
caoyuan9642 0:6cb2eaf8b133 1008 return;
caoyuan9642 0:6cb2eaf8b133 1009 }
caoyuan9642 0:6cb2eaf8b133 1010
caoyuan9642 0:6cb2eaf8b133 1011 commandlist[i] = cmd;
caoyuan9642 0:6cb2eaf8b133 1012 commandlist[++i] = ServerCommand("", "", NULL);
caoyuan9642 0:6cb2eaf8b133 1013 }
caoyuan9642 0:6cb2eaf8b133 1014
caoyuan9642 0:6cb2eaf8b133 1015 ServerCommand commandlist[MAX_COMMAND] =
caoyuan9642 0:6cb2eaf8b133 1016 { /// List of all commands
caoyuan9642 0:6cb2eaf8b133 1017 ServerCommand("stop", "Stop mount motion", eqmount_stop), /// Stop
caoyuan9642 0:6cb2eaf8b133 1018 ServerCommand("estop", "Emergency stop", eqmount_estop), /// Emergency Stop
caoyuan9642 0:6cb2eaf8b133 1019 ServerCommand("read", "Read current RA/DEC position", eqmount_read), /// Read Position
caoyuan9642 0:6cb2eaf8b133 1020 ServerCommand("time", "Get and set system time", eqmount_time), /// System time
caoyuan9642 0:6cb2eaf8b133 1021 ServerCommand("status", "Get the mount state", eqmount_state), /// System state
caoyuan9642 0:6cb2eaf8b133 1022 ServerCommand("help", "Print this help menu", eqmount_help), /// Help menu
caoyuan9642 0:6cb2eaf8b133 1023 ServerCommand("speed", "Set slew and tracking speed", eqmount_speed), /// Set speed
caoyuan9642 0:6cb2eaf8b133 1024 ServerCommand("align", "Star alignment", eqmount_align), /// Alignment
caoyuan9642 0:6cb2eaf8b133 1025 /// Above are allowed commands when another command is running
caoyuan9642 0:6cb2eaf8b133 1026
caoyuan9642 0:6cb2eaf8b133 1027 ServerCommand("goto",
caoyuan9642 0:6cb2eaf8b133 1028 "Perform go to operation to specified ra, dec coordinates",
caoyuan9642 0:6cb2eaf8b133 1029 eqmount_goto), /// Go to
caoyuan9642 0:6cb2eaf8b133 1030 ServerCommand("nudge", "Perform nudging on specified direction",
caoyuan9642 0:6cb2eaf8b133 1031 eqmount_nudge), /// Nudge
caoyuan9642 0:6cb2eaf8b133 1032 ServerCommand("track", "Start tracking in specified direction",
caoyuan9642 0:6cb2eaf8b133 1033 eqmount_track), /// Track
caoyuan9642 0:6cb2eaf8b133 1034 ServerCommand("guide", "Guide on specified direction",
caoyuan9642 0:6cb2eaf8b133 1035 eqmount_guide), /// Guide
caoyuan9642 0:6cb2eaf8b133 1036 ServerCommand("settime", "Set system time", eqmount_settime), /// System time
caoyuan9642 0:6cb2eaf8b133 1037 ServerCommand("", "", NULL) };
caoyuan9642 0:6cb2eaf8b133 1038
caoyuan9642 0:6cb2eaf8b133 1039