EMIR - Ekvitermní mikroprocesorová regulace https://code.google.com/p/emir/ https://code.google.com/p/emir/wiki/DesignV3

Dependencies:   ConfigFile DS1307 OneWire SDFileSystem USBDeviceLite mbed-rtos mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers sd.cpp Source File

sd.cpp

00001 #include "mbed.h"
00002 #include "mbed_debug.h"
00003 #include "rtos.h"
00004 #include "rtc.h"
00005 #include "sd.h"
00006 #include "SDFileSystem.h"
00007 #include "ConfigFile.h"
00008 
00009 Mutex sd_mutex;
00010 SDFileSystem sd(MBED_SPI0, "sd");
00011 ConfigFile config;
00012 ConfigFile sensor_cfg;
00013 
00014 bool read_config()
00015 {
00016     bool b = true;
00017     sd_mutex.lock();
00018     if (b && !config.read("/sd/emir2.cfg")) b = false;
00019     if (b && !sensor_cfg.read("/sd/sensors.cfg")) b = false;
00020     sd_mutex.unlock();
00021     return b;
00022 }
00023 
00024 
00025 bool write_config()
00026 {
00027     bool b = true;
00028     sd_mutex.lock();
00029     if (b && !config.write("/sd/emir2.cfg", "# EMIR2 main configuration", ConfigFile::DOS)) b = false;
00030     if (b && !sensor_cfg.write("/sd/sensors.cfg", "# EMIR2 sensor configuration", ConfigFile::DOS)) b = false;
00031     sd_mutex.unlock();
00032     return b;
00033 }
00034 
00035 
00036 int get_config(char *key, int def)
00037 {
00038     char buffer[32];
00039     
00040     if (!config.getValue(key, buffer, sizeof(buffer))) return def;
00041     return atoi(buffer);
00042 }
00043 
00044 
00045 bool set_config(char *key, int value)
00046 {
00047     char buffer[32];
00048     
00049     sprintf(buffer, "%d", value);
00050     if (!config.setValue(key, buffer)) return false;
00051     return true;    
00052 }
00053 
00054 
00055 int get_sensor_cfg(uint8_t *romid, char *desc)
00056 {
00057     char romid_str[20];
00058     char buffer[32];
00059     char *pch;
00060     int index;
00061     
00062     for (int i = 0; i < 8; i++) sprintf(&romid_str[i*2], "%.2X", romid[i]);
00063     if (!sensor_cfg.getValue(romid_str, buffer, sizeof(buffer))) {
00064         sensor_cfg.setValue(romid_str, "0;Unknown");
00065         return 0;
00066     }
00067     
00068     pch = strchr(buffer, ';');
00069     if (pch == NULL) return 0;
00070     
00071     *pch = 0;
00072     index = atoi(buffer);
00073     
00074     pch++;
00075     if (desc != NULL) strcpy(desc, pch);
00076     
00077     return index;
00078 }
00079 
00080 
00081 bool log_temperature(int sensor_id, int value)
00082 {
00083     char buffer[32];
00084     sprintf(buffer, "%d", value);
00085     return log_event(101, sensor_id, buffer);
00086 }
00087 
00088 
00089 bool log_io(int io_id, int value)
00090 {
00091     char buffer[32];
00092     sprintf(buffer, "%d", value);
00093     return log_event(102, io_id, buffer);
00094 }
00095 
00096 
00097 bool log_event(int event_id, int sub_id, char *value)
00098 {
00099     sd_mutex.lock();
00100     FILE *fp = fopen("/sd/emir2.log", "a");
00101     if (fp == NULL) {
00102         debug("Could not open file for write\n");
00103         sd_mutex.unlock();
00104         return false;
00105     }
00106 
00107     time_t m_time = get_rtc();
00108     struct tm *now;
00109     now = localtime(&m_time);
00110 
00111     fprintf(fp, "%d.%d.%04d %02d:%02d:%02d;%lu;", 
00112         now->tm_mday, now->tm_mon+1, now->tm_year+1900,
00113         now->tm_hour, now->tm_min, now->tm_sec, 
00114         m_time
00115     );
00116     fprintf(fp, "%d;%d;%s\r\n", event_id, sub_id, value);
00117     
00118     fclose(fp);
00119     sd_mutex.unlock();
00120     return true;
00121 }
00122 
00123 
00124 void sd_init()
00125 {
00126     debug("Reading configs... ");
00127     bool b = read_config();
00128     if (b) debug("OK\n"); else debug("failed\n");
00129 
00130     debug("Writing log... ");
00131     log_event(100, 0, "EMIRv2 compiled " __DATE__ " " __TIME__ ", starting");
00132     debug("done\n");
00133 }
00134