Telescope Control Library
EqMountServer.cpp@2:2ee28add0821, 2018-08-20 (annotated)
- Committer:
- caoyuan9642
- Date:
- Mon Aug 20 23:42:21 2018 +0000
- Revision:
- 2:2ee28add0821
- Parent:
- 1:a4d5537de7ae
- Child:
- 4:b8ad57bbf9e1
Guiding status
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 | 0:6cb2eaf8b133 | 413 | "%s usage: align add [star]\nalign replace [n] [star]\nalign delete [n]\nalign show\nalign show [n]\n\nalign clear\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 | 0:6cb2eaf8b133 | 423 | "%s usage: align add {ref_ra} {ref_dec}\n%s usage: align add {ref_ra} {ref_dec} {meas_ra} {meas_dec}\n", |
caoyuan9642 | 0:6cb2eaf8b133 | 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 | 0:6cb2eaf8b133 | 464 | "%s usage: align replace [index] {ref_ra} {ref_dec}\n%s usage: align replace [index] {ref_ra} {ref_dec} {meas_ra} {meas_dec}\n", |
caoyuan9642 | 0:6cb2eaf8b133 | 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 | 0:6cb2eaf8b133 | 515 | if (server->getEqMount()->getNumAlignmentStar() > 1) |
caoyuan9642 | 0:6cb2eaf8b133 | 516 | return server->getEqMount()->removeAlignmentStar(n); |
caoyuan9642 | 0:6cb2eaf8b133 | 517 | else |
caoyuan9642 | 0:6cb2eaf8b133 | 518 | server->getEqMount()->clearCalibration(); |
caoyuan9642 | 0:6cb2eaf8b133 | 519 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 520 | else if (strcmp(argv[0], "show") == 0) |
caoyuan9642 | 0:6cb2eaf8b133 | 521 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 522 | if (argn == 1) |
caoyuan9642 | 0:6cb2eaf8b133 | 523 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 524 | // Show all alignment stars |
caoyuan9642 | 0:6cb2eaf8b133 | 525 | // int N = server->getEqMount()->getNumAlignmentStar(); |
caoyuan9642 | 0:6cb2eaf8b133 | 526 | // for (int i = 0; i < N; i++) |
caoyuan9642 | 0:6cb2eaf8b133 | 527 | // { |
caoyuan9642 | 0:6cb2eaf8b133 | 528 | // AlignmentStar *as = server->getEqMount()->getAlignmentStar(i); |
caoyuan9642 | 0:6cb2eaf8b133 | 529 | // stprintf(server->getStream(), "%s %d %.8f %.8f %.8f %.8f %d\n", |
caoyuan9642 | 0:6cb2eaf8b133 | 530 | // cmd, i, as->star_ref.ra, as->star_ref.dec, |
caoyuan9642 | 0:6cb2eaf8b133 | 531 | // as->star_meas.ra_delta, as->star_meas.dec_delta, |
caoyuan9642 | 0:6cb2eaf8b133 | 532 | // as->timestamp); |
caoyuan9642 | 0:6cb2eaf8b133 | 533 | // } |
caoyuan9642 | 0:6cb2eaf8b133 | 534 | stprintf(server->getStream(), "%s offset %.8f %.8f\n", cmd, |
caoyuan9642 | 0:6cb2eaf8b133 | 535 | server->getEqMount()->getCalibration().offset.ra_off, |
caoyuan9642 | 0:6cb2eaf8b133 | 536 | server->getEqMount()->getCalibration().offset.dec_off); |
caoyuan9642 | 0:6cb2eaf8b133 | 537 | stprintf(server->getStream(), "%s pa %.8f %.8f\n", cmd, |
caoyuan9642 | 0:6cb2eaf8b133 | 538 | server->getEqMount()->getCalibration().pa.alt, |
caoyuan9642 | 0:6cb2eaf8b133 | 539 | server->getEqMount()->getCalibration().pa.azi); |
caoyuan9642 | 0:6cb2eaf8b133 | 540 | stprintf(server->getStream(), "%s cone %.8f\n", cmd, |
caoyuan9642 | 0:6cb2eaf8b133 | 541 | server->getEqMount()->getCalibration().cone); |
caoyuan9642 | 0:6cb2eaf8b133 | 542 | stprintf(server->getStream(), "%s error %g\n", cmd, |
caoyuan9642 | 0:6cb2eaf8b133 | 543 | server->getEqMount()->getCalibration().error); |
caoyuan9642 | 0:6cb2eaf8b133 | 544 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 545 | else if (argn == 2) |
caoyuan9642 | 0:6cb2eaf8b133 | 546 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 547 | if (strcmp(argv[1], "num") == 0) |
caoyuan9642 | 0:6cb2eaf8b133 | 548 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 549 | stprintf(server->getStream(), "%s %d\n", cmd, |
caoyuan9642 | 0:6cb2eaf8b133 | 550 | server->getEqMount()->getNumAlignmentStar()); |
caoyuan9642 | 0:6cb2eaf8b133 | 551 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 552 | else |
caoyuan9642 | 0:6cb2eaf8b133 | 553 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 554 | char *tp; |
caoyuan9642 | 0:6cb2eaf8b133 | 555 | int index = strtol(argv[1], &tp, 0); |
caoyuan9642 | 0:6cb2eaf8b133 | 556 | if (tp == argv[1] |
caoyuan9642 | 0:6cb2eaf8b133 | 557 | || index >= server->getEqMount()->getNumAlignmentStar() |
caoyuan9642 | 0:6cb2eaf8b133 | 558 | || index < 0) |
caoyuan9642 | 0:6cb2eaf8b133 | 559 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 560 | return ERR_PARAM_OUT_OF_RANGE; |
caoyuan9642 | 0:6cb2eaf8b133 | 561 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 562 | AlignmentStar *as = server->getEqMount()->getAlignmentStar( |
caoyuan9642 | 0:6cb2eaf8b133 | 563 | index); |
caoyuan9642 | 0:6cb2eaf8b133 | 564 | if (!as) |
caoyuan9642 | 0:6cb2eaf8b133 | 565 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 566 | return ERR_PARAM_OUT_OF_RANGE; |
caoyuan9642 | 0:6cb2eaf8b133 | 567 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 568 | stprintf(server->getStream(), "%s %.8f %.8f %.8f %.8f %d\n", |
caoyuan9642 | 0:6cb2eaf8b133 | 569 | cmd, as->star_ref.ra, as->star_ref.dec, |
caoyuan9642 | 0:6cb2eaf8b133 | 570 | as->star_meas.ra_delta, as->star_meas.dec_delta, |
caoyuan9642 | 0:6cb2eaf8b133 | 571 | as->timestamp); |
caoyuan9642 | 0:6cb2eaf8b133 | 572 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 573 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 574 | else |
caoyuan9642 | 0:6cb2eaf8b133 | 575 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 576 | return ERR_WRONG_NUM_PARAM; |
caoyuan9642 | 0:6cb2eaf8b133 | 577 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 578 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 579 | else if (strcmp(argv[0], "clear") == 0) |
caoyuan9642 | 0:6cb2eaf8b133 | 580 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 581 | if (argn != 1) |
caoyuan9642 | 0:6cb2eaf8b133 | 582 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 583 | return ERR_WRONG_NUM_PARAM; |
caoyuan9642 | 0:6cb2eaf8b133 | 584 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 585 | server->getEqMount()->clearCalibration(); |
caoyuan9642 | 0:6cb2eaf8b133 | 586 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 587 | else if (strcmp(argv[0], "convert") == 0) |
caoyuan9642 | 0:6cb2eaf8b133 | 588 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 589 | if (argn != 4) |
caoyuan9642 | 0:6cb2eaf8b133 | 590 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 591 | return ERR_WRONG_NUM_PARAM; |
caoyuan9642 | 0:6cb2eaf8b133 | 592 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 593 | char *tp; |
caoyuan9642 | 0:6cb2eaf8b133 | 594 | double ra = strtod(argv[2], &tp); |
caoyuan9642 | 0:6cb2eaf8b133 | 595 | if (tp == argv[2]) |
caoyuan9642 | 0:6cb2eaf8b133 | 596 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 597 | return ERR_PARAM_OUT_OF_RANGE; |
caoyuan9642 | 0:6cb2eaf8b133 | 598 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 599 | double dec = strtod(argv[3], &tp); |
caoyuan9642 | 0:6cb2eaf8b133 | 600 | if (tp == argv[3]) |
caoyuan9642 | 0:6cb2eaf8b133 | 601 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 602 | return ERR_PARAM_OUT_OF_RANGE; |
caoyuan9642 | 0:6cb2eaf8b133 | 603 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 604 | if (strcmp(argv[1], "mount") == 0) |
caoyuan9642 | 0:6cb2eaf8b133 | 605 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 606 | // Convert to eq |
caoyuan9642 | 0:6cb2eaf8b133 | 607 | EquatorialCoordinates eq = |
caoyuan9642 | 0:6cb2eaf8b133 | 608 | server->getEqMount()->convertToEqCoordinates( |
caoyuan9642 | 0:6cb2eaf8b133 | 609 | MountCoordinates(dec, ra)); |
caoyuan9642 | 0:6cb2eaf8b133 | 610 | stprintf(server->getStream(), "%s %.8f %.8f\n", cmd, eq.ra, eq.dec); |
caoyuan9642 | 0:6cb2eaf8b133 | 611 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 612 | else if (strcmp(argv[1], "eq") == 0) |
caoyuan9642 | 0:6cb2eaf8b133 | 613 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 614 | // Convert to eq |
caoyuan9642 | 0:6cb2eaf8b133 | 615 | MountCoordinates mc = |
caoyuan9642 | 0:6cb2eaf8b133 | 616 | server->getEqMount()->convertToMountCoordinates( |
caoyuan9642 | 0:6cb2eaf8b133 | 617 | EquatorialCoordinates(dec, ra)); |
caoyuan9642 | 0:6cb2eaf8b133 | 618 | stprintf(server->getStream(), "%s %.8f %.8f\n", cmd, mc.ra_delta, |
caoyuan9642 | 0:6cb2eaf8b133 | 619 | mc.dec_delta); |
caoyuan9642 | 0:6cb2eaf8b133 | 620 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 621 | else |
caoyuan9642 | 0:6cb2eaf8b133 | 622 | return ERR_PARAM_OUT_OF_RANGE; |
caoyuan9642 | 0:6cb2eaf8b133 | 623 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 624 | else |
caoyuan9642 | 0:6cb2eaf8b133 | 625 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 626 | return ERR_PARAM_OUT_OF_RANGE; |
caoyuan9642 | 0:6cb2eaf8b133 | 627 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 628 | return 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 629 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 630 | |
caoyuan9642 | 0:6cb2eaf8b133 | 631 | static int eqmount_nudge(EqMountServer *server, const char *cmd, int argn, |
caoyuan9642 | 0:6cb2eaf8b133 | 632 | char *argv[]) |
caoyuan9642 | 0:6cb2eaf8b133 | 633 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 634 | if (argn != 1 && argn != 2) |
caoyuan9642 | 0:6cb2eaf8b133 | 635 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 636 | return ERR_WRONG_NUM_PARAM; |
caoyuan9642 | 0:6cb2eaf8b133 | 637 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 638 | int dir = 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 639 | for (int i = 0; i < argn; i++) |
caoyuan9642 | 0:6cb2eaf8b133 | 640 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 641 | if (strcmp(argv[i], "south") == 0) |
caoyuan9642 | 0:6cb2eaf8b133 | 642 | dir |= NUDGE_SOUTH; |
caoyuan9642 | 0:6cb2eaf8b133 | 643 | else if (strcmp(argv[i], "north") == 0) |
caoyuan9642 | 0:6cb2eaf8b133 | 644 | dir |= NUDGE_NORTH; |
caoyuan9642 | 0:6cb2eaf8b133 | 645 | else if (strcmp(argv[i], "east") == 0) |
caoyuan9642 | 0:6cb2eaf8b133 | 646 | dir |= NUDGE_EAST; |
caoyuan9642 | 0:6cb2eaf8b133 | 647 | else if (strcmp(argv[i], "west") == 0) |
caoyuan9642 | 0:6cb2eaf8b133 | 648 | dir |= NUDGE_WEST; |
caoyuan9642 | 0:6cb2eaf8b133 | 649 | else if (strcmp(argv[i], "stop") == 0) |
caoyuan9642 | 0:6cb2eaf8b133 | 650 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 651 | // STOP nudging |
caoyuan9642 | 0:6cb2eaf8b133 | 652 | dir = NUDGE_NONE; |
caoyuan9642 | 0:6cb2eaf8b133 | 653 | break; |
caoyuan9642 | 0:6cb2eaf8b133 | 654 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 655 | else |
caoyuan9642 | 0:6cb2eaf8b133 | 656 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 657 | return ERR_PARAM_OUT_OF_RANGE; |
caoyuan9642 | 0:6cb2eaf8b133 | 658 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 659 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 660 | |
caoyuan9642 | 0:6cb2eaf8b133 | 661 | osStatus s; |
caoyuan9642 | 0:6cb2eaf8b133 | 662 | if ((s = server->getEqMount()->startNudge((nudgedir_t) dir)) != osOK) |
caoyuan9642 | 0:6cb2eaf8b133 | 663 | return s; |
caoyuan9642 | 0:6cb2eaf8b133 | 664 | |
caoyuan9642 | 0:6cb2eaf8b133 | 665 | return 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 666 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 667 | |
caoyuan9642 | 0:6cb2eaf8b133 | 668 | static int eqmount_track(EqMountServer *server, const char *cmd, int argn, |
caoyuan9642 | 0:6cb2eaf8b133 | 669 | char *argv[]) |
caoyuan9642 | 0:6cb2eaf8b133 | 670 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 671 | if (argn != 0) |
caoyuan9642 | 0:6cb2eaf8b133 | 672 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 673 | return ERR_WRONG_NUM_PARAM; |
caoyuan9642 | 0:6cb2eaf8b133 | 674 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 675 | osStatus s; |
caoyuan9642 | 0:6cb2eaf8b133 | 676 | if ((s = server->getEqMount()->startTracking()) != osOK) |
caoyuan9642 | 0:6cb2eaf8b133 | 677 | return s; |
caoyuan9642 | 0:6cb2eaf8b133 | 678 | return 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 679 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 680 | |
caoyuan9642 | 0:6cb2eaf8b133 | 681 | static int eqmount_read(EqMountServer *server, const char *cmd, int argn, |
caoyuan9642 | 0:6cb2eaf8b133 | 682 | char *argv[]) |
caoyuan9642 | 0:6cb2eaf8b133 | 683 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 684 | |
caoyuan9642 | 0:6cb2eaf8b133 | 685 | if (argn == 0) |
caoyuan9642 | 0:6cb2eaf8b133 | 686 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 687 | EquatorialCoordinates eq = |
caoyuan9642 | 0:6cb2eaf8b133 | 688 | server->getEqMount()->getEquatorialCoordinates(); |
caoyuan9642 | 0:6cb2eaf8b133 | 689 | stprintf(server->getStream(), "%s %.8f %.8f\r\n", cmd, eq.ra, eq.dec); |
caoyuan9642 | 0:6cb2eaf8b133 | 690 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 691 | else if (argn == 1) |
caoyuan9642 | 0:6cb2eaf8b133 | 692 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 693 | if (strcmp(argv[0], "eq") == 0) |
caoyuan9642 | 0:6cb2eaf8b133 | 694 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 695 | EquatorialCoordinates eq = |
caoyuan9642 | 0:6cb2eaf8b133 | 696 | server->getEqMount()->getEquatorialCoordinates(); |
caoyuan9642 | 0:6cb2eaf8b133 | 697 | stprintf(server->getStream(), "%s %.8f %.8f\r\n", cmd, eq.ra, |
caoyuan9642 | 0:6cb2eaf8b133 | 698 | eq.dec); |
caoyuan9642 | 0:6cb2eaf8b133 | 699 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 700 | else if (strcmp(argv[0], "mount") == 0) |
caoyuan9642 | 0:6cb2eaf8b133 | 701 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 702 | MountCoordinates mc = server->getEqMount()->getMountCoordinates(); |
caoyuan9642 | 0:6cb2eaf8b133 | 703 | stprintf(server->getStream(), "%s %.8f %.8f %c\r\n", cmd, |
caoyuan9642 | 0:6cb2eaf8b133 | 704 | mc.ra_delta, mc.dec_delta, |
caoyuan9642 | 0:6cb2eaf8b133 | 705 | (mc.side == PIER_SIDE_WEST) ? 'W' : 'E'); |
caoyuan9642 | 0:6cb2eaf8b133 | 706 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 707 | else |
caoyuan9642 | 0:6cb2eaf8b133 | 708 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 709 | return ERR_PARAM_OUT_OF_RANGE; |
caoyuan9642 | 0:6cb2eaf8b133 | 710 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 711 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 712 | else |
caoyuan9642 | 0:6cb2eaf8b133 | 713 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 714 | return ERR_WRONG_NUM_PARAM; |
caoyuan9642 | 0:6cb2eaf8b133 | 715 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 716 | |
caoyuan9642 | 0:6cb2eaf8b133 | 717 | return 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 718 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 719 | |
caoyuan9642 | 0:6cb2eaf8b133 | 720 | static int eqmount_state(EqMountServer *server, const char *cmd, int argn, |
caoyuan9642 | 0:6cb2eaf8b133 | 721 | char *argv[]) |
caoyuan9642 | 0:6cb2eaf8b133 | 722 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 723 | |
caoyuan9642 | 0:6cb2eaf8b133 | 724 | if (argn == 0) |
caoyuan9642 | 0:6cb2eaf8b133 | 725 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 726 | const char *s; |
caoyuan9642 | 0:6cb2eaf8b133 | 727 | switch (server->getEqMount()->getStatus()) |
caoyuan9642 | 0:6cb2eaf8b133 | 728 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 729 | case MOUNT_STOPPED: |
caoyuan9642 | 0:6cb2eaf8b133 | 730 | s = "stopped"; |
caoyuan9642 | 0:6cb2eaf8b133 | 731 | break; |
caoyuan9642 | 0:6cb2eaf8b133 | 732 | case MOUNT_SLEWING: |
caoyuan9642 | 0:6cb2eaf8b133 | 733 | s = "slewing"; |
caoyuan9642 | 0:6cb2eaf8b133 | 734 | break; |
caoyuan9642 | 0:6cb2eaf8b133 | 735 | case MOUNT_TRACKING: |
caoyuan9642 | 0:6cb2eaf8b133 | 736 | s = "tracking"; |
caoyuan9642 | 0:6cb2eaf8b133 | 737 | break; |
caoyuan9642 | 2:2ee28add0821 | 738 | case MOUNT_TRACKING | MOUNT_GUIDING: |
caoyuan9642 | 2:2ee28add0821 | 739 | s = "tracking_guiding"; |
caoyuan9642 | 2:2ee28add0821 | 740 | break; |
caoyuan9642 | 0:6cb2eaf8b133 | 741 | case MOUNT_NUDGING: |
caoyuan9642 | 0:6cb2eaf8b133 | 742 | s = "nudging"; |
caoyuan9642 | 0:6cb2eaf8b133 | 743 | break; |
caoyuan9642 | 0:6cb2eaf8b133 | 744 | case MOUNT_NUDGING_TRACKING: |
caoyuan9642 | 0:6cb2eaf8b133 | 745 | s = "nudging_tracking"; |
caoyuan9642 | 0:6cb2eaf8b133 | 746 | break; |
caoyuan9642 | 0:6cb2eaf8b133 | 747 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 748 | stprintf(server->getStream(), "%s %s\r\n", cmd, s); |
caoyuan9642 | 0:6cb2eaf8b133 | 749 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 750 | else |
caoyuan9642 | 0:6cb2eaf8b133 | 751 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 752 | return ERR_WRONG_NUM_PARAM; |
caoyuan9642 | 0:6cb2eaf8b133 | 753 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 754 | |
caoyuan9642 | 0:6cb2eaf8b133 | 755 | return 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 756 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 757 | |
caoyuan9642 | 0:6cb2eaf8b133 | 758 | static int eqmount_help(EqMountServer *server, const char *cmd, int argn, |
caoyuan9642 | 0:6cb2eaf8b133 | 759 | char *argv[]) |
caoyuan9642 | 0:6cb2eaf8b133 | 760 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 761 | stprintf(server->getStream(), "%s Available commands: \r\n", cmd); |
caoyuan9642 | 0:6cb2eaf8b133 | 762 | for (int i = 0; i < MAX_COMMAND; i++) |
caoyuan9642 | 0:6cb2eaf8b133 | 763 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 764 | if (commandlist[i].fptr == NULL) |
caoyuan9642 | 0:6cb2eaf8b133 | 765 | break; |
caoyuan9642 | 0:6cb2eaf8b133 | 766 | stprintf(server->getStream(), "%s - %s : %s\r\n", cmd, |
caoyuan9642 | 0:6cb2eaf8b133 | 767 | commandlist[i].cmd, commandlist[i].desc); |
caoyuan9642 | 0:6cb2eaf8b133 | 768 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 769 | return 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 770 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 771 | |
caoyuan9642 | 0:6cb2eaf8b133 | 772 | static int eqmount_guide(EqMountServer *server, const char *cmd, int argn, |
caoyuan9642 | 0:6cb2eaf8b133 | 773 | char *argv[]) |
caoyuan9642 | 0:6cb2eaf8b133 | 774 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 775 | |
caoyuan9642 | 0:6cb2eaf8b133 | 776 | if (argn != 2) |
caoyuan9642 | 0:6cb2eaf8b133 | 777 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 778 | stprintf(server->getStream(), |
caoyuan9642 | 0:6cb2eaf8b133 | 779 | "%s Usage: guide {north|west|south|east} milliseconds\r\n", |
caoyuan9642 | 0:6cb2eaf8b133 | 780 | cmd); |
caoyuan9642 | 0:6cb2eaf8b133 | 781 | return ERR_WRONG_NUM_PARAM; |
caoyuan9642 | 0:6cb2eaf8b133 | 782 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 783 | |
caoyuan9642 | 0:6cb2eaf8b133 | 784 | char *tp; |
caoyuan9642 | 0:6cb2eaf8b133 | 785 | int ms = strtod(argv[1], &tp); |
caoyuan9642 | 0:6cb2eaf8b133 | 786 | if (tp == argv[1] || ms < 1 |
caoyuan9642 | 0:6cb2eaf8b133 | 787 | || ms > TelescopeConfiguration::getInt("max_guide_time")) |
caoyuan9642 | 0:6cb2eaf8b133 | 788 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 789 | return ERR_PARAM_OUT_OF_RANGE; |
caoyuan9642 | 0:6cb2eaf8b133 | 790 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 791 | |
caoyuan9642 | 0:6cb2eaf8b133 | 792 | if (strcmp("north", argv[0]) == 0) |
caoyuan9642 | 0:6cb2eaf8b133 | 793 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 794 | return server->getEqMount()->guide(GUIDE_NORTH, ms); |
caoyuan9642 | 0:6cb2eaf8b133 | 795 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 796 | else if (strcmp("south", argv[0]) == 0) |
caoyuan9642 | 0:6cb2eaf8b133 | 797 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 798 | return server->getEqMount()->guide(GUIDE_SOUTH, ms); |
caoyuan9642 | 0:6cb2eaf8b133 | 799 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 800 | else if (strcmp("west", argv[0]) == 0) |
caoyuan9642 | 0:6cb2eaf8b133 | 801 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 802 | return server->getEqMount()->guide(GUIDE_WEST, ms); |
caoyuan9642 | 0:6cb2eaf8b133 | 803 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 804 | else if (strcmp("east", argv[0]) == 0) |
caoyuan9642 | 0:6cb2eaf8b133 | 805 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 806 | return server->getEqMount()->guide(GUIDE_EAST, ms); |
caoyuan9642 | 0:6cb2eaf8b133 | 807 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 808 | else |
caoyuan9642 | 0:6cb2eaf8b133 | 809 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 810 | return ERR_PARAM_OUT_OF_RANGE; |
caoyuan9642 | 0:6cb2eaf8b133 | 811 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 812 | |
caoyuan9642 | 0:6cb2eaf8b133 | 813 | return 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 814 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 815 | |
caoyuan9642 | 0:6cb2eaf8b133 | 816 | static int eqmount_time(EqMountServer *server, const char *cmd, int argn, |
caoyuan9642 | 0:6cb2eaf8b133 | 817 | char *argv[]) |
caoyuan9642 | 0:6cb2eaf8b133 | 818 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 819 | char buf[32]; |
caoyuan9642 | 0:6cb2eaf8b133 | 820 | //Get time |
caoyuan9642 | 0:6cb2eaf8b133 | 821 | time_t t = server->getEqMount()->getClock().getTime(); |
caoyuan9642 | 0:6cb2eaf8b133 | 822 | |
caoyuan9642 | 0:6cb2eaf8b133 | 823 | if (argn >= 2) |
caoyuan9642 | 0:6cb2eaf8b133 | 824 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 825 | return ERR_WRONG_NUM_PARAM; |
caoyuan9642 | 0:6cb2eaf8b133 | 826 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 827 | else if (argn == 1) |
caoyuan9642 | 0:6cb2eaf8b133 | 828 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 829 | if (strcmp(argv[0], "stamp") == 0) |
caoyuan9642 | 0:6cb2eaf8b133 | 830 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 831 | // Print timestamp value |
caoyuan9642 | 0:6cb2eaf8b133 | 832 | stprintf(server->getStream(), "%s %d\r\n", cmd, t); |
caoyuan9642 | 0:6cb2eaf8b133 | 833 | return 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 834 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 835 | else if (strcmp(argv[0], "sidereal") == 0) |
caoyuan9642 | 0:6cb2eaf8b133 | 836 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 837 | // Print sidereal time at current location |
caoyuan9642 | 0:6cb2eaf8b133 | 838 | // 0.0 is sidereal midnight, 180/-180 is sidereal noon |
caoyuan9642 | 0:6cb2eaf8b133 | 839 | double st = CelestialMath::getLocalSiderealTime(t, |
caoyuan9642 | 0:6cb2eaf8b133 | 840 | server->getEqMount()->getLocation()); |
caoyuan9642 | 0:6cb2eaf8b133 | 841 | // int hh = ((int) floor(st / 15) + 24) % 24; |
caoyuan9642 | 0:6cb2eaf8b133 | 842 | // int mm = (int) floor((st + 360.0 - hh * 15) * 4) % 60; |
caoyuan9642 | 0:6cb2eaf8b133 | 843 | // int ss = (int) floor((st + 360.0 - hh * 15 - mm * 0.25) * 240) % 60; |
caoyuan9642 | 0:6cb2eaf8b133 | 844 | stprintf(server->getStream(), "%s %f\r\n", cmd, st); |
caoyuan9642 | 0:6cb2eaf8b133 | 845 | // stprintf(server->getStream(), "%d:%d:%d LST\r\n", hh, mm, ss); |
caoyuan9642 | 0:6cb2eaf8b133 | 846 | return 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 847 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 848 | else if (strcmp(argv[0], "local") == 0) |
caoyuan9642 | 0:6cb2eaf8b133 | 849 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 850 | t += (int) (remainder(server->getEqMount()->getLocation().lon, 360) |
caoyuan9642 | 0:6cb2eaf8b133 | 851 | * 240); |
caoyuan9642 | 1:a4d5537de7ae | 852 | |
caoyuan9642 | 1:a4d5537de7ae | 853 | core_util_critical_section_enter(); |
caoyuan9642 | 1:a4d5537de7ae | 854 | char *ibuf = ctime(&t); |
caoyuan9642 | 1:a4d5537de7ae | 855 | strncpy(buf, ibuf, sizeof(buf)); |
caoyuan9642 | 1:a4d5537de7ae | 856 | core_util_critical_section_exit(); |
caoyuan9642 | 1:a4d5537de7ae | 857 | |
caoyuan9642 | 0:6cb2eaf8b133 | 858 | stprintf(server->getStream(), "%s %s\r\n", cmd, buf); |
caoyuan9642 | 0:6cb2eaf8b133 | 859 | return 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 860 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 861 | else if (strcmp(argv[0], "zone") == 0) |
caoyuan9642 | 0:6cb2eaf8b133 | 862 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 863 | t += (int) (TelescopeConfiguration::getInt("timezone") * 3600); |
caoyuan9642 | 1:a4d5537de7ae | 864 | |
caoyuan9642 | 1:a4d5537de7ae | 865 | core_util_critical_section_enter(); |
caoyuan9642 | 1:a4d5537de7ae | 866 | char *ibuf = ctime(&t); |
caoyuan9642 | 1:a4d5537de7ae | 867 | strncpy(buf, ibuf, sizeof(buf)); |
caoyuan9642 | 1:a4d5537de7ae | 868 | core_util_critical_section_exit(); |
caoyuan9642 | 1:a4d5537de7ae | 869 | |
caoyuan9642 | 0:6cb2eaf8b133 | 870 | stprintf(server->getStream(), "%s %s\r\n", cmd, buf); |
caoyuan9642 | 0:6cb2eaf8b133 | 871 | return 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 872 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 873 | |
caoyuan9642 | 0:6cb2eaf8b133 | 874 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 875 | |
caoyuan9642 | 0:6cb2eaf8b133 | 876 | // Print of formatted string of current time |
caoyuan9642 | 1:a4d5537de7ae | 877 | core_util_critical_section_enter(); |
caoyuan9642 | 1:a4d5537de7ae | 878 | char *ibuf = ctime(&t); |
caoyuan9642 | 1:a4d5537de7ae | 879 | strncpy(buf, ibuf, sizeof(buf)); |
caoyuan9642 | 1:a4d5537de7ae | 880 | core_util_critical_section_exit(); |
caoyuan9642 | 1:a4d5537de7ae | 881 | |
caoyuan9642 | 0:6cb2eaf8b133 | 882 | stprintf(server->getStream(), "%s %s\r\n", cmd, buf); |
caoyuan9642 | 0:6cb2eaf8b133 | 883 | |
caoyuan9642 | 0:6cb2eaf8b133 | 884 | return 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 885 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 886 | |
caoyuan9642 | 0:6cb2eaf8b133 | 887 | static int eqmount_settime(EqMountServer *server, const char *cmd, int argn, |
caoyuan9642 | 0:6cb2eaf8b133 | 888 | char *argv[]) |
caoyuan9642 | 0:6cb2eaf8b133 | 889 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 890 | if (argn == 1) |
caoyuan9642 | 0:6cb2eaf8b133 | 891 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 892 | //Use the first argument as UTC timestamp |
caoyuan9642 | 0:6cb2eaf8b133 | 893 | time_t t = strtol(argv[0], NULL, 10); |
caoyuan9642 | 0:6cb2eaf8b133 | 894 | server->getEqMount()->getClock().setTime(t); |
caoyuan9642 | 0:6cb2eaf8b133 | 895 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 896 | else if (argn == 6) |
caoyuan9642 | 0:6cb2eaf8b133 | 897 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 898 | int year = strtol(argv[0], NULL, 10); |
caoyuan9642 | 0:6cb2eaf8b133 | 899 | int month = strtol(argv[1], NULL, 10); |
caoyuan9642 | 0:6cb2eaf8b133 | 900 | int day = strtol(argv[2], NULL, 10); |
caoyuan9642 | 0:6cb2eaf8b133 | 901 | int hour = strtol(argv[3], NULL, 10); |
caoyuan9642 | 0:6cb2eaf8b133 | 902 | int min = strtol(argv[4], NULL, 10); |
caoyuan9642 | 0:6cb2eaf8b133 | 903 | int sec = strtol(argv[5], NULL, 10); |
caoyuan9642 | 0:6cb2eaf8b133 | 904 | struct tm ts; |
caoyuan9642 | 0:6cb2eaf8b133 | 905 | ts.tm_sec = sec; |
caoyuan9642 | 0:6cb2eaf8b133 | 906 | ts.tm_min = min; |
caoyuan9642 | 0:6cb2eaf8b133 | 907 | ts.tm_hour = hour; |
caoyuan9642 | 0:6cb2eaf8b133 | 908 | ts.tm_mday = day; |
caoyuan9642 | 0:6cb2eaf8b133 | 909 | ts.tm_mon = month - 1; |
caoyuan9642 | 0:6cb2eaf8b133 | 910 | ts.tm_year = year - 1900; |
caoyuan9642 | 0:6cb2eaf8b133 | 911 | ts.tm_isdst = 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 912 | |
caoyuan9642 | 0:6cb2eaf8b133 | 913 | time_t t = mktime(&ts); |
caoyuan9642 | 0:6cb2eaf8b133 | 914 | if (t == -1) |
caoyuan9642 | 0:6cb2eaf8b133 | 915 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 916 | // Parameter out of range |
caoyuan9642 | 0:6cb2eaf8b133 | 917 | return 2; |
caoyuan9642 | 0:6cb2eaf8b133 | 918 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 919 | |
caoyuan9642 | 0:6cb2eaf8b133 | 920 | server->getEqMount()->getClock().setTime(t); |
caoyuan9642 | 0:6cb2eaf8b133 | 921 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 922 | else |
caoyuan9642 | 0:6cb2eaf8b133 | 923 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 924 | stprintf(server->getStream(), |
caoyuan9642 | 0:6cb2eaf8b133 | 925 | "%s usage: settime <timestamp>, or, settime <year> <month> <day> <hour> <minute> <second> (UTC time should be used)\r\n", |
caoyuan9642 | 0:6cb2eaf8b133 | 926 | cmd); |
caoyuan9642 | 0:6cb2eaf8b133 | 927 | return 1; |
caoyuan9642 | 0:6cb2eaf8b133 | 928 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 929 | |
caoyuan9642 | 0:6cb2eaf8b133 | 930 | return 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 931 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 932 | |
caoyuan9642 | 0:6cb2eaf8b133 | 933 | void EqMountServer::addCommand(const ServerCommand& cmd) |
caoyuan9642 | 0:6cb2eaf8b133 | 934 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 935 | int i = 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 936 | while (i < MAX_COMMAND && commandlist[i].fptr != NULL) |
caoyuan9642 | 0:6cb2eaf8b133 | 937 | i++; |
caoyuan9642 | 0:6cb2eaf8b133 | 938 | if (i >= MAX_COMMAND - 1) |
caoyuan9642 | 0:6cb2eaf8b133 | 939 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 940 | debug("Error: max command reached.\n"); |
caoyuan9642 | 0:6cb2eaf8b133 | 941 | return; |
caoyuan9642 | 0:6cb2eaf8b133 | 942 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 943 | |
caoyuan9642 | 0:6cb2eaf8b133 | 944 | commandlist[i] = cmd; |
caoyuan9642 | 0:6cb2eaf8b133 | 945 | commandlist[++i] = ServerCommand("", "", NULL); |
caoyuan9642 | 0:6cb2eaf8b133 | 946 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 947 | |
caoyuan9642 | 0:6cb2eaf8b133 | 948 | ServerCommand commandlist[MAX_COMMAND] = |
caoyuan9642 | 0:6cb2eaf8b133 | 949 | { /// List of all commands |
caoyuan9642 | 0:6cb2eaf8b133 | 950 | ServerCommand("stop", "Stop mount motion", eqmount_stop), /// Stop |
caoyuan9642 | 0:6cb2eaf8b133 | 951 | ServerCommand("estop", "Emergency stop", eqmount_estop), /// Emergency Stop |
caoyuan9642 | 0:6cb2eaf8b133 | 952 | ServerCommand("read", "Read current RA/DEC position", eqmount_read), /// Read Position |
caoyuan9642 | 0:6cb2eaf8b133 | 953 | ServerCommand("time", "Get and set system time", eqmount_time), /// System time |
caoyuan9642 | 0:6cb2eaf8b133 | 954 | ServerCommand("status", "Get the mount state", eqmount_state), /// System state |
caoyuan9642 | 0:6cb2eaf8b133 | 955 | ServerCommand("help", "Print this help menu", eqmount_help), /// Help menu |
caoyuan9642 | 0:6cb2eaf8b133 | 956 | ServerCommand("speed", "Set slew and tracking speed", eqmount_speed), /// Set speed |
caoyuan9642 | 0:6cb2eaf8b133 | 957 | ServerCommand("align", "Star alignment", eqmount_align), /// Alignment |
caoyuan9642 | 0:6cb2eaf8b133 | 958 | /// Above are allowed commands when another command is running |
caoyuan9642 | 0:6cb2eaf8b133 | 959 | |
caoyuan9642 | 0:6cb2eaf8b133 | 960 | ServerCommand("goto", |
caoyuan9642 | 0:6cb2eaf8b133 | 961 | "Perform go to operation to specified ra, dec coordinates", |
caoyuan9642 | 0:6cb2eaf8b133 | 962 | eqmount_goto), /// Go to |
caoyuan9642 | 0:6cb2eaf8b133 | 963 | ServerCommand("nudge", "Perform nudging on specified direction", |
caoyuan9642 | 0:6cb2eaf8b133 | 964 | eqmount_nudge), /// Nudge |
caoyuan9642 | 0:6cb2eaf8b133 | 965 | ServerCommand("track", "Start tracking in specified direction", |
caoyuan9642 | 0:6cb2eaf8b133 | 966 | eqmount_track), /// Track |
caoyuan9642 | 0:6cb2eaf8b133 | 967 | ServerCommand("guide", "Guide on specified direction", |
caoyuan9642 | 0:6cb2eaf8b133 | 968 | eqmount_guide), /// Guide |
caoyuan9642 | 0:6cb2eaf8b133 | 969 | ServerCommand("settime", "Set system time", eqmount_settime), /// System time |
caoyuan9642 | 0:6cb2eaf8b133 | 970 | ServerCommand("", "", NULL) }; |
caoyuan9642 | 0:6cb2eaf8b133 | 971 | |
caoyuan9642 | 0:6cb2eaf8b133 | 972 |