Telescope Control Library

Dependents:   PushToGo-F429

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

Who changed what in which revision?

UserRevisionLine numberNew contents of line
caoyuan9642 0:6cb2eaf8b133 1 /*
caoyuan9642 0:6cb2eaf8b133 2 * TelescopeConfiguration.cpp
caoyuan9642 0:6cb2eaf8b133 3 *
caoyuan9642 0:6cb2eaf8b133 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 <TelescopeConfiguration.h>
caoyuan9642 0:6cb2eaf8b133 9 #include "mbed.h"
caoyuan9642 0:6cb2eaf8b133 10 #include <stdio.h>
caoyuan9642 0:6cb2eaf8b133 11 #include <ctype.h>
caoyuan9642 0:6cb2eaf8b133 12 #include <string.h>
caoyuan9642 0:6cb2eaf8b133 13 #include <stdlib.h>
caoyuan9642 0:6cb2eaf8b133 14
caoyuan9642 0:6cb2eaf8b133 15 #define TC_DEBUG 1
caoyuan9642 0:6cb2eaf8b133 16
caoyuan9642 0:6cb2eaf8b133 17 TelescopeConfiguration TelescopeConfiguration::instance =
caoyuan9642 0:6cb2eaf8b133 18 TelescopeConfiguration();
caoyuan9642 0:6cb2eaf8b133 19
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 20 static const char *typeName(DataType type) {
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 21 switch (type) {
caoyuan9642 0:6cb2eaf8b133 22 case DATATYPE_INT:
caoyuan9642 0:6cb2eaf8b133 23 return "INT";
caoyuan9642 0:6cb2eaf8b133 24 case DATATYPE_DOUBLE:
caoyuan9642 0:6cb2eaf8b133 25 return "DOUBLE";
caoyuan9642 0:6cb2eaf8b133 26 case DATATYPE_BOOL:
caoyuan9642 0:6cb2eaf8b133 27 return "BOOL";
caoyuan9642 0:6cb2eaf8b133 28 case DATATYPE_STRING:
caoyuan9642 0:6cb2eaf8b133 29 return "STRING";
caoyuan9642 0:6cb2eaf8b133 30 default:
caoyuan9642 0:6cb2eaf8b133 31 return "UNKNOWN";
caoyuan9642 0:6cb2eaf8b133 32 }
caoyuan9642 0:6cb2eaf8b133 33 }
caoyuan9642 0:6cb2eaf8b133 34
caoyuan9642 0:6cb2eaf8b133 35 static const ConfigItem default_config[] =
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 36 { { .config = "latitude", .name = "Your latitude", .help =
caoyuan9642 0:6cb2eaf8b133 37 "Latitude of observer, in degrees north of equator.", .type =
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 38 DATATYPE_DOUBLE, .value = { .ddata = 42 }, .min =
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 39 { .ddata = -90 }, .max = { .ddata = 90 } }, { .config =
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 40 "longitude", .name = "Your longitude", .help =
caoyuan9642 0:6cb2eaf8b133 41 "Longitude of observer, in degrees east of Greenwich.", .type =
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 42 DATATYPE_DOUBLE, .value = { .ddata = -73 }, .min = { .ddata =
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 43 -180 }, .max = { .ddata = 180 } }, { .config = "timezone",
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 44 .name = "Your timezone", .help =
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 45 "Timezone in hours ahead of UTC time.", .type =
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 46 DATATYPE_INT, .value = { .idata = -4 }, .min = {
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 47 .idata = -12 }, .max = { .idata = 12 } },
caoyuan9642 0:6cb2eaf8b133 48 { .config = "motor_steps", .name = "Steps per Revolution",
caoyuan9642 0:6cb2eaf8b133 49 .help =
caoyuan9642 0:6cb2eaf8b133 50 "Motor steps/revolution.\nIf you hard-programed the microstepping, here should use total microstep resolution.",
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 51 .type = DATATYPE_INT, .value = { .idata = 400 }, .min =
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 52 { .idata = 1 }, .max = { .idata = 1000000 } }, {
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 53 .config = "gear_reduction", .name = "Gear Ratio",
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 54 .help = "Gearbox reduction ratio. ", .type =
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 55 DATATYPE_DOUBLE, .value = { .ddata = 1 }, .min =
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 56 { .ddata = 0 }, .max = { .ddata = 10000 } }, {
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 57 .config = "worm_teeth", .name = "Worm Teeth", .help =
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 58 "Number of teeth on the ring gear.", .type =
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 59 DATATYPE_INT, .value = { .idata = 180 }, .min =
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 60 { .idata = 1 }, .max = { .idata = 10000 } },
caoyuan9642 0:6cb2eaf8b133 61 { .config = "ra_invert", .name = "Invert RA direction",
caoyuan9642 0:6cb2eaf8b133 62 .help =
caoyuan9642 0:6cb2eaf8b133 63 "Invert RA driving direction?\n Save and restart to take effect",
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 64 .type = DATATYPE_BOOL, .value = { .bdata = false } },
caoyuan9642 0:6cb2eaf8b133 65 { .config = "dec_invert", .name = "Invert DEC direction",
caoyuan9642 0:6cb2eaf8b133 66 .help =
caoyuan9642 0:6cb2eaf8b133 67 "Invert DEC driving direction?\n Save and restart to take effect",
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 68 .type = DATATYPE_BOOL, .value = { .bdata = false } }, {
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 69 .config = "default_slew_speed", .name =
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 70 "Default slew speed", .help =
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 71 "Default slewing speed in deg/s", .type =
caoyu@caoyuan9642-desktop.MIT.EDU 10:e356188d208e 72 DATATYPE_DOUBLE, .value = { .ddata = 4 }, .min =
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 73 { .ddata = 1 }, .max = { .ddata = 10 } }, {
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 74 .config = "goto_slew_speed", .name =
caoyu@caoyuan9642-desktop.MIT.EDU 16:711c2e581b20 75 "Goto slew speed", .help =
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 76 "Slewing speed used for goto, in deg/s", .type =
caoyu@caoyuan9642-desktop.MIT.EDU 10:e356188d208e 77 DATATYPE_DOUBLE, .value = { .ddata = 4 }, .min =
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 78 { .ddata = 1 }, .max = { .ddata = 10 } },
caoyuan9642 0:6cb2eaf8b133 79 { .config = "default_track_speed_sidereal", .name =
caoyuan9642 0:6cb2eaf8b133 80 "Default track speed", .help =
caoyuan9642 0:6cb2eaf8b133 81 "Default slewing speed in multiple of sidereal rate.",
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 82 .type = DATATYPE_DOUBLE, .value = { .ddata = 1 }, .min =
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 83 { .ddata = 0 }, .max = { .ddata = 100 } },
caoyuan9642 0:6cb2eaf8b133 84 { .config = "correction_speed_sidereal", .name =
caoyuan9642 0:6cb2eaf8b133 85 "Default correction speed", .help =
caoyuan9642 0:6cb2eaf8b133 86 "Correction speed in multiple of sidereal rate.",
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 87 .type = DATATYPE_DOUBLE, .value = { .ddata = 32 },
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 88 .min = { .ddata = 0 }, .max = { .ddata = 100 } },
caoyuan9642 0:6cb2eaf8b133 89 { .config = "default_guide_speed_sidereal", .name =
caoyuan9642 0:6cb2eaf8b133 90 "Default guiding speed", .help =
caoyuan9642 0:6cb2eaf8b133 91 "Default guiding speed in multiple of sidereal rate.",
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 92 .type = DATATYPE_DOUBLE, .value = { .ddata = 0.5 },
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 93 .min = { .ddata = 0 }, .max = { .ddata = 100 } }, {
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 94 .config = "acceleration", .name = "Acceleration",
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 95 .help = "Acceleration in deg/s^2.", .type =
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 96 DATATYPE_DOUBLE, .value = { .ddata = 2 }, .min =
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 97 { .ddata = 0.01 }, .max = { .ddata = 1000 } },
caoyuan9642 0:6cb2eaf8b133 98 { .config = "max_speed", .name = "Max slewing speed", .help =
caoyuan9642 0:6cb2eaf8b133 99 "Max slewing speed. Reduce this value if losing steps.",
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 100 .type = DATATYPE_DOUBLE, .value = { .ddata = 4 }, .min =
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 101 { .ddata = 1 }, .max = { .ddata = 100 } },
caoyuan9642 0:6cb2eaf8b133 102 { .config = "min_slew_angle", .name = "Min slewing distance",
caoyuan9642 0:6cb2eaf8b133 103 .help =
caoyuan9642 0:6cb2eaf8b133 104 "Min slew angle, in deg. Angle difference below this value will be approached by correction alone.",
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 105 .type = DATATYPE_DOUBLE, .value = { .ddata = 0.3 },
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 106 .min = { .ddata = 0.001 }, .max = { .ddata = 10 } }, {
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 107 .config = "correction_tolerance", .name =
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 108 "Correction Tolerance", .help =
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 109 "Correction tolerance in deg", .type =
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 110 DATATYPE_DOUBLE, .value = { .ddata = 0.03 },
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 111 .min = { .ddata = 0.001 }, .max = { .ddata = 1 } },
caoyuan9642 0:6cb2eaf8b133 112 { .config = "min_correction_time",
caoyuan9642 0:6cb2eaf8b133 113 .name = "Min Correction Time",
caoyuan9642 0:6cb2eaf8b133 114 .help =
caoyuan9642 0:6cb2eaf8b133 115 "Minimum correction time in milliseconds. Corrections less than this will be ignored.",
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 116 .type = DATATYPE_INT, .value = { .idata = 5 }, .min = {
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 117 .idata = 1 }, .max = { .idata = 1000 } },
caoyuan9642 0:6cb2eaf8b133 118 { .config = "max_correction_angle", .name =
caoyuan9642 0:6cb2eaf8b133 119 "Max Correction Angle",
caoyuan9642 0:6cb2eaf8b133 120 .help =
caoyuan9642 0:6cb2eaf8b133 121 "Max correction angle in deg. Corrections larger than this value will still be executed, but give you a warning since it will take a long time and something is likely wrong.",
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 122 .type = DATATYPE_DOUBLE, .value = { .ddata = 5 }, .min =
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 123 { .ddata = 0 }, .max = { .ddata = 180 } },
caoyuan9642 0:6cb2eaf8b133 124 { .config = "max_guide_time", .name = "Max Guiding Time",
caoyuan9642 0:6cb2eaf8b133 125 .help =
caoyuan9642 0:6cb2eaf8b133 126 "Max guide time in milliseconds. Guide pulses larger than this value will be truncated.",
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 127 .type = DATATYPE_INT, .value = { .idata = 5000 }, .min =
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 128 { .idata = 100 }, .max = { .idata = 10000000 } },
caoyuan9642 0:6cb2eaf8b133 129 { .config = "acceleration_step_time", .name =
caoyuan9642 0:6cb2eaf8b133 130 "Acceleration Step Time",
caoyuan9642 0:6cb2eaf8b133 131 .help =
caoyuan9642 0:6cb2eaf8b133 132 "Acceleration step time in milliseconds. The default value should work for most situations.",
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 133 .type = DATATYPE_INT, .value = { .idata = 5 }, .min = {
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 134 .idata = 1 }, .max = { .idata = 1000 } },
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 135 { .config = "pec_granularity", .name =
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 136 "PEC Granularity",
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 137 .help =
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 138 "Number of PEC slots per revolution of the worm",
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 139 .type = DATATYPE_INT, .value = { .idata = 512 }, .min = {
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 140 .idata = 32 }, .max = { .idata = 16384} }, {
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 141 .config = "" } };
caoyuan9642 0:6cb2eaf8b133 142
caoyuan9642 0:6cb2eaf8b133 143 int TelescopeConfiguration::eqmount_config(EqMountServer *server,
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 144 const char *cmd, int argn, char *argv[]) {
caoyuan9642 0:6cb2eaf8b133 145 char buf[256];
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 146 if (argn == 0) {
caoyuan9642 0:6cb2eaf8b133 147 // Print all config names
caoyuan9642 0:6cb2eaf8b133 148 ConfigNode *p = instance.head;
caoyuan9642 0:6cb2eaf8b133 149 stprintf(server->getStream(), "%s", cmd);
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 150 for (; p; p = p->next) {
caoyuan9642 0:6cb2eaf8b133 151 stprintf(server->getStream(), " %s", p->config->config);
caoyuan9642 0:6cb2eaf8b133 152 // Get string representing the value
caoyuan9642 0:6cb2eaf8b133 153 // getStringFromConfig(p->config, buf, sizeof(buf));
caoyuan9642 0:6cb2eaf8b133 154 // stprintf(server->getStream(), "%s %s,%s,%s,%s\r\n", cmd,
caoyuan9642 0:6cb2eaf8b133 155 // p->config->config, p->config->name,
caoyuan9642 0:6cb2eaf8b133 156 // typeName(p->config->type), buf);
caoyuan9642 0:6cb2eaf8b133 157 }
caoyuan9642 0:6cb2eaf8b133 158 stprintf(server->getStream(), "\r\n");
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 159 } else {
caoyuan9642 0:6cb2eaf8b133 160 char *config_name = argv[0]; // Name of the config in question
caoyuan9642 0:6cb2eaf8b133 161 ConfigItem *config = instance.getConfigItem(config_name);
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 162 if (!config) {
caoyuan9642 0:6cb2eaf8b133 163 stprintf(server->getStream(), "%s Error: config %s not found\r\n",
caoyuan9642 0:6cb2eaf8b133 164 cmd, config_name);
caoyuan9642 0:6cb2eaf8b133 165 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 166 }
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 167 if (argn == 1) {
caoyuan9642 0:6cb2eaf8b133 168 // Print value of the config
caoyuan9642 0:6cb2eaf8b133 169 getStringFromConfig(config, buf, sizeof(buf));
caoyuan9642 0:6cb2eaf8b133 170 stprintf(server->getStream(), "%s %s\r\n", cmd, buf);
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 171 } else if (argn == 2) {
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 172 if (strcmp(argv[1], "default") == 0) {
caoyuan9642 0:6cb2eaf8b133 173 // Print default value of the config
caoyuan9642 0:6cb2eaf8b133 174 // TODO
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 175 } else if (strcmp(argv[1], "name") == 0) {
caoyuan9642 0:6cb2eaf8b133 176 // Print name
caoyuan9642 0:6cb2eaf8b133 177 stprintf(server->getStream(), "%s %s\r\n", cmd, config->name);
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 178 } else if (strcmp(argv[1], "help") == 0) {
caoyuan9642 0:6cb2eaf8b133 179 // Print help
caoyuan9642 0:6cb2eaf8b133 180 stprintf(server->getStream(), "%s %s\r\n", cmd, config->help);
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 181 } else if (strcmp(argv[1], "type") == 0) {
caoyuan9642 0:6cb2eaf8b133 182 // Print type
caoyuan9642 0:6cb2eaf8b133 183 stprintf(server->getStream(), "%s %s\r\n", cmd,
caoyuan9642 0:6cb2eaf8b133 184 typeName(config->type));
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 185 } else if (strcmp(argv[1], "info") == 0) {
caoyuan9642 0:6cb2eaf8b133 186 // Print type, value, name and help
caoyuan9642 0:6cb2eaf8b133 187 getStringFromConfig(config, buf, sizeof(buf));
caoyuan9642 0:6cb2eaf8b133 188 stprintf(server->getStream(), "%s %s,%s,%s,%s\r\n", cmd,
caoyuan9642 0:6cb2eaf8b133 189 typeName(config->type), buf, config->name,
caoyuan9642 0:6cb2eaf8b133 190 config->help);
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 191 } else if (strcmp(argv[1], "limit") == 0) {
caoyuan9642 0:6cb2eaf8b133 192 // Print min/max
caoyuan9642 0:6cb2eaf8b133 193 if (config->type != DATATYPE_STRING
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 194 && config->type != DATATYPE_BOOL && !config->extra) {
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 195 switch (config->type) {
caoyuan9642 0:6cb2eaf8b133 196 case DATATYPE_INT:
caoyuan9642 0:6cb2eaf8b133 197 stprintf(server->getStream(), "%s %d %d\r\n", cmd,
caoyuan9642 0:6cb2eaf8b133 198 config->min.idata, config->max.idata);
caoyuan9642 0:6cb2eaf8b133 199 break;
caoyuan9642 0:6cb2eaf8b133 200 case DATATYPE_DOUBLE:
caoyuan9642 0:6cb2eaf8b133 201 stprintf(server->getStream(), "%s %.8f %.8f\r\n", cmd,
caoyuan9642 0:6cb2eaf8b133 202 config->min.ddata, config->max.ddata);
caoyuan9642 0:6cb2eaf8b133 203 break;
caoyuan9642 0:6cb2eaf8b133 204 default:
caoyuan9642 0:6cb2eaf8b133 205 break;
caoyuan9642 0:6cb2eaf8b133 206 }
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 207 } else {
caoyuan9642 0:6cb2eaf8b133 208 stprintf(server->getStream(),
caoyuan9642 0:6cb2eaf8b133 209 "%s limit not supported for %s.\r\n", cmd,
caoyuan9642 0:6cb2eaf8b133 210 config->config);
caoyuan9642 0:6cb2eaf8b133 211 }
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 212 } else {
caoyuan9642 0:6cb2eaf8b133 213 // Set value
caoyuan9642 0:6cb2eaf8b133 214 char *value = argv[1];
caoyuan9642 0:6cb2eaf8b133 215 char *s;
caoyuan9642 0:6cb2eaf8b133 216 int i;
caoyuan9642 0:6cb2eaf8b133 217 double d;
caoyuan9642 0:6cb2eaf8b133 218 bool b;
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 219 switch (config->type) {
caoyuan9642 0:6cb2eaf8b133 220 case DATATYPE_INT:
caoyuan9642 0:6cb2eaf8b133 221 i = strtol(value, &s, 10);
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 222 if (s == value || setIntToConfig(config, i)) {
caoyuan9642 0:6cb2eaf8b133 223 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 224 }
caoyuan9642 0:6cb2eaf8b133 225 break;
caoyuan9642 0:6cb2eaf8b133 226 case DATATYPE_DOUBLE:
caoyuan9642 0:6cb2eaf8b133 227 d = strtod(value, &s);
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 228 if (s == value || setDoubleToConfig(config, d)) {
caoyuan9642 0:6cb2eaf8b133 229 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 230 }
caoyuan9642 0:6cb2eaf8b133 231 break;
caoyuan9642 0:6cb2eaf8b133 232 case DATATYPE_BOOL:
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 233 if (strcmp(value, "true") == 0) {
caoyuan9642 0:6cb2eaf8b133 234 b = true;
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 235 } else if (strcmp(value, "false") == 0) {
caoyuan9642 0:6cb2eaf8b133 236 b = false;
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 237 } else {
caoyuan9642 0:6cb2eaf8b133 238 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 239 }
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 240 if (setBoolToConfig(config, b)) {
caoyuan9642 0:6cb2eaf8b133 241 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 242 }
caoyuan9642 0:6cb2eaf8b133 243 break;
caoyuan9642 0:6cb2eaf8b133 244 case DATATYPE_STRING:
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 245 if (setStringToConfig(config, value)) {
caoyuan9642 0:6cb2eaf8b133 246 return ERR_PARAM_OUT_OF_RANGE;
caoyuan9642 0:6cb2eaf8b133 247 }
caoyuan9642 0:6cb2eaf8b133 248 break;
caoyuan9642 0:6cb2eaf8b133 249 }
caoyuan9642 0:6cb2eaf8b133 250 }
caoyuan9642 0:6cb2eaf8b133 251 }
caoyuan9642 0:6cb2eaf8b133 252 }
caoyuan9642 0:6cb2eaf8b133 253 return 0;
caoyuan9642 0:6cb2eaf8b133 254 }
caoyuan9642 0:6cb2eaf8b133 255
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 256 TelescopeConfiguration::TelescopeConfiguration() {
caoyuan9642 0:6cb2eaf8b133 257 ConfigNode *q = NULL, *r;
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 258 for (const ConfigItem *p = default_config; *(p->config) != '\0'; p++) {
caoyuan9642 0:6cb2eaf8b133 259 r = new ConfigNode;
caoyuan9642 0:6cb2eaf8b133 260 r->next = q;
caoyuan9642 0:6cb2eaf8b133 261 r->config = new ConfigItem(*p);
caoyuan9642 0:6cb2eaf8b133 262 r->default_config = p;
caoyuan9642 0:6cb2eaf8b133 263 q = r;
caoyuan9642 0:6cb2eaf8b133 264 }
caoyuan9642 0:6cb2eaf8b133 265 head = r;
caoyuan9642 0:6cb2eaf8b133 266
caoyuan9642 0:6cb2eaf8b133 267 EqMountServer::addCommand(
caoyuan9642 0:6cb2eaf8b133 268 ServerCommand("config", "Configuration subsystem",
caoyuan9642 0:6cb2eaf8b133 269 TelescopeConfiguration::eqmount_config));
caoyuan9642 0:6cb2eaf8b133 270 }
caoyuan9642 0:6cb2eaf8b133 271
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 272 int TelescopeConfiguration::getIntFromConfig(ConfigItem *config) {
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 273 if (config->type != DATATYPE_INT) {
caoyuan9642 0:6cb2eaf8b133 274 error("Data type mismatch: wanted %s, actual %s",
caoyuan9642 0:6cb2eaf8b133 275 typeName(DATATYPE_INT), typeName(config->type));
caoyuan9642 0:6cb2eaf8b133 276 }
caoyuan9642 0:6cb2eaf8b133 277 return config->value.idata;
caoyuan9642 0:6cb2eaf8b133 278 }
caoyuan9642 0:6cb2eaf8b133 279
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 280 double TelescopeConfiguration::getDoubleFromConfig(ConfigItem *config) {
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 281 if (config->type != DATATYPE_DOUBLE && config->type != DATATYPE_INT) {
caoyuan9642 0:6cb2eaf8b133 282 error("Data type mismatch: wanted %s, actual %s",
caoyuan9642 0:6cb2eaf8b133 283 typeName(DATATYPE_DOUBLE), typeName(config->type));
caoyuan9642 0:6cb2eaf8b133 284 }
caoyuan9642 0:6cb2eaf8b133 285 return (config->type == DATATYPE_DOUBLE) ?
caoyuan9642 0:6cb2eaf8b133 286 config->value.ddata : config->value.idata;
caoyuan9642 0:6cb2eaf8b133 287 }
caoyuan9642 0:6cb2eaf8b133 288
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 289 bool TelescopeConfiguration::getBoolFromConfig(ConfigItem *config) {
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 290 if (config->type != DATATYPE_BOOL) {
caoyuan9642 0:6cb2eaf8b133 291 error("Data type mismatch: wanted %s, actual %s",
caoyuan9642 0:6cb2eaf8b133 292 typeName(DATATYPE_BOOL), typeName(config->type));
caoyuan9642 0:6cb2eaf8b133 293 }
caoyuan9642 0:6cb2eaf8b133 294 return config->value.bdata;
caoyuan9642 0:6cb2eaf8b133 295 }
caoyuan9642 0:6cb2eaf8b133 296
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 297 bool TelescopeConfiguration::setIntToConfig(ConfigItem *config, int value) {
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 298 if (config == NULL) {
caoyuan9642 0:6cb2eaf8b133 299 debug_if(TC_DEBUG, "Null config");
caoyuan9642 0:6cb2eaf8b133 300 return true;
caoyuan9642 0:6cb2eaf8b133 301 }
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 302 if (config->type != DATATYPE_DOUBLE && config->type != DATATYPE_INT) {
caoyuan9642 0:6cb2eaf8b133 303 debug_if(TC_DEBUG, "Data type mismatch: wanted %s, actual %s",
caoyuan9642 0:6cb2eaf8b133 304 typeName(DATATYPE_INT), typeName(config->type));
caoyuan9642 0:6cb2eaf8b133 305 return true;
caoyuan9642 0:6cb2eaf8b133 306 }
caoyuan9642 0:6cb2eaf8b133 307 if (config->type == DATATYPE_INT)
caoyuan9642 0:6cb2eaf8b133 308 config->value.idata = value;
caoyuan9642 0:6cb2eaf8b133 309 else
caoyuan9642 0:6cb2eaf8b133 310 config->value.ddata = value;
caoyuan9642 0:6cb2eaf8b133 311 return false;
caoyuan9642 0:6cb2eaf8b133 312 }
caoyuan9642 0:6cb2eaf8b133 313
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 314 bool TelescopeConfiguration::setDoubleToConfig(ConfigItem *config,
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 315 double value) {
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 316 if (config == NULL) {
caoyuan9642 0:6cb2eaf8b133 317 debug_if(TC_DEBUG, "Null config");
caoyuan9642 0:6cb2eaf8b133 318 return true;
caoyuan9642 0:6cb2eaf8b133 319 }
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 320 if (config->type != DATATYPE_DOUBLE) {
caoyuan9642 0:6cb2eaf8b133 321 error("Data type mismatch: wanted %s, actual %s",
caoyuan9642 0:6cb2eaf8b133 322 typeName(DATATYPE_DOUBLE), typeName(config->type));
caoyuan9642 0:6cb2eaf8b133 323 return true;
caoyuan9642 0:6cb2eaf8b133 324 }
caoyuan9642 0:6cb2eaf8b133 325 config->value.ddata = value;
caoyuan9642 0:6cb2eaf8b133 326 return false;
caoyuan9642 0:6cb2eaf8b133 327 }
caoyuan9642 0:6cb2eaf8b133 328
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 329 bool TelescopeConfiguration::setBoolToConfig(ConfigItem *config, bool value) {
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 330 if (config == NULL) {
caoyuan9642 0:6cb2eaf8b133 331 debug_if(TC_DEBUG, "Null config");
caoyuan9642 0:6cb2eaf8b133 332 return true;
caoyuan9642 0:6cb2eaf8b133 333 }
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 334 if (config->type != DATATYPE_BOOL) {
caoyuan9642 0:6cb2eaf8b133 335 debug_if(TC_DEBUG, "Data type mismatch: wanted %s, actual %s",
caoyuan9642 0:6cb2eaf8b133 336 typeName(DATATYPE_BOOL), typeName(config->type));
caoyuan9642 0:6cb2eaf8b133 337 return true;
caoyuan9642 0:6cb2eaf8b133 338 }
caoyuan9642 0:6cb2eaf8b133 339 config->value.bdata = value;
caoyuan9642 0:6cb2eaf8b133 340 return false;
caoyuan9642 0:6cb2eaf8b133 341 }
caoyuan9642 0:6cb2eaf8b133 342
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 343 bool TelescopeConfiguration::setStringToConfig(ConfigItem *config,
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 344 char* value) {
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 345 if (config == NULL) {
caoyuan9642 0:6cb2eaf8b133 346 debug_if(TC_DEBUG, "Null config");
caoyuan9642 0:6cb2eaf8b133 347 return true;
caoyuan9642 0:6cb2eaf8b133 348 }
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 349 if (config->type != DATATYPE_STRING) {
caoyuan9642 0:6cb2eaf8b133 350 debug_if(TC_DEBUG, "Data type mismatch: wanted %s, actual %s",
caoyuan9642 0:6cb2eaf8b133 351 typeName(DATATYPE_STRING), typeName(config->type));
caoyuan9642 0:6cb2eaf8b133 352 return true;
caoyuan9642 0:6cb2eaf8b133 353 }
caoyuan9642 0:6cb2eaf8b133 354 strncpy(config->value.strdata, value, sizeof(config->value.strdata));
caoyuan9642 0:6cb2eaf8b133 355 return false;
caoyuan9642 0:6cb2eaf8b133 356 }
caoyuan9642 0:6cb2eaf8b133 357
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 358 ConfigItem* TelescopeConfiguration::getConfigItemCheck(const char* name) {
caoyuan9642 0:6cb2eaf8b133 359 ConfigItem *config = getConfigItem(name);
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 360 if (!config) {
caoyuan9642 0:6cb2eaf8b133 361 error("Config not found: %s", name);
caoyuan9642 0:6cb2eaf8b133 362 return NULL;
caoyuan9642 0:6cb2eaf8b133 363 }
caoyuan9642 0:6cb2eaf8b133 364 return config;
caoyuan9642 0:6cb2eaf8b133 365 }
caoyuan9642 0:6cb2eaf8b133 366
caoyuan9642 0:6cb2eaf8b133 367 char* TelescopeConfiguration::getStringFromConfig(ConfigItem *config,
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 368 char buf[], int len) {
caoyuan9642 0:6cb2eaf8b133 369 if (!buf)
caoyuan9642 0:6cb2eaf8b133 370 return NULL;
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 371 switch (config->type) {
caoyuan9642 0:6cb2eaf8b133 372 case DATATYPE_DOUBLE:
caoyuan9642 0:6cb2eaf8b133 373 snprintf(buf, len, "%.8f", config->value.ddata);
caoyuan9642 0:6cb2eaf8b133 374 break;
caoyuan9642 0:6cb2eaf8b133 375 case DATATYPE_INT:
caoyuan9642 0:6cb2eaf8b133 376 snprintf(buf, len, "%d", config->value.idata);
caoyuan9642 0:6cb2eaf8b133 377 break;
caoyuan9642 0:6cb2eaf8b133 378 case DATATYPE_BOOL:
caoyuan9642 0:6cb2eaf8b133 379 snprintf(buf, len, "%s", config->value.bdata ? "true" : "false");
caoyuan9642 0:6cb2eaf8b133 380 break;
caoyuan9642 0:6cb2eaf8b133 381 case DATATYPE_STRING:
caoyuan9642 0:6cb2eaf8b133 382 strncpy(buf, config->value.strdata, len);
caoyuan9642 0:6cb2eaf8b133 383 break;
caoyuan9642 0:6cb2eaf8b133 384 }
caoyuan9642 0:6cb2eaf8b133 385 return buf;
caoyuan9642 0:6cb2eaf8b133 386 }
caoyuan9642 0:6cb2eaf8b133 387
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 388 void TelescopeConfiguration::setConfig(const char* name, char *value) {
caoyuan9642 0:6cb2eaf8b133 389 ConfigItem *config = instance.getConfigItem(name);
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 390 if (config == NULL) {
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 391 if (*value == '\0') {
caoyuan9642 0:6cb2eaf8b133 392 // Empty value string, don't add
caoyuan9642 0:6cb2eaf8b133 393 return;
caoyuan9642 0:6cb2eaf8b133 394 }
caoyuan9642 0:6cb2eaf8b133 395 // Create new node
caoyuan9642 0:6cb2eaf8b133 396 config = new ConfigItem;
caoyuan9642 0:6cb2eaf8b133 397 config->config = new char[strlen(name) + 1];
caoyuan9642 0:6cb2eaf8b133 398 strcpy(config->config, name);
caoyuan9642 0:6cb2eaf8b133 399 config->help = "";
caoyuan9642 0:6cb2eaf8b133 400 config->name = config->config;
caoyuan9642 0:6cb2eaf8b133 401 config->extra = true;
caoyuan9642 0:6cb2eaf8b133 402 ConfigNode *n = new ConfigNode;
caoyuan9642 0:6cb2eaf8b133 403 n->config = config;
caoyuan9642 0:6cb2eaf8b133 404 n->default_config = NULL;
caoyuan9642 0:6cb2eaf8b133 405 n->next = instance.head;
caoyuan9642 0:6cb2eaf8b133 406 instance.head = n;
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 407 if (strcmp(value, "true") == 0 || strcmp(value, "false") == 0) {
caoyuan9642 0:6cb2eaf8b133 408 config->type = DATATYPE_BOOL;
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 409 } else if (!isalpha(value[0])) {
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 410 if (strchr(value, '.') == NULL) { // Look for decimal point
caoyuan9642 0:6cb2eaf8b133 411 config->type = DATATYPE_INT;
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 412 } else {
caoyuan9642 0:6cb2eaf8b133 413 config->type = DATATYPE_DOUBLE;
caoyuan9642 0:6cb2eaf8b133 414 }
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 415 } else {
caoyuan9642 0:6cb2eaf8b133 416 config->type = DATATYPE_STRING;
caoyuan9642 0:6cb2eaf8b133 417 }
caoyuan9642 0:6cb2eaf8b133 418 }
caoyuan9642 0:6cb2eaf8b133 419
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 420 switch (config->type) {
caoyuan9642 0:6cb2eaf8b133 421 case DATATYPE_INT:
caoyuan9642 0:6cb2eaf8b133 422 config->value.idata = strtol(value, NULL, 10);
caoyuan9642 0:6cb2eaf8b133 423 if (!config->extra
caoyuan9642 0:6cb2eaf8b133 424 && (config->value.idata > config->max.idata
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 425 || config->value.idata < config->min.idata)) {
caoyuan9642 0:6cb2eaf8b133 426 error("'%s' value out of range: must be > %d and < %d",
caoyuan9642 0:6cb2eaf8b133 427 config->config, config->max.idata, config->min.idata);
caoyuan9642 0:6cb2eaf8b133 428 }
caoyuan9642 0:6cb2eaf8b133 429 break;
caoyuan9642 0:6cb2eaf8b133 430 case DATATYPE_DOUBLE:
caoyuan9642 0:6cb2eaf8b133 431 config->value.ddata = strtod(value, NULL);
caoyuan9642 0:6cb2eaf8b133 432 if (!config->extra
caoyuan9642 0:6cb2eaf8b133 433 && (config->value.ddata > config->max.ddata
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 434 || config->value.ddata < config->min.ddata)) {
caoyuan9642 0:6cb2eaf8b133 435 error("'%s' value out of range: must be > %f and < %f",
caoyuan9642 0:6cb2eaf8b133 436 config->config, config->max.ddata, config->min.ddata);
caoyuan9642 0:6cb2eaf8b133 437 }
caoyuan9642 0:6cb2eaf8b133 438 break;
caoyuan9642 0:6cb2eaf8b133 439 case DATATYPE_BOOL:
caoyuan9642 0:6cb2eaf8b133 440 config->value.bdata = (strcmp(value, "true") == 0);
caoyuan9642 0:6cb2eaf8b133 441 break;
caoyuan9642 0:6cb2eaf8b133 442 case DATATYPE_STRING:
caoyuan9642 0:6cb2eaf8b133 443 strncpy(config->value.strdata, value, sizeof(config->value.strdata));
caoyuan9642 0:6cb2eaf8b133 444 break;
caoyuan9642 0:6cb2eaf8b133 445 }
caoyuan9642 0:6cb2eaf8b133 446 }
caoyuan9642 0:6cb2eaf8b133 447
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 448 ConfigItem* TelescopeConfiguration::getConfigItem(const char* name) {
caoyuan9642 0:6cb2eaf8b133 449 ConfigNode *p;
caoyuan9642 0:6cb2eaf8b133 450 for (p = head; p && (strcmp(p->config->config, name) != 0); p = p->next)
caoyuan9642 0:6cb2eaf8b133 451 ;
caoyuan9642 0:6cb2eaf8b133 452 if (!p)
caoyuan9642 0:6cb2eaf8b133 453 return NULL;
caoyuan9642 0:6cb2eaf8b133 454 else
caoyuan9642 0:6cb2eaf8b133 455 return p->config;
caoyuan9642 0:6cb2eaf8b133 456 }
caoyuan9642 0:6cb2eaf8b133 457
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 458 TelescopeConfiguration::~TelescopeConfiguration() {
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 459 for (ConfigNode *q = head; q;) {
caoyuan9642 0:6cb2eaf8b133 460 ConfigNode *p = q->next;
caoyuan9642 0:6cb2eaf8b133 461 delete q->config;
caoyuan9642 0:6cb2eaf8b133 462 delete q;
caoyuan9642 0:6cb2eaf8b133 463 q = p;
caoyuan9642 0:6cb2eaf8b133 464 }
caoyuan9642 0:6cb2eaf8b133 465 }
caoyuan9642 0:6cb2eaf8b133 466
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 467 void TelescopeConfiguration::readFromFile(FILE* fp) {
caoyuan9642 0:6cb2eaf8b133 468 char line[256];
caoyuan9642 0:6cb2eaf8b133 469
caoyuan9642 0:6cb2eaf8b133 470 int lineno = 0;
caoyuan9642 0:6cb2eaf8b133 471
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 472 while (true) {
caoyuan9642 0:6cb2eaf8b133 473 if (fgets(line, sizeof(line), fp) == NULL)
caoyuan9642 0:6cb2eaf8b133 474 break;
caoyuan9642 0:6cb2eaf8b133 475 char *p = line;
caoyuan9642 0:6cb2eaf8b133 476 lineno++;
caoyuan9642 0:6cb2eaf8b133 477 // Skip any white characters in the front
caoyuan9642 0:6cb2eaf8b133 478 while (*p && isspace(*p))
caoyuan9642 0:6cb2eaf8b133 479 p++;
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 480 if (*p == '\0') {
caoyuan9642 0:6cb2eaf8b133 481 /*Empty line*/
caoyuan9642 0:6cb2eaf8b133 482 continue;
caoyuan9642 0:6cb2eaf8b133 483 }
caoyuan9642 0:6cb2eaf8b133 484 // Skip commented lines
caoyuan9642 0:6cb2eaf8b133 485 if (*p == '#')
caoyuan9642 0:6cb2eaf8b133 486 continue;
caoyuan9642 0:6cb2eaf8b133 487 // Find the '=' sign
caoyuan9642 0:6cb2eaf8b133 488 char *q = strchr(p, '=');
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 489 if (q == NULL) {
caoyuan9642 0:6cb2eaf8b133 490 /*Syntax error*/
caoyuan9642 0:6cb2eaf8b133 491 debug("Syntax error in line %d\n", lineno);
caoyuan9642 0:6cb2eaf8b133 492 continue;
caoyuan9642 0:6cb2eaf8b133 493 }
caoyuan9642 0:6cb2eaf8b133 494
caoyuan9642 0:6cb2eaf8b133 495 /*strip the parameter name*/
caoyuan9642 0:6cb2eaf8b133 496 char *r = q - 1;
caoyuan9642 0:6cb2eaf8b133 497 while (r >= p && isspace(*r))
caoyuan9642 0:6cb2eaf8b133 498 r--;
caoyuan9642 0:6cb2eaf8b133 499
caoyuan9642 0:6cb2eaf8b133 500 q = q + 1;
caoyuan9642 0:6cb2eaf8b133 501 while (*q && isspace(*q))
caoyuan9642 0:6cb2eaf8b133 502 q++;
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 503 if (*q == '\0') {
caoyuan9642 0:6cb2eaf8b133 504 /*Empty value, just keep the default*/
caoyuan9642 0:6cb2eaf8b133 505 continue;
caoyuan9642 0:6cb2eaf8b133 506 }
caoyuan9642 0:6cb2eaf8b133 507
caoyuan9642 0:6cb2eaf8b133 508 char *s = line + strlen(line) - 1; // Last character of the string
caoyuan9642 0:6cb2eaf8b133 509 while (s >= q && isspace(*s))
caoyuan9642 0:6cb2eaf8b133 510 s--;
caoyuan9642 0:6cb2eaf8b133 511
caoyuan9642 0:6cb2eaf8b133 512 char parameter[64], value[64];
caoyuan9642 0:6cb2eaf8b133 513 strncpy(parameter, p, r - p + 1);
caoyuan9642 0:6cb2eaf8b133 514 parameter[r - p + 1] = '\0';
caoyuan9642 0:6cb2eaf8b133 515 strncpy(value, q, s - q + 1);
caoyuan9642 0:6cb2eaf8b133 516 value[s - q + 1] = '\0';
caoyuan9642 0:6cb2eaf8b133 517
caoyuan9642 0:6cb2eaf8b133 518 instance.setConfig(parameter, value);
caoyuan9642 0:6cb2eaf8b133 519 }
caoyuan9642 0:6cb2eaf8b133 520 }
caoyuan9642 0:6cb2eaf8b133 521
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 522 void TelescopeConfiguration::writeToFile(FILE* fp) {
caoyuan9642 0:6cb2eaf8b133 523 char buf[256];
caoyu@caoyuan9642-desktop.MIT.EDU 8:21a33760bf10 524 for (ConfigNode *p = instance.head; p; p = p->next) {
caoyuan9642 0:6cb2eaf8b133 525 getStringFromConfig(p->config, buf, sizeof(buf));
caoyuan9642 0:6cb2eaf8b133 526 fprintf(fp, "%s = %s\n", p->config->config, buf);
caoyuan9642 0:6cb2eaf8b133 527 }
caoyuan9642 0:6cb2eaf8b133 528 }
caoyuan9642 0:6cb2eaf8b133 529