Backing up an unused program in case of future need

Dependencies:   mbed

Committer:
andrewboyson
Date:
Fri Apr 22 09:23:57 2016 +0000
Revision:
2:06fa34661f19
Child:
6:be97d38e0b01
Added configuration file.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
andrewboyson 2:06fa34661f19 1 #include "mbed.h"
andrewboyson 2:06fa34661f19 2 #include "log.h"
andrewboyson 2:06fa34661f19 3 #define MAX_NAME_OR_VALUE 100
andrewboyson 2:06fa34661f19 4 #define FILE_NAME "/local/cfg.txt"
andrewboyson 2:06fa34661f19 5
andrewboyson 2:06fa34661f19 6 char *CfgSsid;
andrewboyson 2:06fa34661f19 7 char *CfgPassword;
andrewboyson 2:06fa34661f19 8 char *CfgNtpIp;
andrewboyson 2:06fa34661f19 9 int CfgBaud;
andrewboyson 2:06fa34661f19 10
andrewboyson 2:06fa34661f19 11 static void saveString(char *value, char **dest) {
andrewboyson 2:06fa34661f19 12 *dest = (char*)realloc(*dest, strlen(value) + 1); //strlen does not include the null so add 1
andrewboyson 2:06fa34661f19 13 if (*dest == NULL)
andrewboyson 2:06fa34661f19 14 {
andrewboyson 2:06fa34661f19 15 LogCrLf("Error reallocating memory in saveString");
andrewboyson 2:06fa34661f19 16 return;
andrewboyson 2:06fa34661f19 17 }
andrewboyson 2:06fa34661f19 18 *dest = strcpy(*dest, value);
andrewboyson 2:06fa34661f19 19 }
andrewboyson 2:06fa34661f19 20 static void saveInt (char *value, int *dest) {
andrewboyson 2:06fa34661f19 21 *dest = atoi(value);
andrewboyson 2:06fa34661f19 22 }
andrewboyson 2:06fa34661f19 23 static void rtrim (int i, char *s) { //i is the length of the thing to trim
andrewboyson 2:06fa34661f19 24 while(1)
andrewboyson 2:06fa34661f19 25 {
andrewboyson 2:06fa34661f19 26 s[i] = '\0';
andrewboyson 2:06fa34661f19 27 if (--i < 0) break;
andrewboyson 2:06fa34661f19 28 if (s[i] != ' ' && s[i] != '\t') break;
andrewboyson 2:06fa34661f19 29 }
andrewboyson 2:06fa34661f19 30 }
andrewboyson 2:06fa34661f19 31
andrewboyson 2:06fa34661f19 32 static void handleLine(int n, int v, char *name, char *value) {
andrewboyson 2:06fa34661f19 33 rtrim(n, name);
andrewboyson 2:06fa34661f19 34 rtrim(v, value);
andrewboyson 2:06fa34661f19 35 if (strcmp(name, "ssid") == 0) saveString (value, &CfgSsid);
andrewboyson 2:06fa34661f19 36 if (strcmp(name, "password") == 0) saveString (value, &CfgPassword);
andrewboyson 2:06fa34661f19 37 if (strcmp(name, "ntp ip") == 0) saveString (value, &CfgNtpIp);
andrewboyson 2:06fa34661f19 38 if (strcmp(name, "baud") == 0) saveInt (value, &CfgBaud);
andrewboyson 2:06fa34661f19 39 }
andrewboyson 2:06fa34661f19 40 static void resetValues(void) {
andrewboyson 2:06fa34661f19 41
andrewboyson 2:06fa34661f19 42 free(CfgSsid); CfgSsid = NULL;
andrewboyson 2:06fa34661f19 43 free(CfgPassword); CfgPassword = NULL;
andrewboyson 2:06fa34661f19 44 free(CfgNtpIp); CfgNtpIp = NULL;
andrewboyson 2:06fa34661f19 45 CfgBaud = 0;
andrewboyson 2:06fa34661f19 46 }
andrewboyson 2:06fa34661f19 47 int CfgInit() {
andrewboyson 2:06fa34661f19 48
andrewboyson 2:06fa34661f19 49 FILE *fp = fopen(FILE_NAME, "r");
andrewboyson 2:06fa34661f19 50 if (fp == NULL)
andrewboyson 2:06fa34661f19 51 {
andrewboyson 2:06fa34661f19 52 LogF("Error opening file %s for reading", FILE_NAME);
andrewboyson 2:06fa34661f19 53 return -1;
andrewboyson 2:06fa34661f19 54 }
andrewboyson 2:06fa34661f19 55 resetValues();
andrewboyson 2:06fa34661f19 56 char name[MAX_NAME_OR_VALUE];
andrewboyson 2:06fa34661f19 57 char value[MAX_NAME_OR_VALUE];
andrewboyson 2:06fa34661f19 58 int isName = 1;
andrewboyson 2:06fa34661f19 59 int isValue = 0;
andrewboyson 2:06fa34661f19 60 int isStart = 0; //Used to trim starts
andrewboyson 2:06fa34661f19 61 int n = 0;
andrewboyson 2:06fa34661f19 62 int v = 0;
andrewboyson 2:06fa34661f19 63 while (1)
andrewboyson 2:06fa34661f19 64 {
andrewboyson 2:06fa34661f19 65 int c = fgetc(fp);
andrewboyson 2:06fa34661f19 66 if (c == '\r') continue; //Ignore windows <CR> characters
andrewboyson 2:06fa34661f19 67 if (c == EOF) { handleLine(n, v, name, value); break;}
andrewboyson 2:06fa34661f19 68 if (c == '\0') { handleLine(n, v, name, value); break;}
andrewboyson 2:06fa34661f19 69 if (c == '\n') { handleLine(n, v, name, value); isName = 1; isValue = 0; isStart = 0; n = 0; v = 0; continue;}
andrewboyson 2:06fa34661f19 70 if (c == '=' && isName) { isName = 0; isValue = 1; isStart = 0; continue;}
andrewboyson 2:06fa34661f19 71 if (c == '#') { isName = 0; isValue = 0; continue;}
andrewboyson 2:06fa34661f19 72 if (c != ' ' && c != '\t') isStart = -1;
andrewboyson 2:06fa34661f19 73 if (isName && isStart && n < MAX_NAME_OR_VALUE - 1) name[n++] = (char)c; //n can never exceed MAX_NAME_OR_VALUE - 1 leaving room for a null at length n
andrewboyson 2:06fa34661f19 74 if (isValue && isStart && v < MAX_NAME_OR_VALUE - 1) value[v++] = (char)c; //v can never exceed MAX_NAME_OR_VALUE - 1 leaving room for a null at length v
andrewboyson 2:06fa34661f19 75 }
andrewboyson 2:06fa34661f19 76
andrewboyson 2:06fa34661f19 77 fclose(fp);
andrewboyson 2:06fa34661f19 78
andrewboyson 2:06fa34661f19 79 return 0;
andrewboyson 2:06fa34661f19 80 }