Telescope Control Library

Dependents:   PushToGo-F429

Committer:
caoyuan9642
Date:
Sun Aug 19 05:21:20 2018 +0000
Revision:
0:6cb2eaf8b133
Child:
8:21a33760bf10
v0.1

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