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

Committer:
alpov
Date:
Wed May 28 13:58:06 2014 +0000
Revision:
5:5c8e97742751
SD card access, logging, configuration files

Who changed what in which revision?

UserRevisionLine numberNew 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