Telescope Control Library
EqMountServer.cpp@10:e356188d208e, 2018-09-14 (annotated)
- Committer:
- caoyu@caoyuan9642-desktop.MIT.EDU
- Date:
- Fri Sep 14 01:30:55 2018 -0400
- Revision:
- 10:e356188d208e
- Parent:
- 4:b8ad57bbf9e1
- Child:
- 11:ec6af14e7816
Resolved circular dependency. Slewing rate now only applies to indefinite slews. GOTO use goto_slew_speed in the configuration.
Who changed what in which revision?
User | Revision | Line number | New 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; |
caoyuan9642 | 0:6cb2eaf8b133 | 792 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 793 | stprintf(server->getStream(), "%s %s\r\n", cmd, s); |
caoyuan9642 | 0:6cb2eaf8b133 | 794 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 795 | else |
caoyuan9642 | 0:6cb2eaf8b133 | 796 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 797 | return ERR_WRONG_NUM_PARAM; |
caoyuan9642 | 0:6cb2eaf8b133 | 798 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 799 | |
caoyuan9642 | 0:6cb2eaf8b133 | 800 | return 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 801 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 802 | |
caoyuan9642 | 0:6cb2eaf8b133 | 803 | static int eqmount_help(EqMountServer *server, const char *cmd, int argn, |
caoyuan9642 | 0:6cb2eaf8b133 | 804 | char *argv[]) |
caoyuan9642 | 0:6cb2eaf8b133 | 805 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 806 | stprintf(server->getStream(), "%s Available commands: \r\n", cmd); |
caoyuan9642 | 0:6cb2eaf8b133 | 807 | for (int i = 0; i < MAX_COMMAND; i++) |
caoyuan9642 | 0:6cb2eaf8b133 | 808 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 809 | if (commandlist[i].fptr == NULL) |
caoyuan9642 | 0:6cb2eaf8b133 | 810 | break; |
caoyuan9642 | 0:6cb2eaf8b133 | 811 | stprintf(server->getStream(), "%s - %s : %s\r\n", cmd, |
caoyuan9642 | 0:6cb2eaf8b133 | 812 | commandlist[i].cmd, commandlist[i].desc); |
caoyuan9642 | 0:6cb2eaf8b133 | 813 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 814 | return 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 815 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 816 | |
caoyuan9642 | 0:6cb2eaf8b133 | 817 | static int eqmount_guide(EqMountServer *server, const char *cmd, int argn, |
caoyuan9642 | 0:6cb2eaf8b133 | 818 | char *argv[]) |
caoyuan9642 | 0:6cb2eaf8b133 | 819 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 820 | |
caoyuan9642 | 0:6cb2eaf8b133 | 821 | if (argn != 2) |
caoyuan9642 | 0:6cb2eaf8b133 | 822 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 823 | stprintf(server->getStream(), |
caoyuan9642 | 0:6cb2eaf8b133 | 824 | "%s Usage: guide {north|west|south|east} milliseconds\r\n", |
caoyuan9642 | 0:6cb2eaf8b133 | 825 | cmd); |
caoyuan9642 | 0:6cb2eaf8b133 | 826 | return ERR_WRONG_NUM_PARAM; |
caoyuan9642 | 0:6cb2eaf8b133 | 827 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 828 | |
caoyuan9642 | 0:6cb2eaf8b133 | 829 | char *tp; |
caoyuan9642 | 0:6cb2eaf8b133 | 830 | int ms = strtod(argv[1], &tp); |
caoyuan9642 | 0:6cb2eaf8b133 | 831 | if (tp == argv[1] || ms < 1 |
caoyuan9642 | 0:6cb2eaf8b133 | 832 | || ms > TelescopeConfiguration::getInt("max_guide_time")) |
caoyuan9642 | 0:6cb2eaf8b133 | 833 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 834 | return ERR_PARAM_OUT_OF_RANGE; |
caoyuan9642 | 0:6cb2eaf8b133 | 835 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 836 | |
caoyuan9642 | 0:6cb2eaf8b133 | 837 | if (strcmp("north", argv[0]) == 0) |
caoyuan9642 | 0:6cb2eaf8b133 | 838 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 839 | return server->getEqMount()->guide(GUIDE_NORTH, ms); |
caoyuan9642 | 0:6cb2eaf8b133 | 840 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 841 | else if (strcmp("south", argv[0]) == 0) |
caoyuan9642 | 0:6cb2eaf8b133 | 842 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 843 | return server->getEqMount()->guide(GUIDE_SOUTH, ms); |
caoyuan9642 | 0:6cb2eaf8b133 | 844 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 845 | else if (strcmp("west", argv[0]) == 0) |
caoyuan9642 | 0:6cb2eaf8b133 | 846 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 847 | return server->getEqMount()->guide(GUIDE_WEST, ms); |
caoyuan9642 | 0:6cb2eaf8b133 | 848 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 849 | else if (strcmp("east", argv[0]) == 0) |
caoyuan9642 | 0:6cb2eaf8b133 | 850 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 851 | return server->getEqMount()->guide(GUIDE_EAST, ms); |
caoyuan9642 | 0:6cb2eaf8b133 | 852 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 853 | else |
caoyuan9642 | 0:6cb2eaf8b133 | 854 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 855 | return ERR_PARAM_OUT_OF_RANGE; |
caoyuan9642 | 0:6cb2eaf8b133 | 856 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 857 | |
caoyuan9642 | 0:6cb2eaf8b133 | 858 | return 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 859 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 860 | |
caoyuan9642 | 0:6cb2eaf8b133 | 861 | static int eqmount_time(EqMountServer *server, const char *cmd, int argn, |
caoyuan9642 | 0:6cb2eaf8b133 | 862 | char *argv[]) |
caoyuan9642 | 0:6cb2eaf8b133 | 863 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 864 | char buf[32]; |
caoyuan9642 | 0:6cb2eaf8b133 | 865 | //Get time |
caoyuan9642 | 0:6cb2eaf8b133 | 866 | time_t t = server->getEqMount()->getClock().getTime(); |
caoyuan9642 | 0:6cb2eaf8b133 | 867 | |
caoyuan9642 | 0:6cb2eaf8b133 | 868 | if (argn >= 2) |
caoyuan9642 | 0:6cb2eaf8b133 | 869 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 870 | return ERR_WRONG_NUM_PARAM; |
caoyuan9642 | 0:6cb2eaf8b133 | 871 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 872 | else if (argn == 1) |
caoyuan9642 | 0:6cb2eaf8b133 | 873 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 874 | if (strcmp(argv[0], "stamp") == 0) |
caoyuan9642 | 0:6cb2eaf8b133 | 875 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 876 | // Print timestamp value |
caoyuan9642 | 0:6cb2eaf8b133 | 877 | stprintf(server->getStream(), "%s %d\r\n", cmd, t); |
caoyuan9642 | 0:6cb2eaf8b133 | 878 | return 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 879 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 880 | else if (strcmp(argv[0], "sidereal") == 0) |
caoyuan9642 | 0:6cb2eaf8b133 | 881 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 882 | // Print sidereal time at current location |
caoyuan9642 | 0:6cb2eaf8b133 | 883 | // 0.0 is sidereal midnight, 180/-180 is sidereal noon |
caoyuan9642 | 0:6cb2eaf8b133 | 884 | double st = CelestialMath::getLocalSiderealTime(t, |
caoyuan9642 | 0:6cb2eaf8b133 | 885 | server->getEqMount()->getLocation()); |
caoyuan9642 | 0:6cb2eaf8b133 | 886 | // int hh = ((int) floor(st / 15) + 24) % 24; |
caoyuan9642 | 0:6cb2eaf8b133 | 887 | // int mm = (int) floor((st + 360.0 - hh * 15) * 4) % 60; |
caoyuan9642 | 0:6cb2eaf8b133 | 888 | // int ss = (int) floor((st + 360.0 - hh * 15 - mm * 0.25) * 240) % 60; |
caoyuan9642 | 0:6cb2eaf8b133 | 889 | stprintf(server->getStream(), "%s %f\r\n", cmd, st); |
caoyuan9642 | 0:6cb2eaf8b133 | 890 | // stprintf(server->getStream(), "%d:%d:%d LST\r\n", hh, mm, ss); |
caoyuan9642 | 0:6cb2eaf8b133 | 891 | return 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 892 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 893 | else if (strcmp(argv[0], "local") == 0) |
caoyuan9642 | 0:6cb2eaf8b133 | 894 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 895 | t += (int) (remainder(server->getEqMount()->getLocation().lon, 360) |
caoyuan9642 | 0:6cb2eaf8b133 | 896 | * 240); |
caoyu@caoyuan9642-desktop.MIT.EDU | 10:e356188d208e | 897 | |
caoyu@caoyuan9642-desktop.MIT.EDU | 10:e356188d208e | 898 | |
caoyu@caoyuan9642-desktop.MIT.EDU | 10:e356188d208e | 899 | #ifdef __GNUC__ |
caoyu@caoyuan9642-desktop.MIT.EDU | 10:e356188d208e | 900 | char ibuf[64]; |
caoyu@caoyuan9642-desktop.MIT.EDU | 10:e356188d208e | 901 | ctime_r(&t, ibuf); |
caoyu@caoyuan9642-desktop.MIT.EDU | 10:e356188d208e | 902 | strncpy(buf, ibuf, sizeof(buf)); |
caoyu@caoyuan9642-desktop.MIT.EDU | 10:e356188d208e | 903 | #else |
caoyuan9642 | 1:a4d5537de7ae | 904 | core_util_critical_section_enter(); |
caoyuan9642 | 1:a4d5537de7ae | 905 | char *ibuf = ctime(&t); |
caoyuan9642 | 1:a4d5537de7ae | 906 | strncpy(buf, ibuf, sizeof(buf)); |
caoyuan9642 | 1:a4d5537de7ae | 907 | core_util_critical_section_exit(); |
caoyu@caoyuan9642-desktop.MIT.EDU | 10:e356188d208e | 908 | #endif |
caoyuan9642 | 1:a4d5537de7ae | 909 | |
caoyuan9642 | 0:6cb2eaf8b133 | 910 | stprintf(server->getStream(), "%s %s\r\n", cmd, buf); |
caoyuan9642 | 0:6cb2eaf8b133 | 911 | return 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 912 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 913 | else if (strcmp(argv[0], "zone") == 0) |
caoyuan9642 | 0:6cb2eaf8b133 | 914 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 915 | t += (int) (TelescopeConfiguration::getInt("timezone") * 3600); |
caoyu@caoyuan9642-desktop.MIT.EDU | 10:e356188d208e | 916 | |
caoyu@caoyuan9642-desktop.MIT.EDU | 10:e356188d208e | 917 | #ifdef __GNUC__ |
caoyu@caoyuan9642-desktop.MIT.EDU | 10:e356188d208e | 918 | char ibuf[64]; |
caoyu@caoyuan9642-desktop.MIT.EDU | 10:e356188d208e | 919 | ctime_r(&t, ibuf); |
caoyu@caoyuan9642-desktop.MIT.EDU | 10:e356188d208e | 920 | strncpy(buf, ibuf, sizeof(buf)); |
caoyu@caoyuan9642-desktop.MIT.EDU | 10:e356188d208e | 921 | #else |
caoyuan9642 | 1:a4d5537de7ae | 922 | core_util_critical_section_enter(); |
caoyuan9642 | 1:a4d5537de7ae | 923 | char *ibuf = ctime(&t); |
caoyuan9642 | 1:a4d5537de7ae | 924 | strncpy(buf, ibuf, sizeof(buf)); |
caoyuan9642 | 1:a4d5537de7ae | 925 | core_util_critical_section_exit(); |
caoyu@caoyuan9642-desktop.MIT.EDU | 10:e356188d208e | 926 | #endif |
caoyuan9642 | 1:a4d5537de7ae | 927 | |
caoyuan9642 | 0:6cb2eaf8b133 | 928 | stprintf(server->getStream(), "%s %s\r\n", cmd, buf); |
caoyuan9642 | 0:6cb2eaf8b133 | 929 | return 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 930 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 931 | |
caoyuan9642 | 0:6cb2eaf8b133 | 932 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 933 | |
caoyuan9642 | 0:6cb2eaf8b133 | 934 | // Print of formatted string of current time |
caoyu@caoyuan9642-desktop.MIT.EDU | 10:e356188d208e | 935 | |
caoyu@caoyuan9642-desktop.MIT.EDU | 10:e356188d208e | 936 | #ifdef __GNUC__ |
caoyu@caoyuan9642-desktop.MIT.EDU | 10:e356188d208e | 937 | char ibuf[64]; |
caoyu@caoyuan9642-desktop.MIT.EDU | 10:e356188d208e | 938 | ctime_r(&t, ibuf); |
caoyu@caoyuan9642-desktop.MIT.EDU | 10:e356188d208e | 939 | strncpy(buf, ibuf, sizeof(buf)); |
caoyu@caoyuan9642-desktop.MIT.EDU | 10:e356188d208e | 940 | #else |
caoyuan9642 | 1:a4d5537de7ae | 941 | core_util_critical_section_enter(); |
caoyuan9642 | 1:a4d5537de7ae | 942 | char *ibuf = ctime(&t); |
caoyuan9642 | 1:a4d5537de7ae | 943 | strncpy(buf, ibuf, sizeof(buf)); |
caoyuan9642 | 1:a4d5537de7ae | 944 | core_util_critical_section_exit(); |
caoyu@caoyuan9642-desktop.MIT.EDU | 10:e356188d208e | 945 | #endif |
caoyuan9642 | 1:a4d5537de7ae | 946 | |
caoyuan9642 | 0:6cb2eaf8b133 | 947 | stprintf(server->getStream(), "%s %s\r\n", cmd, buf); |
caoyuan9642 | 0:6cb2eaf8b133 | 948 | |
caoyuan9642 | 0:6cb2eaf8b133 | 949 | return 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 950 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 951 | |
caoyuan9642 | 0:6cb2eaf8b133 | 952 | static int eqmount_settime(EqMountServer *server, const char *cmd, int argn, |
caoyuan9642 | 0:6cb2eaf8b133 | 953 | char *argv[]) |
caoyuan9642 | 0:6cb2eaf8b133 | 954 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 955 | if (argn == 1) |
caoyuan9642 | 0:6cb2eaf8b133 | 956 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 957 | //Use the first argument as UTC timestamp |
caoyuan9642 | 0:6cb2eaf8b133 | 958 | time_t t = strtol(argv[0], NULL, 10); |
caoyuan9642 | 0:6cb2eaf8b133 | 959 | server->getEqMount()->getClock().setTime(t); |
caoyuan9642 | 0:6cb2eaf8b133 | 960 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 961 | else if (argn == 6) |
caoyuan9642 | 0:6cb2eaf8b133 | 962 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 963 | int year = strtol(argv[0], NULL, 10); |
caoyuan9642 | 0:6cb2eaf8b133 | 964 | int month = strtol(argv[1], NULL, 10); |
caoyuan9642 | 0:6cb2eaf8b133 | 965 | int day = strtol(argv[2], NULL, 10); |
caoyuan9642 | 0:6cb2eaf8b133 | 966 | int hour = strtol(argv[3], NULL, 10); |
caoyuan9642 | 0:6cb2eaf8b133 | 967 | int min = strtol(argv[4], NULL, 10); |
caoyuan9642 | 0:6cb2eaf8b133 | 968 | int sec = strtol(argv[5], NULL, 10); |
caoyuan9642 | 0:6cb2eaf8b133 | 969 | struct tm ts; |
caoyuan9642 | 0:6cb2eaf8b133 | 970 | ts.tm_sec = sec; |
caoyuan9642 | 0:6cb2eaf8b133 | 971 | ts.tm_min = min; |
caoyuan9642 | 0:6cb2eaf8b133 | 972 | ts.tm_hour = hour; |
caoyuan9642 | 0:6cb2eaf8b133 | 973 | ts.tm_mday = day; |
caoyuan9642 | 0:6cb2eaf8b133 | 974 | ts.tm_mon = month - 1; |
caoyuan9642 | 0:6cb2eaf8b133 | 975 | ts.tm_year = year - 1900; |
caoyuan9642 | 0:6cb2eaf8b133 | 976 | ts.tm_isdst = 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 977 | |
caoyuan9642 | 0:6cb2eaf8b133 | 978 | time_t t = mktime(&ts); |
caoyuan9642 | 0:6cb2eaf8b133 | 979 | if (t == -1) |
caoyuan9642 | 0:6cb2eaf8b133 | 980 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 981 | // Parameter out of range |
caoyuan9642 | 0:6cb2eaf8b133 | 982 | return 2; |
caoyuan9642 | 0:6cb2eaf8b133 | 983 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 984 | |
caoyuan9642 | 0:6cb2eaf8b133 | 985 | server->getEqMount()->getClock().setTime(t); |
caoyuan9642 | 0:6cb2eaf8b133 | 986 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 987 | else |
caoyuan9642 | 0:6cb2eaf8b133 | 988 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 989 | stprintf(server->getStream(), |
caoyuan9642 | 0:6cb2eaf8b133 | 990 | "%s usage: settime <timestamp>, or, settime <year> <month> <day> <hour> <minute> <second> (UTC time should be used)\r\n", |
caoyuan9642 | 0:6cb2eaf8b133 | 991 | cmd); |
caoyuan9642 | 0:6cb2eaf8b133 | 992 | return 1; |
caoyuan9642 | 0:6cb2eaf8b133 | 993 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 994 | |
caoyuan9642 | 0:6cb2eaf8b133 | 995 | return 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 996 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 997 | |
caoyuan9642 | 0:6cb2eaf8b133 | 998 | void EqMountServer::addCommand(const ServerCommand& cmd) |
caoyuan9642 | 0:6cb2eaf8b133 | 999 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 1000 | int i = 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 1001 | while (i < MAX_COMMAND && commandlist[i].fptr != NULL) |
caoyuan9642 | 0:6cb2eaf8b133 | 1002 | i++; |
caoyuan9642 | 0:6cb2eaf8b133 | 1003 | if (i >= MAX_COMMAND - 1) |
caoyuan9642 | 0:6cb2eaf8b133 | 1004 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 1005 | debug("Error: max command reached.\n"); |
caoyuan9642 | 0:6cb2eaf8b133 | 1006 | return; |
caoyuan9642 | 0:6cb2eaf8b133 | 1007 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 1008 | |
caoyuan9642 | 0:6cb2eaf8b133 | 1009 | commandlist[i] = cmd; |
caoyuan9642 | 0:6cb2eaf8b133 | 1010 | commandlist[++i] = ServerCommand("", "", NULL); |
caoyuan9642 | 0:6cb2eaf8b133 | 1011 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 1012 | |
caoyuan9642 | 0:6cb2eaf8b133 | 1013 | ServerCommand commandlist[MAX_COMMAND] = |
caoyuan9642 | 0:6cb2eaf8b133 | 1014 | { /// List of all commands |
caoyuan9642 | 0:6cb2eaf8b133 | 1015 | ServerCommand("stop", "Stop mount motion", eqmount_stop), /// Stop |
caoyuan9642 | 0:6cb2eaf8b133 | 1016 | ServerCommand("estop", "Emergency stop", eqmount_estop), /// Emergency Stop |
caoyuan9642 | 0:6cb2eaf8b133 | 1017 | ServerCommand("read", "Read current RA/DEC position", eqmount_read), /// Read Position |
caoyuan9642 | 0:6cb2eaf8b133 | 1018 | ServerCommand("time", "Get and set system time", eqmount_time), /// System time |
caoyuan9642 | 0:6cb2eaf8b133 | 1019 | ServerCommand("status", "Get the mount state", eqmount_state), /// System state |
caoyuan9642 | 0:6cb2eaf8b133 | 1020 | ServerCommand("help", "Print this help menu", eqmount_help), /// Help menu |
caoyuan9642 | 0:6cb2eaf8b133 | 1021 | ServerCommand("speed", "Set slew and tracking speed", eqmount_speed), /// Set speed |
caoyuan9642 | 0:6cb2eaf8b133 | 1022 | ServerCommand("align", "Star alignment", eqmount_align), /// Alignment |
caoyuan9642 | 0:6cb2eaf8b133 | 1023 | /// Above are allowed commands when another command is running |
caoyuan9642 | 0:6cb2eaf8b133 | 1024 | |
caoyuan9642 | 0:6cb2eaf8b133 | 1025 | ServerCommand("goto", |
caoyuan9642 | 0:6cb2eaf8b133 | 1026 | "Perform go to operation to specified ra, dec coordinates", |
caoyuan9642 | 0:6cb2eaf8b133 | 1027 | eqmount_goto), /// Go to |
caoyuan9642 | 0:6cb2eaf8b133 | 1028 | ServerCommand("nudge", "Perform nudging on specified direction", |
caoyuan9642 | 0:6cb2eaf8b133 | 1029 | eqmount_nudge), /// Nudge |
caoyuan9642 | 0:6cb2eaf8b133 | 1030 | ServerCommand("track", "Start tracking in specified direction", |
caoyuan9642 | 0:6cb2eaf8b133 | 1031 | eqmount_track), /// Track |
caoyuan9642 | 0:6cb2eaf8b133 | 1032 | ServerCommand("guide", "Guide on specified direction", |
caoyuan9642 | 0:6cb2eaf8b133 | 1033 | eqmount_guide), /// Guide |
caoyuan9642 | 0:6cb2eaf8b133 | 1034 | ServerCommand("settime", "Set system time", eqmount_settime), /// System time |
caoyuan9642 | 0:6cb2eaf8b133 | 1035 | ServerCommand("", "", NULL) }; |
caoyuan9642 | 0:6cb2eaf8b133 | 1036 | |
caoyuan9642 | 0:6cb2eaf8b133 | 1037 |