Central Heating controller using the real time clock, PHY module for internet, 1-wire interface for temperature sensors, a system log and a configuration file

Dependencies:   net 1-wire lpc1768 crypto clock web fram log

/media/uploads/andrewboyson/heating.sch

/media/uploads/andrewboyson/heating.brd

/media/uploads/andrewboyson/eagle.epf

Committer:
andrewboyson
Date:
Tue Jan 08 14:08:33 2019 +0000
Revision:
20:904a4f043f2c
Parent:
13:2ca12dd42e91
Child:
28:bb55def47737
Updated clock library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
andrewboyson 0:3c04f4b47041 1 #include <stdint.h>
andrewboyson 0:3c04f4b47041 2 #include <string.h>
andrewboyson 0:3c04f4b47041 3 #include <stdbool.h>
andrewboyson 0:3c04f4b47041 4
andrewboyson 0:3c04f4b47041 5 #include "tftp.h"
andrewboyson 0:3c04f4b47041 6 #include "dns.h"
andrewboyson 0:3c04f4b47041 7 #include "fram.h"
andrewboyson 20:904a4f043f2c 8 #include "clk.h"
andrewboyson 11:fa01ea25b62d 9 #include "mstimer.h"
andrewboyson 11:fa01ea25b62d 10 #include "clktm.h"
andrewboyson 0:3c04f4b47041 11 #include "ds18b20.h"
andrewboyson 0:3c04f4b47041 12 #include "radiator.h"
andrewboyson 0:3c04f4b47041 13 #include "boiler.h"
andrewboyson 0:3c04f4b47041 14 #include "program.h"
andrewboyson 0:3c04f4b47041 15 #include "log.h"
andrewboyson 0:3c04f4b47041 16 #include "net.h"
andrewboyson 0:3c04f4b47041 17
andrewboyson 0:3c04f4b47041 18 bool ValuesTrace = false;
andrewboyson 0:3c04f4b47041 19
andrewboyson 0:3c04f4b47041 20 static char serverName[DNS_MAX_LABEL_LENGTH+1]; static int iServerName;
andrewboyson 20:904a4f043f2c 21 static char fileName[DNS_MAX_LABEL_LENGTH+1]; static int iFileName;
andrewboyson 0:3c04f4b47041 22 static int32_t writeSize; static int iWriteSize;
andrewboyson 0:3c04f4b47041 23 static int32_t readInterval; static int iReadInterval;
andrewboyson 0:3c04f4b47041 24 static int64_t startTime; static int iStartTime;
andrewboyson 0:3c04f4b47041 25 static int32_t count; static int iCount;
andrewboyson 0:3c04f4b47041 26 static int iData;
andrewboyson 0:3c04f4b47041 27
andrewboyson 11:fa01ea25b62d 28 char* ValuesGetServerName ( ) { return serverName; }
andrewboyson 11:fa01ea25b62d 29 char* ValuesGetFileName ( ) { return fileName; }
andrewboyson 11:fa01ea25b62d 30 int ValuesGetWriteSize ( ) { return (int) writeSize; }
andrewboyson 1:ccc66fdf858d 31 int ValuesGetReadInterval ( ) { return (int) readInterval; }
andrewboyson 13:2ca12dd42e91 32 void ValuesGetStartTm (struct tm* ptm) { ClkTimeToTmUtc(startTime, ptm);}
andrewboyson 11:fa01ea25b62d 33 int ValuesGetCount ( ) { return (int) count; }
andrewboyson 0:3c04f4b47041 34
andrewboyson 0:3c04f4b47041 35 static void lblcpy(char* dst, char* src) { strncpy(dst, src, DNS_MAX_LABEL_LENGTH); dst[DNS_MAX_LABEL_LENGTH] = 0; }
andrewboyson 0:3c04f4b47041 36
andrewboyson 0:3c04f4b47041 37 void ValuesSetServerName (char* value) { lblcpy(serverName, value); FramWrite(iServerName , DNS_MAX_LABEL_LENGTH, serverName ); }
andrewboyson 0:3c04f4b47041 38 void ValuesSetFileName (char* value) { lblcpy( fileName, value); FramWrite(iFileName , DNS_MAX_LABEL_LENGTH, fileName ); }
andrewboyson 0:3c04f4b47041 39 void ValuesSetWriteSize (int value) { writeSize = (int32_t)value ; FramWrite(iWriteSize , 4, &writeSize ); }
andrewboyson 0:3c04f4b47041 40 void ValuesSetReadInterval (int value) { readInterval = (int32_t)value ; FramWrite(iReadInterval, 4, &readInterval ); }
andrewboyson 0:3c04f4b47041 41 static void setStartTime (int64_t value) { startTime = value ; FramWrite(iStartTime , 8, &startTime ); }
andrewboyson 0:3c04f4b47041 42 static void setCount (int value) { count = (int32_t)value ; FramWrite(iCount , 4, &count ); }
andrewboyson 0:3c04f4b47041 43
andrewboyson 0:3c04f4b47041 44 static int readValuesFromFram()
andrewboyson 0:3c04f4b47041 45 {
andrewboyson 0:3c04f4b47041 46 int address;
andrewboyson 0:3c04f4b47041 47 int32_t def4;
andrewboyson 0:3c04f4b47041 48
andrewboyson 0:3c04f4b47041 49 address = FramLoad( DNS_MAX_LABEL_LENGTH+1, serverName , NULL ); if (address < 0) return -1; iServerName = address;
andrewboyson 0:3c04f4b47041 50 address = FramLoad( DNS_MAX_LABEL_LENGTH+1, fileName , NULL ); if (address < 0) return -1; iFileName = address;
andrewboyson 0:3c04f4b47041 51 def4 = 100; address = FramLoad( 4, &writeSize , &def4); if (address < 0) return -1; iWriteSize = address;
andrewboyson 0:3c04f4b47041 52 def4 = 15; address = FramLoad( 4, &readInterval, &def4); if (address < 0) return -1; iReadInterval = address;
andrewboyson 0:3c04f4b47041 53 address = FramLoad( 8, &startTime , NULL ); if (address < 0) return -1; iStartTime = address;
andrewboyson 0:3c04f4b47041 54 address = FramLoad( 4, &count , NULL ); if (address < 0) return -1; iCount = address;
andrewboyson 0:3c04f4b47041 55 address = FramAllocate( 1 ); if (address < 0) return -1; iData = address;
andrewboyson 0:3c04f4b47041 56 return 0;
andrewboyson 0:3c04f4b47041 57 }
andrewboyson 0:3c04f4b47041 58
andrewboyson 0:3c04f4b47041 59
andrewboyson 11:fa01ea25b62d 60 static uint32_t readStartMs;
andrewboyson 0:3c04f4b47041 61
andrewboyson 0:3c04f4b47041 62 static int writeIndex;
andrewboyson 0:3c04f4b47041 63
andrewboyson 0:3c04f4b47041 64 static int nextByteOfWriteStream()
andrewboyson 0:3c04f4b47041 65 {
andrewboyson 0:3c04f4b47041 66 int byteAfterData = count * 8;
andrewboyson 0:3c04f4b47041 67 if (writeIndex >= byteAfterData || writeIndex + iData >= FRAM_SIZE)
andrewboyson 0:3c04f4b47041 68 {
andrewboyson 0:3c04f4b47041 69 setCount(0);
andrewboyson 0:3c04f4b47041 70 return -1;
andrewboyson 0:3c04f4b47041 71 }
andrewboyson 0:3c04f4b47041 72 char c;
andrewboyson 0:3c04f4b47041 73 FramRead(writeIndex + iData, 1, &c);
andrewboyson 0:3c04f4b47041 74 writeIndex++;
andrewboyson 0:3c04f4b47041 75 return c;
andrewboyson 0:3c04f4b47041 76 }
andrewboyson 0:3c04f4b47041 77
andrewboyson 0:3c04f4b47041 78 static void readValues()
andrewboyson 11:fa01ea25b62d 79 {
andrewboyson 0:3c04f4b47041 80 uint64_t record = 0;
andrewboyson 0:3c04f4b47041 81 uint16_t value;
andrewboyson 0:3c04f4b47041 82 value = DS18B20ValueFromRom(RadiatorGetHallRom());
andrewboyson 0:3c04f4b47041 83 value &= 0x0FFF;
andrewboyson 0:3c04f4b47041 84 record |= value; //0000 0000 0000 0AAA
andrewboyson 0:3c04f4b47041 85 record <<= 12; //0000 0000 00AA A000
andrewboyson 0:3c04f4b47041 86 value = DS18B20ValueFromRom(BoilerGetTankRom ());
andrewboyson 0:3c04f4b47041 87 value &= 0x0FFF;
andrewboyson 0:3c04f4b47041 88 record |= value; //0000 0000 00AA ABBB
andrewboyson 0:3c04f4b47041 89 record <<= 12; //0000 000A AABB B000
andrewboyson 0:3c04f4b47041 90 value = DS18B20ValueFromRom(BoilerGetOutputRom());
andrewboyson 0:3c04f4b47041 91 value &= 0x0FFF;
andrewboyson 0:3c04f4b47041 92 record |= value; //0000 000A AABB BCCC
andrewboyson 0:3c04f4b47041 93 record <<= 12; //0000 AAAB BBCC C000
andrewboyson 0:3c04f4b47041 94 value = DS18B20ValueFromRom(BoilerGetReturnRom());
andrewboyson 0:3c04f4b47041 95 value &= 0x0FFF;
andrewboyson 0:3c04f4b47041 96 record |= value; //0000 AAAB BBCC CDDD
andrewboyson 0:3c04f4b47041 97 record <<= 16; //AAAB BBCC CDDD 0000
andrewboyson 0:3c04f4b47041 98
andrewboyson 0:3c04f4b47041 99 record |= ProgramTimerOutput << 0;
andrewboyson 0:3c04f4b47041 100 record |= RadiatorGetMode() << 1;
andrewboyson 0:3c04f4b47041 101 record |= RadiatorGetOverride() << 2;
andrewboyson 0:3c04f4b47041 102 record |= RadiatorPump << 3;
andrewboyson 0:3c04f4b47041 103 record |= BoilerCall << 4;
andrewboyson 0:3c04f4b47041 104 record |= BoilerPump << 5; //AAAB BBCC CDDD 003F
andrewboyson 0:3c04f4b47041 105
andrewboyson 20:904a4f043f2c 106 if (count == 0) setStartTime(ClkNowTime());
andrewboyson 0:3c04f4b47041 107
andrewboyson 0:3c04f4b47041 108 FramWrite(iData + 8 * count, 8, &record);
andrewboyson 0:3c04f4b47041 109 setCount(count + 1);
andrewboyson 0:3c04f4b47041 110 }
andrewboyson 0:3c04f4b47041 111
andrewboyson 0:3c04f4b47041 112 static void writeValues()
andrewboyson 0:3c04f4b47041 113 {
andrewboyson 0:3c04f4b47041 114 if (count == 0 ) return; //Don't save if nothing to save
andrewboyson 0:3c04f4b47041 115 if (!serverName[0] ) return; //Do nothing if have no server name
andrewboyson 0:3c04f4b47041 116 if ( !fileName[0] ) return; //Do nothing if have no file name
andrewboyson 0:3c04f4b47041 117 if (TftpWriteStatus) return; //Do nothing if the TFTP client is busy
andrewboyson 0:3c04f4b47041 118
andrewboyson 0:3c04f4b47041 119 strcpy(TftpServerName, serverName);
andrewboyson 0:3c04f4b47041 120 struct tm tm;
andrewboyson 13:2ca12dd42e91 121 ClkTimeToTmUtc(startTime, &tm);
andrewboyson 0:3c04f4b47041 122 strftime(TftpFileName, DNS_MAX_LABEL_LENGTH+1, fileName, &tm);
andrewboyson 0:3c04f4b47041 123
andrewboyson 0:3c04f4b47041 124 if (ValuesTrace)
andrewboyson 0:3c04f4b47041 125 {
andrewboyson 0:3c04f4b47041 126 if (NetTraceNewLine) Log("\r\n");
andrewboyson 0:3c04f4b47041 127 LogTimeF("Values - requesting backup of %d values to %s\r\n", count, TftpFileName);
andrewboyson 0:3c04f4b47041 128 }
andrewboyson 0:3c04f4b47041 129
andrewboyson 0:3c04f4b47041 130 writeIndex = 0;
andrewboyson 0:3c04f4b47041 131 TftpWriteStatus = TFTP_WRITE_STATUS_REQUEST; //This is reset by TFTP when finished
andrewboyson 0:3c04f4b47041 132 }
andrewboyson 0:3c04f4b47041 133
andrewboyson 0:3c04f4b47041 134 void ValuesMain()
andrewboyson 0:3c04f4b47041 135 {
andrewboyson 11:fa01ea25b62d 136 if (!readInterval) readStartMs = MsTimerCount;
andrewboyson 11:fa01ea25b62d 137 if (writeSize && readInterval)
andrewboyson 0:3c04f4b47041 138 {
andrewboyson 11:fa01ea25b62d 139 if (MsTimerHasElapsed(readStartMs, readInterval * 1000))
andrewboyson 11:fa01ea25b62d 140 {
andrewboyson 11:fa01ea25b62d 141 readValues(); //Only read values if they are going to be backed up
andrewboyson 11:fa01ea25b62d 142 readStartMs = MsTimerCount;
andrewboyson 11:fa01ea25b62d 143 }
andrewboyson 0:3c04f4b47041 144 }
andrewboyson 11:fa01ea25b62d 145 else
andrewboyson 11:fa01ea25b62d 146 {
andrewboyson 11:fa01ea25b62d 147 readStartMs = MsTimerCount;
andrewboyson 11:fa01ea25b62d 148 }
andrewboyson 0:3c04f4b47041 149 if (count >= writeSize) writeValues(); //Backup the values once the backup size is reached
andrewboyson 0:3c04f4b47041 150 }
andrewboyson 0:3c04f4b47041 151
andrewboyson 0:3c04f4b47041 152 int ValuesInit()
andrewboyson 0:3c04f4b47041 153 {
andrewboyson 0:3c04f4b47041 154 if (readValuesFromFram()) return -1;
andrewboyson 11:fa01ea25b62d 155 readStartMs = MsTimerCount;
andrewboyson 0:3c04f4b47041 156 TftpGetNextByteFunction = nextByteOfWriteStream;
andrewboyson 0:3c04f4b47041 157 if (count > 0) writeValues(); //Backup the values if there are any
andrewboyson 0:3c04f4b47041 158 return 0;
andrewboyson 0:3c04f4b47041 159 }