X10 Server - IOT device to leverage a collection of old X10 devices for home automation and lighting control.

Dependencies:   IniManager mbed HTTPClient SWUpdate mbed-rtos Watchdog X10 SW_HTTPServer SW_String EthernetInterface TimeInterface SSDP

X10 Server

See the X10 Server Nodebook page

Committer:
WiredHome
Date:
Fri Aug 31 22:51:15 2018 +0000
Revision:
4:5da66fab599c
Parent:
0:de1dfa2ab813
Child:
5:6244e237def1
Updated the demo to set the RTC from an NTP server.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
WiredHome 0:de1dfa2ab813 1 //
WiredHome 0:de1dfa2ab813 2 // A simple SSDP example
WiredHome 0:de1dfa2ab813 3 //
WiredHome 0:de1dfa2ab813 4 #include "mbed.h" // ver 120; mbed-rtos ver 111
WiredHome 0:de1dfa2ab813 5 #include "EthernetInterface.h" // ver 55
WiredHome 0:de1dfa2ab813 6 #include "SW_HTTPServer.h" // ver 50
WiredHome 0:de1dfa2ab813 7 #include "TimeInterface.h" // ver 23
WiredHome 0:de1dfa2ab813 8 #include "Watchdog.h" // ver 6
WiredHome 0:de1dfa2ab813 9 #include "SW_String.h" // ver 1
WiredHome 0:de1dfa2ab813 10 #include "SSDP.h" // ver 0
WiredHome 0:de1dfa2ab813 11
WiredHome 0:de1dfa2ab813 12 #include "WebPages.h" // Private handler for web queries
WiredHome 0:de1dfa2ab813 13
WiredHome 0:de1dfa2ab813 14 RawSerial pc(USBTX, USBRX);
WiredHome 0:de1dfa2ab813 15
WiredHome 0:de1dfa2ab813 16 EthernetInterface eth;
WiredHome 0:de1dfa2ab813 17 TimeInterface ntp(&eth);
WiredHome 0:de1dfa2ab813 18 Watchdog wd;
WiredHome 0:de1dfa2ab813 19 time_t lastboottime;
WiredHome 0:de1dfa2ab813 20
WiredHome 4:5da66fab599c 21 PwmOut signOfLife(LED4); // LED sign of life. 100% WD reset, 20% restart, sine-wave: running
WiredHome 4:5da66fab599c 22
WiredHome 0:de1dfa2ab813 23 //FlashFileSystem flash("flash"); // static files here for reliability and speed
WiredHome 0:de1dfa2ab813 24 LocalFileSystem local("local"); // some place to hold settings and maybe the static web pages
WiredHome 0:de1dfa2ab813 25 const char * Server_Root = "/local";
WiredHome 0:de1dfa2ab813 26
WiredHome 0:de1dfa2ab813 27 // public for the WebPages handler to see
WiredHome 0:de1dfa2ab813 28 //
WiredHome 0:de1dfa2ab813 29 const char * BUILD_DATE = __DATE__ " " __TIME__;
WiredHome 0:de1dfa2ab813 30 const char * PROG_NAME = "SSDP Server";
WiredHome 4:5da66fab599c 31 char * My_Name = "MBED SSDP Node";
WiredHome 0:de1dfa2ab813 32 const char * My_SerialNum = "0000001";
WiredHome 4:5da66fab599c 33 int Server_Port = 80;
WiredHome 0:de1dfa2ab813 34 // end public information
WiredHome 0:de1dfa2ab813 35
WiredHome 0:de1dfa2ab813 36
WiredHome 4:5da66fab599c 37
WiredHome 4:5da66fab599c 38
WiredHome 4:5da66fab599c 39 /// ShowSignOfLife
WiredHome 4:5da66fab599c 40 ///
WiredHome 4:5da66fab599c 41 /// Pulse an LED to indicate a sign of life of the program.
WiredHome 4:5da66fab599c 42 /// This also has some moderate entertainment value.
WiredHome 4:5da66fab599c 43 ///
WiredHome 4:5da66fab599c 44 void ShowSignOfLife(int degreeIncrement = 1)
WiredHome 4:5da66fab599c 45 {
WiredHome 4:5da66fab599c 46 #define PI 3.14159265359
WiredHome 4:5da66fab599c 47 static int degrees = 0;
WiredHome 4:5da66fab599c 48 float v;
WiredHome 4:5da66fab599c 49
WiredHome 4:5da66fab599c 50 degrees += degreeIncrement;
WiredHome 4:5da66fab599c 51 v = sin(degrees * PI / 180)/2 + 0.5;
WiredHome 4:5da66fab599c 52 signOfLife = v; // a little dimmer
WiredHome 4:5da66fab599c 53 }
WiredHome 4:5da66fab599c 54
WiredHome 0:de1dfa2ab813 55 int main() {
WiredHome 0:de1dfa2ab813 56 pc.baud(460800);
WiredHome 0:de1dfa2ab813 57 pc.printf("\r\n%s Build %s\r\n", PROG_NAME, BUILD_DATE);
WiredHome 4:5da66fab599c 58 lastboottime = ntp.timelocal();
WiredHome 0:de1dfa2ab813 59 if (wd.WatchdogCausedReset()) {
WiredHome 0:de1dfa2ab813 60 pc.printf("**** Watchdog Event caused reset at %s ****\r\n", ntp.ctime(&lastboottime));
WiredHome 0:de1dfa2ab813 61 }
WiredHome 0:de1dfa2ab813 62 wd.Configure(45); // very generous, but this is a network appliance, so a bit less deterministic.
WiredHome 0:de1dfa2ab813 63
WiredHome 0:de1dfa2ab813 64 eth.init(); //Use DHCP
WiredHome 0:de1dfa2ab813 65 eth.connect();
WiredHome 0:de1dfa2ab813 66 printf("IP: %s\n", eth.getIPAddress());
WiredHome 0:de1dfa2ab813 67 //Thread thr(SSDPListener, NULL, osPriorityLow);
WiredHome 0:de1dfa2ab813 68 HTTPServer svr(Server_Port, Server_Root, 15, 30, 20, 50, &pc);
WiredHome 0:de1dfa2ab813 69 svr.RegisterHandler("/", RootPage);
WiredHome 0:de1dfa2ab813 70 svr.RegisterHandler("/setup.xml", Setup_xml);
WiredHome 4:5da66fab599c 71 SSDP ssdp(My_Name, eth.getMACAddress(), eth.getIPAddress(), Server_Port);
WiredHome 4:5da66fab599c 72
WiredHome 4:5da66fab599c 73 ntp.set_dst("3/11,2:00","11/4,2:00"); // mm/dd,hh:mm
WiredHome 4:5da66fab599c 74 ntp.set_tzo_min(-360);
WiredHome 4:5da66fab599c 75 int res = ntp.setTime("pool.ntp.org");
WiredHome 4:5da66fab599c 76
WiredHome 0:de1dfa2ab813 77 while (1) {
WiredHome 0:de1dfa2ab813 78 wd.Service();
WiredHome 0:de1dfa2ab813 79 svr.Poll(); // non-blocking, but also not deterministic
WiredHome 0:de1dfa2ab813 80 Thread::yield();
WiredHome 4:5da66fab599c 81 ShowSignOfLife(10);
WiredHome 4:5da66fab599c 82 static time_t tLast;
WiredHome 4:5da66fab599c 83 time_t tNow = ntp.timelocal();
WiredHome 4:5da66fab599c 84 if (tNow != tLast) {
WiredHome 4:5da66fab599c 85 printf("time is %s\r\n", ntp.ctime(&tNow));
WiredHome 4:5da66fab599c 86 tLast = tNow;
WiredHome 4:5da66fab599c 87 }
WiredHome 4:5da66fab599c 88 //printf("Mem: %5d, %5d %5d\n", Thread::used_stack(), Thread::max_stack(), Thread::stack_size());
WiredHome 0:de1dfa2ab813 89 }
WiredHome 0:de1dfa2ab813 90 }