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
src/sd.cpp@6:c24057b64a66, 2014-07-30 (annotated)
- Committer:
- alpov
- Date:
- Wed Jul 30 19:03:20 2014 +0000
- Revision:
- 6:c24057b64a66
- Parent:
- 5:5c8e97742751
library updates
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
alpov | 5:5c8e97742751 | 1 | #include "mbed.h" |
alpov | 5:5c8e97742751 | 2 | #include "mbed_debug.h" |
alpov | 5:5c8e97742751 | 3 | #include "rtos.h" |
alpov | 5:5c8e97742751 | 4 | #include "rtc.h" |
alpov | 5:5c8e97742751 | 5 | #include "sd.h" |
alpov | 5:5c8e97742751 | 6 | #include "SDFileSystem.h" |
alpov | 5:5c8e97742751 | 7 | #include "ConfigFile.h" |
alpov | 5:5c8e97742751 | 8 | |
alpov | 5:5c8e97742751 | 9 | Mutex sd_mutex; |
alpov | 5:5c8e97742751 | 10 | SDFileSystem sd(MBED_SPI0, "sd"); |
alpov | 5:5c8e97742751 | 11 | ConfigFile config; |
alpov | 5:5c8e97742751 | 12 | ConfigFile sensor_cfg; |
alpov | 5:5c8e97742751 | 13 | |
alpov | 5:5c8e97742751 | 14 | bool read_config() |
alpov | 5:5c8e97742751 | 15 | { |
alpov | 5:5c8e97742751 | 16 | bool b = true; |
alpov | 5:5c8e97742751 | 17 | sd_mutex.lock(); |
alpov | 5:5c8e97742751 | 18 | if (b && !config.read("/sd/emir2.cfg")) b = false; |
alpov | 5:5c8e97742751 | 19 | if (b && !sensor_cfg.read("/sd/sensors.cfg")) b = false; |
alpov | 5:5c8e97742751 | 20 | sd_mutex.unlock(); |
alpov | 5:5c8e97742751 | 21 | return b; |
alpov | 5:5c8e97742751 | 22 | } |
alpov | 5:5c8e97742751 | 23 | |
alpov | 5:5c8e97742751 | 24 | |
alpov | 5:5c8e97742751 | 25 | bool write_config() |
alpov | 5:5c8e97742751 | 26 | { |
alpov | 5:5c8e97742751 | 27 | bool b = true; |
alpov | 5:5c8e97742751 | 28 | sd_mutex.lock(); |
alpov | 5:5c8e97742751 | 29 | if (b && !config.write("/sd/emir2.cfg", "# EMIR2 main configuration", ConfigFile::DOS)) b = false; |
alpov | 5:5c8e97742751 | 30 | if (b && !sensor_cfg.write("/sd/sensors.cfg", "# EMIR2 sensor configuration", ConfigFile::DOS)) b = false; |
alpov | 5:5c8e97742751 | 31 | sd_mutex.unlock(); |
alpov | 5:5c8e97742751 | 32 | return b; |
alpov | 5:5c8e97742751 | 33 | } |
alpov | 5:5c8e97742751 | 34 | |
alpov | 5:5c8e97742751 | 35 | |
alpov | 5:5c8e97742751 | 36 | int get_config(char *key, int def) |
alpov | 5:5c8e97742751 | 37 | { |
alpov | 5:5c8e97742751 | 38 | char buffer[32]; |
alpov | 5:5c8e97742751 | 39 | |
alpov | 5:5c8e97742751 | 40 | if (!config.getValue(key, buffer, sizeof(buffer))) return def; |
alpov | 5:5c8e97742751 | 41 | return atoi(buffer); |
alpov | 5:5c8e97742751 | 42 | } |
alpov | 5:5c8e97742751 | 43 | |
alpov | 5:5c8e97742751 | 44 | |
alpov | 5:5c8e97742751 | 45 | bool set_config(char *key, int value) |
alpov | 5:5c8e97742751 | 46 | { |
alpov | 5:5c8e97742751 | 47 | char buffer[32]; |
alpov | 5:5c8e97742751 | 48 | |
alpov | 5:5c8e97742751 | 49 | sprintf(buffer, "%d", value); |
alpov | 5:5c8e97742751 | 50 | if (!config.setValue(key, buffer)) return false; |
alpov | 5:5c8e97742751 | 51 | return true; |
alpov | 5:5c8e97742751 | 52 | } |
alpov | 5:5c8e97742751 | 53 | |
alpov | 5:5c8e97742751 | 54 | |
alpov | 5:5c8e97742751 | 55 | int get_sensor_cfg(uint8_t *romid, char *desc) |
alpov | 5:5c8e97742751 | 56 | { |
alpov | 5:5c8e97742751 | 57 | char romid_str[20]; |
alpov | 5:5c8e97742751 | 58 | char buffer[32]; |
alpov | 5:5c8e97742751 | 59 | char *pch; |
alpov | 5:5c8e97742751 | 60 | int index; |
alpov | 5:5c8e97742751 | 61 | |
alpov | 5:5c8e97742751 | 62 | for (int i = 0; i < 8; i++) sprintf(&romid_str[i*2], "%.2X", romid[i]); |
alpov | 5:5c8e97742751 | 63 | if (!sensor_cfg.getValue(romid_str, buffer, sizeof(buffer))) { |
alpov | 5:5c8e97742751 | 64 | sensor_cfg.setValue(romid_str, "0;Unknown"); |
alpov | 5:5c8e97742751 | 65 | return 0; |
alpov | 5:5c8e97742751 | 66 | } |
alpov | 5:5c8e97742751 | 67 | |
alpov | 5:5c8e97742751 | 68 | pch = strchr(buffer, ';'); |
alpov | 5:5c8e97742751 | 69 | if (pch == NULL) return 0; |
alpov | 5:5c8e97742751 | 70 | |
alpov | 5:5c8e97742751 | 71 | *pch = 0; |
alpov | 5:5c8e97742751 | 72 | index = atoi(buffer); |
alpov | 5:5c8e97742751 | 73 | |
alpov | 5:5c8e97742751 | 74 | pch++; |
alpov | 5:5c8e97742751 | 75 | if (desc != NULL) strcpy(desc, pch); |
alpov | 5:5c8e97742751 | 76 | |
alpov | 5:5c8e97742751 | 77 | return index; |
alpov | 5:5c8e97742751 | 78 | } |
alpov | 5:5c8e97742751 | 79 | |
alpov | 5:5c8e97742751 | 80 | |
alpov | 5:5c8e97742751 | 81 | bool log_temperature(int sensor_id, int value) |
alpov | 5:5c8e97742751 | 82 | { |
alpov | 5:5c8e97742751 | 83 | char buffer[32]; |
alpov | 5:5c8e97742751 | 84 | sprintf(buffer, "%d", value); |
alpov | 5:5c8e97742751 | 85 | return log_event(101, sensor_id, buffer); |
alpov | 5:5c8e97742751 | 86 | } |
alpov | 5:5c8e97742751 | 87 | |
alpov | 5:5c8e97742751 | 88 | |
alpov | 5:5c8e97742751 | 89 | bool log_io(int io_id, int value) |
alpov | 5:5c8e97742751 | 90 | { |
alpov | 5:5c8e97742751 | 91 | char buffer[32]; |
alpov | 5:5c8e97742751 | 92 | sprintf(buffer, "%d", value); |
alpov | 5:5c8e97742751 | 93 | return log_event(102, io_id, buffer); |
alpov | 5:5c8e97742751 | 94 | } |
alpov | 5:5c8e97742751 | 95 | |
alpov | 5:5c8e97742751 | 96 | |
alpov | 5:5c8e97742751 | 97 | bool log_event(int event_id, int sub_id, char *value) |
alpov | 5:5c8e97742751 | 98 | { |
alpov | 5:5c8e97742751 | 99 | sd_mutex.lock(); |
alpov | 5:5c8e97742751 | 100 | FILE *fp = fopen("/sd/emir2.log", "a"); |
alpov | 5:5c8e97742751 | 101 | if (fp == NULL) { |
alpov | 5:5c8e97742751 | 102 | debug("Could not open file for write\n"); |
alpov | 5:5c8e97742751 | 103 | sd_mutex.unlock(); |
alpov | 5:5c8e97742751 | 104 | return false; |
alpov | 5:5c8e97742751 | 105 | } |
alpov | 5:5c8e97742751 | 106 | |
alpov | 5:5c8e97742751 | 107 | time_t m_time = get_rtc(); |
alpov | 5:5c8e97742751 | 108 | struct tm *now; |
alpov | 5:5c8e97742751 | 109 | now = localtime(&m_time); |
alpov | 5:5c8e97742751 | 110 | |
alpov | 5:5c8e97742751 | 111 | fprintf(fp, "%d.%d.%04d %02d:%02d:%02d;%lu;", |
alpov | 5:5c8e97742751 | 112 | now->tm_mday, now->tm_mon+1, now->tm_year+1900, |
alpov | 5:5c8e97742751 | 113 | now->tm_hour, now->tm_min, now->tm_sec, |
alpov | 5:5c8e97742751 | 114 | m_time |
alpov | 5:5c8e97742751 | 115 | ); |
alpov | 5:5c8e97742751 | 116 | fprintf(fp, "%d;%d;%s\r\n", event_id, sub_id, value); |
alpov | 5:5c8e97742751 | 117 | |
alpov | 5:5c8e97742751 | 118 | fclose(fp); |
alpov | 5:5c8e97742751 | 119 | sd_mutex.unlock(); |
alpov | 5:5c8e97742751 | 120 | return true; |
alpov | 5:5c8e97742751 | 121 | } |
alpov | 5:5c8e97742751 | 122 | |
alpov | 5:5c8e97742751 | 123 | |
alpov | 5:5c8e97742751 | 124 | void sd_init() |
alpov | 5:5c8e97742751 | 125 | { |
alpov | 5:5c8e97742751 | 126 | debug("Reading configs... "); |
alpov | 5:5c8e97742751 | 127 | bool b = read_config(); |
alpov | 5:5c8e97742751 | 128 | if (b) debug("OK\n"); else debug("failed\n"); |
alpov | 5:5c8e97742751 | 129 | |
alpov | 5:5c8e97742751 | 130 | debug("Writing log... "); |
alpov | 5:5c8e97742751 | 131 | log_event(100, 0, "EMIRv2 compiled " __DATE__ " " __TIME__ ", starting"); |
alpov | 5:5c8e97742751 | 132 | debug("done\n"); |
alpov | 5:5c8e97742751 | 133 | } |
alpov | 5:5c8e97742751 | 134 |