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