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

Files at this revision

API Documentation at this revision

Comitter:
alpov
Date:
Tue May 06 19:21:27 2014 +0000
Parent:
2:0e0131d51df5
Child:
4:9065e9ccb078
Commit message:
working with RTOS, changed USBDevice library to lite version without malloc()

Changed in this revision

USBDevice.lib Show diff for this revision Revisions of this file
USBDeviceLite.lib Show annotated file Show diff for this revision Revisions of this file
inc/comm.h Show annotated file Show diff for this revision Revisions of this file
inc/rtc.h Show annotated file Show diff for this revision Revisions of this file
inc/sensor.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show diff for this revision Revisions of this file
mbed-rtos.lib Show annotated file Show diff for this revision Revisions of this file
src/comm.cpp Show annotated file Show diff for this revision Revisions of this file
src/disk.txt Show annotated file Show diff for this revision Revisions of this file
src/main.cpp Show annotated file Show diff for this revision Revisions of this file
src/rtc.cpp Show annotated file Show diff for this revision Revisions of this file
src/sensor.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/USBDevice.lib	Mon Apr 28 13:10:52 2014 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-http://mbed.org/users/alpov/code/USBDevice/#c7639faed2eb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDeviceLite.lib	Tue May 06 19:21:27 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/alpov/code/USBDeviceLite/#96a0946caef5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/inc/comm.h	Tue May 06 19:21:27 2014 +0000
@@ -0,0 +1,6 @@
+#ifndef _COMM_H
+#define _COMM_H
+
+extern void comm_thread(void const *args);
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/inc/rtc.h	Tue May 06 19:21:27 2014 +0000
@@ -0,0 +1,7 @@
+#ifndef _RTC_H
+#define _RTC_H
+
+extern time_t get_rtc();
+extern bool set_rtc(time_t time);
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/inc/sensor.h	Tue May 06 19:21:27 2014 +0000
@@ -0,0 +1,12 @@
+#ifndef _SENSOR_H
+#define _SENSOR_H
+
+extern uint8_t sensor_roms[8][16];
+extern int16_t sensor_temps[16];
+extern int sensor_count;
+
+extern Mutex sensor_mutex;
+
+extern void sensor_thread(void const *args);
+
+#endif
--- a/main.cpp	Mon Apr 28 13:10:52 2014 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,149 +0,0 @@
-#include "mbed.h"
-#include "SDFileSystem.h"
-#include "USBSerial.h"
-#include "DS1307.h"
-#include "1wire.h"
-
-Serial pc(MBED_UARTUSB);
-
-SDFileSystem sd(MBED_SPI0, "sd");
-
-USBSerial usb(0x1f00, 0x2012, 0x0001, false);
-
-DS1307 rtc(I2C_SDA, I2C_SCL);
-
-OneWire ow(A4, A2, A3);
-
-DigitalOut ledR(LED_RED, 1);
-DigitalOut ledG(LED_GREEN, 1);
-//DigitalOut ledB(LED_BLUE, 1);
-
-DigitalOut OUT1(D2, 0);
-DigitalOut OUT2(D3, 0);
-DigitalOut OUT3(D4, 0);
-DigitalOut OUT4(D5, 0);
-
-DigitalIn  IN1(D8, PullUp);
-DigitalIn  IN2(D9, PullUp);
-
-
-void blik_usb()
-{
-    if (usb.configured())
-        ledG = !ledG;
-    else 
-        ledG = 1;
-}
-
-
-int main(void)
-{
-    Timer t;
-    Ticker usbstat;
-    char c;
-
-    usbstat.attach(&blik_usb, 0.2);
-
-    pc.printf("Hello World!\n");
-
-    FILE *fp = fopen("/sd/sdtest2.txt", "w");
-    if (fp == NULL) {
-        pc.printf("Could not open file for write\n");
-    } else {
-        pc.printf("Writing... ");
-        fprintf(fp, "Hello fun SD Card World!\nOK!\n");
-        pc.printf("closing... ");
-        fclose(fp); 
-    }
-    pc.printf("done\n");
-
-    OUT1 = 1;
-    OUT2 = 1;
-    OUT3 = 1;
-    OUT4 = 1;
-    wait(1.0);
-    OUT1 = 0;
-    OUT2 = 0;
-    OUT3 = 0;
-    OUT4 = 0;
-
-    pc.printf("Entering loop\n");
-
-    while (1) 
-    {
-        if (!usb.readable()) continue;
-        c = usb.getc();
-        //pc.printf("USB command received\n");
-
-        if (c == 'r') {
-            //  perform read
-            t.reset();
-            t.start();
-            time_t m_time = rtc.now();
-            t.stop();
-
-            struct tm *now;
-            now = localtime(&m_time);
-            
-            usb.printf("Current time is %lu, %02d:%02d:%02d, %d.%d.%04d\n", 
-                m_time, 
-                now->tm_hour, now->tm_min, now->tm_sec, 
-                now->tm_mday, now->tm_mon+1, now->tm_year+1900
-            );
-            usb.printf("Internal datetime format is %s\n", asctime(now));
-            usb.printf("Read complete, elapsed %uus\n", t.read_us());
-            
-        }
-        else if (c == 'w') {
-            //  perform write
-            int date, month, year, hours, minutes, seconds;
-            usb.printf("Enter the date (date 1..31)\n"); usb.scanf("%d", &date);
-            usb.printf("Enter the date (month 1..12)\n"); usb.scanf("%d", &month);
-            usb.printf("Enter the date (year >2000)\n"); usb.scanf("%d", &year);
-            usb.printf("Enter the time (hours 0..23)\n"); usb.scanf("%d", &hours);
-            usb.printf("Enter the time (minutes 0..59)\n"); usb.scanf("%d", &minutes);
-            usb.printf("Enter the time (seconds 0..59)\n"); usb.scanf("%d", &seconds);
-            
-            struct tm now = {seconds, minutes, hours, date, month-1, year-1900};
-            time_t m_time = mktime(&now);
-                
-            t.reset();
-            t.start();
-            bool b = rtc.set_time(m_time);
-            t.stop();
-            
-            usb.printf("Write complete (UNIX %lu, result %d), elapsed %uus\n", m_time, b, t.read_us());
-        }
-        else if (c == 'c') {
-            ow.ConvertAll(true);
-            usb.printf("Convert done\n");
-        }
-        else if (c == 't') {
-            int result, temp;
-            uint8_t rom[8];
-            
-            memset(rom, 0, sizeof(rom));
-            result = ow.First(rom);
-            while (result == OW_FOUND) {
-                for (int i = 0; i < 8; i++) usb.printf("%.2X", rom[i]);
-                
-                t.reset();
-                t.start();
-                int b = ow.ReadTemperature(rom, &temp);
-                t.stop();
-                if (b) usb.printf(": read failed, code 0x%.4x, elapsed %uus\n", b, t.read_us());
-                else usb.printf(": read ok, temperature %.2f'C, elapsed %uus\n", temp / 100., t.read_us());
-                
-                result = ow.Next(rom);
-            }
-            usb.printf("Done\n");
-        }
-        else {
-            usb.printf("Syntax error\n");
-        }
-
-        usb.printf("\n");
-    }
-
-}
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-rtos.lib	Tue May 06 19:21:27 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed-rtos/#5dfe422a963d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/comm.cpp	Tue May 06 19:21:27 2014 +0000
@@ -0,0 +1,83 @@
+#include "mbed.h"
+#include "rtos.h"
+#include "USBSerial.h"
+#include "rtc.h"
+#include "sensor.h"
+#include "comm.h"
+
+void comm_thread(void const *args)
+{
+    USBSerial usb(0x1f00, 0x2012, 0x0001, false);
+    Timer t;
+    char c;
+    
+    while (1) 
+    {
+        c = usb.getc();
+
+        if (c == 'r') {
+            //  perform read
+            t.reset();
+            t.start();
+            time_t m_time = get_rtc();
+            t.stop();
+
+            struct tm *now;
+            now = localtime(&m_time);
+            
+            usb.printf("Current time is %lu, %02d:%02d:%02d, %d.%d.%04d\n", 
+                m_time, 
+                now->tm_hour, now->tm_min, now->tm_sec, 
+                now->tm_mday, now->tm_mon+1, now->tm_year+1900
+            );
+            usb.printf("Internal datetime format is %s\n", asctime(now));
+            usb.printf("Read complete, elapsed %uus\n", t.read_us());
+            
+        }
+        else if (c == 'i') {
+            //  perform read
+            time_t m_time = time(NULL);
+
+            struct tm *now;
+            now = localtime(&m_time);
+            
+            usb.printf("Internal datetime format is %s\n", asctime(now));
+        }
+        else if (c == 'w') {
+            //  perform write
+            int date, month, year, hours, minutes, seconds;
+            usb.printf("Enter the date (date 1..31)\n"); usb.scanf("%d", &date);
+            usb.printf("Enter the date (month 1..12)\n"); usb.scanf("%d", &month);
+            usb.printf("Enter the date (year >2000)\n"); usb.scanf("%d", &year);
+            usb.printf("Enter the time (hours 0..23)\n"); usb.scanf("%d", &hours);
+            usb.printf("Enter the time (minutes 0..59)\n"); usb.scanf("%d", &minutes);
+            usb.printf("Enter the time (seconds 0..59)\n"); usb.scanf("%d", &seconds);
+            
+            struct tm now = {seconds, minutes, hours, date, month-1, year-1900};
+            time_t m_time = mktime(&now);
+                
+            t.reset();
+            t.start();
+            bool b = set_rtc(m_time);
+            t.stop();
+            
+            usb.printf("Write complete (UNIX %lu, result %d), elapsed %uus\n", m_time, b, t.read_us());
+        }
+        else if (c == 't') {
+            sensor_mutex.lock();
+            for (int j = 0; j < sensor_count; j++) {
+                for (int i = 0; i < 8; i++) usb.printf("%.2X", sensor_roms[j][i]);
+                usb.printf(": temperature %.2f'C\n", sensor_temps[j] / 100.);
+            }
+            sensor_mutex.unlock();
+            usb.printf("Done\n");
+        }
+        else {
+            usb.printf("Syntax error, use {r|i|w|t}\n");
+        }
+
+        usb.printf("\n");
+    }
+    
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/disk.txt	Tue May 06 19:21:27 2014 +0000
@@ -0,0 +1,12 @@
+
+
+void read_config()
+
+void write_config()
+
+void log_temperature()
+
+void log_io()
+
+void log_event()
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main.cpp	Tue May 06 19:21:27 2014 +0000
@@ -0,0 +1,63 @@
+#include "mbed.h"
+#include "rtos.h"
+#include "SDFileSystem.h"
+#include "sensor.h"
+#include "comm.h"
+
+Serial pc(MBED_UARTUSB);
+
+SDFileSystem sd(MBED_SPI0, "sd");
+
+DigitalOut ledR(LED_RED, 1);
+DigitalOut ledG(LED_GREEN, 1);
+//DigitalOut ledB(LED_BLUE, 1);
+
+DigitalOut OUT1(D2, 0);
+DigitalOut OUT2(D3, 0);
+DigitalOut OUT3(D4, 0);
+DigitalOut OUT4(D5, 0);
+
+DigitalIn  IN1(D8, PullUp);
+DigitalIn  IN2(D9, PullUp);
+
+extern "C" void HardFault_Handler() 
+{
+    mbed_die();
+}
+
+int main(void)
+{
+    pc.printf("Starting threads... ");
+    Thread sensor(sensor_thread, NULL, osPriorityNormal, DEFAULT_STACK_SIZE);
+    Thread comm(comm_thread, NULL, osPriorityNormal, DEFAULT_STACK_SIZE);
+    pc.printf("done\n");
+
+    FILE *fp = fopen("/sd/sdtest2.txt", "w");
+    if (fp == NULL) {
+        pc.printf("Could not open file for write\n");
+    } else {
+        pc.printf("Writing... ");
+        fprintf(fp, "Hello fun SD Card World!\nOK!\n");
+        pc.printf("closing... ");
+        fclose(fp); 
+    }
+    pc.printf("done\n");
+
+    OUT1 = 1;
+    OUT2 = 1;
+    OUT3 = 1;
+    OUT4 = 1;
+    wait(1.0);
+    OUT1 = 0;
+    OUT2 = 0;
+    OUT3 = 0;
+    OUT4 = 0;
+
+    while (1) 
+    {
+        ledG = !ledG;
+        Thread::wait(200);
+    }
+
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/rtc.cpp	Tue May 06 19:21:27 2014 +0000
@@ -0,0 +1,25 @@
+#include "mbed.h"
+#include "rtos.h"
+#include "DS1307.h"
+#include "rtc.h"
+
+DS1307 rtc(I2C_SDA, I2C_SCL);
+Mutex rtc_mutex;
+
+time_t get_rtc()
+{
+    rtc_mutex.lock();
+    time_t m_time = rtc.now();
+    rtc_mutex.unlock();
+    set_time(m_time);
+    return m_time;
+}
+
+bool set_rtc(time_t time)
+{
+    rtc_mutex.lock();
+    bool b = rtc.set_time(time);
+    rtc_mutex.unlock();
+    set_time(time);
+    return b;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/sensor.cpp	Tue May 06 19:21:27 2014 +0000
@@ -0,0 +1,37 @@
+#include "mbed.h"
+#include "rtos.h"
+#include "1wire.h"
+#include "sensor.h"
+
+uint8_t sensor_roms[8][16];
+int16_t sensor_temps[16];
+int sensor_count;
+
+Mutex sensor_mutex;
+
+void sensor_thread(void const *args)
+{
+    OneWire ow(A4, A2, A3);
+    int result, temp;
+    uint8_t rom[8];
+    
+    while (1) {
+        ow.ConvertAll(false);
+        Thread::wait(CONVERT_T_DELAY);
+
+        sensor_mutex.lock();
+        sensor_count = 0;
+        memset(rom, 0, sizeof(rom));
+        result = ow.First(rom);
+        while (result == OW_FOUND) {
+            if (ow.ReadTemperature(rom, &temp) == 0) {
+                memcpy(sensor_roms[sensor_count], rom, sizeof(rom));
+                sensor_temps[sensor_count] = temp;
+                sensor_count++;
+            }
+            result = ow.Next(rom);
+        }
+        sensor_mutex.unlock();
+    }
+}
+