Core Base Classes for the Light Endpoints
Dependents: mbed_mqtt_endpoint_ublox_ethernet mbed_mqtt_endpoint_ublox_cellular mbed_nsp_endpoint_ublox_cellular mbed_nsp_endpoint_ublox_ethernet ... more
Preferences.cpp@118:c8a80adfe90d, 2014-03-19 (annotated)
- Committer:
- ansond
- Date:
- Wed Mar 19 21:36:48 2014 +0000
- Revision:
- 118:c8a80adfe90d
- Parent:
- 117:34f0d83dcabb
- Child:
- 120:edf33bd41e4f
updates - removed ConfigFile
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ansond | 112:1fb53d4729af | 1 | /* Copyright C2013 Doug Anson, MIT License |
ansond | 112:1fb53d4729af | 2 | * |
ansond | 112:1fb53d4729af | 3 | * Permission is hereby granted, free of charge, to any person obtaining a copy of this software |
ansond | 112:1fb53d4729af | 4 | * and associated documentation files the "Software", to deal in the Software without restriction, |
ansond | 112:1fb53d4729af | 5 | * including without limitation the rights to use, copy, modify, merge, publish, distribute, |
ansond | 112:1fb53d4729af | 6 | * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is |
ansond | 112:1fb53d4729af | 7 | * furnished to do so, subject to the following conditions: |
ansond | 112:1fb53d4729af | 8 | * |
ansond | 112:1fb53d4729af | 9 | * The above copyright notice and this permission notice shall be included in all copies or |
ansond | 112:1fb53d4729af | 10 | * substantial portions of the Software. |
ansond | 112:1fb53d4729af | 11 | * |
ansond | 112:1fb53d4729af | 12 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING |
ansond | 112:1fb53d4729af | 13 | * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
ansond | 112:1fb53d4729af | 14 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
ansond | 112:1fb53d4729af | 15 | * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
ansond | 112:1fb53d4729af | 16 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
ansond | 112:1fb53d4729af | 17 | */ |
ansond | 112:1fb53d4729af | 18 | |
ansond | 112:1fb53d4729af | 19 | #include "mbed.h" |
ansond | 112:1fb53d4729af | 20 | #include "Preferences.h" |
ansond | 112:1fb53d4729af | 21 | |
ansond | 116:428281cb5066 | 22 | LocalFileSystem local("local"); |
ansond | 116:428281cb5066 | 23 | |
ansond | 112:1fb53d4729af | 24 | // default constructor |
ansond | 112:1fb53d4729af | 25 | Preferences::Preferences(ErrorHandler *error_handler) { |
ansond | 112:1fb53d4729af | 26 | this->m_error_handler = error_handler; |
ansond | 112:1fb53d4729af | 27 | this->initialize(); |
ansond | 112:1fb53d4729af | 28 | } |
ansond | 112:1fb53d4729af | 29 | |
ansond | 112:1fb53d4729af | 30 | // destructor |
ansond | 112:1fb53d4729af | 31 | Preferences::~Preferences() { |
ansond | 112:1fb53d4729af | 32 | } |
ansond | 112:1fb53d4729af | 33 | |
ansond | 112:1fb53d4729af | 34 | // initialize the preferences from the preferences file |
ansond | 112:1fb53d4729af | 35 | bool Preferences::initialize() { |
ansond | 118:c8a80adfe90d | 36 | char buffer[PREFERENCE_NAME_LEN + PREFERENCE_NAME_LEN + 10]; |
ansond | 112:1fb53d4729af | 37 | bool success = true; |
ansond | 112:1fb53d4729af | 38 | |
ansond | 118:c8a80adfe90d | 39 | // initialize the memory buffers and count |
ansond | 118:c8a80adfe90d | 40 | for(int i=0;i<MAX_NUM_PREFERENCES;++i) { |
ansond | 118:c8a80adfe90d | 41 | memset(this->m_names[i],0,PREFERENCE_NAME_LEN+1); |
ansond | 118:c8a80adfe90d | 42 | memset(this->m_values[i],0,PREFERENCE_VALUE_LEN+1); |
ansond | 118:c8a80adfe90d | 43 | } |
ansond | 118:c8a80adfe90d | 44 | this->m_num_preferences = 0; |
ansond | 118:c8a80adfe90d | 45 | |
ansond | 118:c8a80adfe90d | 46 | // read and open the config file |
ansond | 118:c8a80adfe90d | 47 | FILE *fp = fopen(PREFERENCES_FILE,"r"); |
ansond | 118:c8a80adfe90d | 48 | if (fp != NULL) { |
ansond | 118:c8a80adfe90d | 49 | // read in the first line |
ansond | 118:c8a80adfe90d | 50 | memset(buffer,0,PREFERENCE_NAME_LEN + PREFERENCE_NAME_LEN + 10); |
ansond | 118:c8a80adfe90d | 51 | int n = fscanf(fp,"%s",buffer); |
ansond | 118:c8a80adfe90d | 52 | |
ansond | 118:c8a80adfe90d | 53 | // loop and read each line |
ansond | 118:c8a80adfe90d | 54 | while(n != EOF) { |
ansond | 118:c8a80adfe90d | 55 | // replace the equals sign with a space |
ansond | 118:c8a80adfe90d | 56 | for(int i=0;i<strlen(buffer);++i) if (buffer[i] == '=') buffer[i] = ' '; |
ansond | 118:c8a80adfe90d | 57 | |
ansond | 118:c8a80adfe90d | 58 | // parse |
ansond | 118:c8a80adfe90d | 59 | sscanf(buffer,"%s%s",this->m_names[this->m_num_preferences],this->m_values[this->m_num_preferences]); |
ansond | 118:c8a80adfe90d | 60 | |
ansond | 118:c8a80adfe90d | 61 | // DEBUG |
ansond | 118:c8a80adfe90d | 62 | this->logger()->log("Installed Preference: %s=%s",this->m_names[this->m_num_preferences],this->m_values[this->m_num_preferences]); |
ansond | 118:c8a80adfe90d | 63 | |
ansond | 118:c8a80adfe90d | 64 | // increment the tally |
ansond | 118:c8a80adfe90d | 65 | ++this->m_num_preferences; |
ansond | 118:c8a80adfe90d | 66 | |
ansond | 118:c8a80adfe90d | 67 | // reset the buffer and read in another line |
ansond | 118:c8a80adfe90d | 68 | memset(buffer,0,PREFERENCE_NAME_LEN + PREFERENCE_NAME_LEN + 10); |
ansond | 118:c8a80adfe90d | 69 | n = fscanf(fp,"%s",buffer); |
ansond | 112:1fb53d4729af | 70 | } |
ansond | 118:c8a80adfe90d | 71 | |
ansond | 118:c8a80adfe90d | 72 | // close |
ansond | 118:c8a80adfe90d | 73 | fclose(fp); |
ansond | 118:c8a80adfe90d | 74 | |
ansond | 118:c8a80adfe90d | 75 | // summary |
ansond | 118:c8a80adfe90d | 76 | this->logger()->log("Installed %d preferences",this->m_num_preferences); |
ansond | 112:1fb53d4729af | 77 | } |
ansond | 112:1fb53d4729af | 78 | else { |
ansond | 118:c8a80adfe90d | 79 | // unable to open the preferences file - not loaded |
ansond | 118:c8a80adfe90d | 80 | this->logger()->log("Unable to open preferences file %s... Preferences not loaded.",PREFERENCES_FILE); |
ansond | 112:1fb53d4729af | 81 | success = false; |
ansond | 112:1fb53d4729af | 82 | } |
ansond | 112:1fb53d4729af | 83 | |
ansond | 112:1fb53d4729af | 84 | // return our status |
ansond | 112:1fb53d4729af | 85 | return success; |
ansond | 112:1fb53d4729af | 86 | } |
ansond | 112:1fb53d4729af | 87 | |
ansond | 112:1fb53d4729af | 88 | // integer preference with defaults |
ansond | 112:1fb53d4729af | 89 | int Preferences::getIntPreference(char *name,int def_value) {\ |
ansond | 112:1fb53d4729af | 90 | int int_value = def_value; |
ansond | 112:1fb53d4729af | 91 | char buffer[PREFERENCE_VALUE_LEN+1]; |
ansond | 112:1fb53d4729af | 92 | memset(buffer,0,PREFERENCE_VALUE_LEN+1); |
ansond | 112:1fb53d4729af | 93 | char *value = this->getPreference(name,buffer,PREFERENCE_VALUE_LEN,NULL); |
ansond | 116:428281cb5066 | 94 | if (value != NULL && strlen(value) > 0) sscanf(buffer,"%d",&int_value); |
ansond | 112:1fb53d4729af | 95 | return int_value; |
ansond | 112:1fb53d4729af | 96 | } |
ansond | 112:1fb53d4729af | 97 | |
ansond | 112:1fb53d4729af | 98 | // boolean preference with defaults |
ansond | 112:1fb53d4729af | 99 | bool Preferences::getBooleanPreference(char *name,bool def_value) { |
ansond | 112:1fb53d4729af | 100 | bool bool_value = def_value; |
ansond | 112:1fb53d4729af | 101 | char buffer[PREFERENCE_VALUE_LEN+1]; |
ansond | 112:1fb53d4729af | 102 | memset(buffer,0,PREFERENCE_VALUE_LEN+1); |
ansond | 112:1fb53d4729af | 103 | char *value = this->getPreference(name,buffer,PREFERENCE_VALUE_LEN,NULL); |
ansond | 112:1fb53d4729af | 104 | if (value != NULL && strcmp(value,"true") == 0) bool_value = true; |
ansond | 112:1fb53d4729af | 105 | if (value != NULL && strcmp(value,"false") == 0) bool_value = false; |
ansond | 112:1fb53d4729af | 106 | return bool_value; |
ansond | 112:1fb53d4729af | 107 | } |
ansond | 112:1fb53d4729af | 108 | |
ansond | 112:1fb53d4729af | 109 | // string preference with defaults |
ansond | 112:1fb53d4729af | 110 | char *Preferences::getPreference(char *name,char *buffer,int buffer_length,char *def_value) { |
ansond | 118:c8a80adfe90d | 111 | char *value = NULL; |
ansond | 118:c8a80adfe90d | 112 | |
ansond | 118:c8a80adfe90d | 113 | // clean the buffer |
ansond | 118:c8a80adfe90d | 114 | memset(buffer,0,buffer_length); |
ansond | 118:c8a80adfe90d | 115 | |
ansond | 118:c8a80adfe90d | 116 | // get our index |
ansond | 118:c8a80adfe90d | 117 | int index = this->indexOfPreference(name); |
ansond | 118:c8a80adfe90d | 118 | if (index >= 0) { |
ansond | 118:c8a80adfe90d | 119 | // fill with our value |
ansond | 118:c8a80adfe90d | 120 | strncpy(buffer,this->m_values[index],this->min(buffer_length,strlen(this->m_values[index]))); |
ansond | 118:c8a80adfe90d | 121 | value = buffer; |
ansond | 118:c8a80adfe90d | 122 | } |
ansond | 118:c8a80adfe90d | 123 | else { |
ansond | 118:c8a80adfe90d | 124 | // fill with the default |
ansond | 118:c8a80adfe90d | 125 | if (def_value != NULL) strncpy(buffer,def_value,this->min(buffer_length,strlen(def_value))); |
ansond | 118:c8a80adfe90d | 126 | if (def_value != NULL) value = buffer; |
ansond | 114:bd38ad417d6a | 127 | } |
ansond | 118:c8a80adfe90d | 128 | |
ansond | 118:c8a80adfe90d | 129 | // return the value |
ansond | 118:c8a80adfe90d | 130 | return value; |
ansond | 118:c8a80adfe90d | 131 | } |
ansond | 118:c8a80adfe90d | 132 | |
ansond | 118:c8a80adfe90d | 133 | // get the index of the named preference |
ansond | 118:c8a80adfe90d | 134 | int Preferences::indexOfPreference(char *name) { |
ansond | 118:c8a80adfe90d | 135 | bool found = false; |
ansond | 118:c8a80adfe90d | 136 | int index = -1; |
ansond | 118:c8a80adfe90d | 137 | |
ansond | 118:c8a80adfe90d | 138 | // parameter check |
ansond | 118:c8a80adfe90d | 139 | if (name != NULL && strlen(name) > 0) { |
ansond | 118:c8a80adfe90d | 140 | |
ansond | 118:c8a80adfe90d | 141 | // loop until we find the name.. then stop and record its index |
ansond | 118:c8a80adfe90d | 142 | for(int i=0;i<this->m_num_preferences && !found;++i) { |
ansond | 118:c8a80adfe90d | 143 | if (strcmp(name,this->m_names[i]) == 0) { |
ansond | 118:c8a80adfe90d | 144 | found = true; |
ansond | 118:c8a80adfe90d | 145 | index = i; |
ansond | 118:c8a80adfe90d | 146 | } |
ansond | 118:c8a80adfe90d | 147 | } |
ansond | 118:c8a80adfe90d | 148 | } |
ansond | 118:c8a80adfe90d | 149 | |
ansond | 118:c8a80adfe90d | 150 | // return the index value |
ansond | 118:c8a80adfe90d | 151 | return index; |
ansond | 112:1fb53d4729af | 152 | } |
ansond | 112:1fb53d4729af | 153 | |
ansond | 112:1fb53d4729af | 154 | // get our error handler |
ansond | 112:1fb53d4729af | 155 | ErrorHandler *Preferences::logger() { return this->m_error_handler; } |
ansond | 112:1fb53d4729af | 156 | |
ansond | 112:1fb53d4729af | 157 | // get our preference count |
ansond | 118:c8a80adfe90d | 158 | int Preferences::numPreferences() { return this->m_num_preferences; } |
ansond | 112:1fb53d4729af | 159 | |
ansond | 112:1fb53d4729af | 160 | // min function |
ansond | 112:1fb53d4729af | 161 | int Preferences::min(int value1,int value2) { |
ansond | 112:1fb53d4729af | 162 | if (value1 < value2) return value1; |
ansond | 112:1fb53d4729af | 163 | return value2; |
ansond | 112:1fb53d4729af | 164 | } |