Ben Gordon
/
ELEC351_GroupA_alternate
temp
Revision 0:2a4af0cb6e8d, committed 2018-12-06
- Comitter:
- BenRJG
- Date:
- Thu Dec 06 15:38:09 2018 +0000
- Commit message:
- Imported Code from Kiel; Added button functionality; Added set DateTime Functionality
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Button.cpp Thu Dec 06 15:38:09 2018 +0000 @@ -0,0 +1,77 @@ +#include "Button.hpp" + +BYTE BUTTON::poll(void) +{ + switch(state) + { + case FALLEN : + OUTPUT = 0; + if(IN != 0){ + OUTPUT = 1; + state = RISING; + timer.reset(); + timer.start(); + } + break; + + case RISING : + OUTPUT = 0; + if(timer.read_ms() > 100){ + timer.stop(); + state = RISEN; + } + break; + + case RISEN : + OUTPUT = 0; + if(IN != 0){ + OUTPUT = 2; + state = FALLING; + timer.reset(); + timer.start(); + } + break; + + case FALLING : + OUTPUT = 0; + if(timer.read_ms() > 100){ + timer.stop(); + state = FALLEN; + } + break; + } + + return OUTPUT; +} + +BYTE BUTTON::rise(void) +{ + switch(state) + { + case FALLEN : + OUTPUT = 0; + if(IN != 0){ + OUTPUT = 1; + state = RISING; + timer.reset(); + timer.start(); + } + break; + + case RISING : + OUTPUT = 0; + if(timer.read_ms() > 100){ + timer.stop(); + state = FALLEN; + } + break; + } + + return OUTPUT; +} + +/*BYTE BUTTON::fall(void) +{ + + return OUTPUT; +}*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Button.hpp Thu Dec 06 15:38:09 2018 +0000 @@ -0,0 +1,18 @@ +#include "mbed.h" +#include "General.hpp" + +// Class BUTTON polls a button for detection of edge +class BUTTON { + public: + BUTTON(PinName pin) : IN(pin){state = FALLEN;} + BYTE poll(void); + BYTE rise(void); + //BYTE fall(void); + private: + enum State {FALLEN, RISING, RISEN, FALLING}; + State state; + DigitalIn IN; + INT_16 OUTPUT; //Output is 1 if button is rising and 2 if button is falling + Timer timer; +}; +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/General.hpp Thu Dec 06 15:38:09 2018 +0000 @@ -0,0 +1,21 @@ +#include "mbed.h" + +// Define Needed values for SD reader +#define Signal_UnMount 1 + +// define all datatypes to make data sizes more understandable +#define S_BYTE signed char +#define BYTE char +#define U_BYTE unsigned char +#define INT_16 short int +#define UINT_16 unsigned short int +#define INT_32 int +#define UINT_32 unsigned int +#define INT_64 long int +#define UINT_64 unsigned long int +#define FLOAT_32 float +#define FLOAT_64 double +#define FLOAT_96 long double + +extern Thread SDcard_THREAD, Terminal_THREAD, NetWorking_THREAD; +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/LCD.cpp Thu Dec 06 15:38:09 2018 +0000 @@ -0,0 +1,98 @@ +#include "LCD.hpp" +#include "General.hpp" + +//LCD data sheet: https://www.rapidonline.com/pdf/57-2224.pdf + +void LCD::INIT() +{ + //All lines default low + _LCD_RS = 0; + _LCD_E = 0; + + //LCD Initialise + wait_ms(45); //Wait for LCD startup + /*Step 1*/ + wait_us(40); //Wait whilst LCD busy + _LCD_RS = control; + LCD_DDRAM = 0; //Clear data line + LCD_DDRAM = (FUNC|bit8)>>4; //Put data on line + LCD_strobe(); + + /*Step 2*/ cmdLCD(FUNC|lines2); //Function Set 0x20|0x08 = 0x28 + /*Step 3*/ cmdLCD(FUNC|lines2); //Function Set 0x20|0x08 = 0x28 + /*Step 4*/ cmdLCD(DISPLAY|on); //Display Control 0x08|0x0x04 = 0x0c + /*Step 5*/ cmdLCD(CLEAR); //Clear Display 0x01 + /*Step 6*/ cmdLCD(ENTRYMODE|I); //Set entry mode 0x04|0x02 = 0x06 + + cmdLCD(RETURN); //return home location +} + +void LCD::clear() +{ + cmdLCD(CLEAR); +} + +void LCD::display(BYTE* str, UINT_16 location) +{ + if(location != NULL) + { + pos(location); + } + U_BYTE p = 0; + while((str[p]!= NULL)&&(p<16)) + { + putt(str[p]); + p++; + } +} + +void LCD::pos(UINT_16 location) +{ + cmdLCD(0x80|location); +} + +void LCD::putt(U_BYTE c) +{ + wait_us(3000); + _LCD_RS = text; + set_LCD_data(c); +} + +void LCD::cmdLCD(U_BYTE cmd) +{ + wait_us(3000); //Wait whilst LCD busy + _LCD_RS = control; + set_LCD_data(cmd); //set data on bus +} + +void LCD::LCD_strobe(void) +{ + wait_us(10); + _LCD_E = 1; + wait_us(10); + _LCD_E = 0; +} + +void LCD::set_LCD_data(U_BYTE d) +{ + // Send upper 4 bits then lower for bits + // e.g. 11110000 => 1111 -> 0000 + + LCD_DDRAM = 0; //Clear data line + LCD_DDRAM = d>>4; //Put data on line + LCD_strobe(); + wait_us(1000); + LCD_DDRAM = 0; //Clear + LCD_DDRAM = d; //Put remaining data on line + LCD_strobe(); +} + +void LCD::enableCursor() +{ + cmdLCD(DISPLAY|on|cursor); +} + +void LCD::disableCursor() +{ + cmdLCD(DISPLAY|on); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/LCD.hpp Thu Dec 06 15:38:09 2018 +0000 @@ -0,0 +1,55 @@ +#ifndef _LCD_HPP +#define _LCD_HPP + + #include "mbed.h" + #include "General.hpp" + + #define CLEAR 0x01 + #define RETURN 0x02 + + #define ENTRYMODE 0x04 + #define I 0x02 + #define shift 0x01 + + #define DISPLAY 0x08 + #define on 0x04 + #define cursor 0x02 + #define blink 0x01 + + #define FUNC 0x20 + #define bit8 0x10 + #define lines2 0x08 + #define dots11 0x04 + + #define control 0 + #define text 1 + + #define write 0 + #define read 1 + + #define LINE1 0x00 + #define LINE2 0x40 + + class LCD{ + public: + LCD(PinName rs, PinName e, PinName d4, PinName d5, PinName d6, PinName d7) : _LCD_RS(rs), _LCD_E(e), LCD_DDRAM(d4,d5,d6,d7) {} + void INIT(); + void clear(); + void display(BYTE* str, UINT_16 location=NULL); + void putt(U_BYTE c); + void pos(UINT_16 location); + + void enableCursor(); + void disableCursor(); + private: + DigitalOut _LCD_RS; + DigitalOut _LCD_E; + BusOut LCD_DDRAM; + private: + void cmdLCD(U_BYTE cmd); + void LCD_strobe(void); + void set_LCD_data(U_BYTE d); + UINT_32 findSpace(U_BYTE* str); + }; +#endif +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/NetWorking.cpp Thu Dec 06 15:38:09 2018 +0000 @@ -0,0 +1,59 @@ +#include "NetWorking.hpp" + +// Thread handels networking and updates a conected PC whenever the webpage is refreshed +void NetWorkingThread(void) +{ + // Configure an ethernet connection + EthernetInterface eth; + eth.set_network(IP, NETMASK, GATEWAY); + eth.connect(); + + // Now setup a web server + TCPServer srv; // TCP/IP Server + TCPSocket clt_sock; // Socket for communication + SocketAddress clt_addr; // Address of incoming connection + + // Open the server on ethernet stack + srv.open(ð); + + // Bind the HTTP port (TCP 80) to the server + srv.bind(eth.get_ip_address(), 80); + + // Set maximum simultanious conections + srv.listen(5); + + while (true) { + using namespace std; + + // Block and wait on an incoming connection (if page is accessed) + srv.accept(&clt_sock, &clt_addr); + + // Get most up to date enviromental values + float LIGHT = 0.0f; + float TEMP = 0.0f; + float PRES = 0.0f; + + // Convert to a C String + char Light_str[8]; + char Temp_str[8]; + char Pres_str[8]; + sprintf(Light_str, "%5.3f", LIGHT ); + sprintf(Temp_str, "%5.3f", TEMP ); + sprintf(Pres_str, "%5.3f", PRES ); + + string response; + + // Build the C++ string response + response = HTTP_MESSAGE_BODY1; + response += Light_str; + response += HTTP_MESSAGE_BODY2; + response += Temp_str; + response += HTTP_MESSAGE_BODY3; + response += Pres_str; + response += HTTP_CLOSE; + + // Send static HTML response (as a C string) + int debug = clt_sock.send(response.c_str(), strlen(response.c_str())+6); + } +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/NetWorking.hpp Thu Dec 06 15:38:09 2018 +0000 @@ -0,0 +1,50 @@ +#if !FEATURE_LWIP + #error [NOT_SUPPORTED] LWIP not supported for this target +#endif + +#include "mbed.h" +#include "EthernetInterface.h" +#include "TCPServer.h" +#include "TCPSocket.h" +#include <iostream> +#include <string> + +#define HTTP_STATUS_LINE "HTTP/1.0 200 OK" +#define HTTP_HEADER_FIELDS "Content-Type: text/html; charset=utf-8" +#define HTTP_MESSAGE_BODY1 "" \ +"<html>" "\n\r" \ +"<head>" "\n\r" \ +" <meta charset=\"utf-8\">" "\n\r" \ +" <title> ELEC 351 </title>" "\n\r" \ +" <meta http-equiv=\"refresh\" content=\"10\">" "\n\r" \ +"</head>" "\n\r" \ +"<body style=\"display:flex;text-align:center\" bgcolor=\"black\" text=\"white\">" "\n\r" \ +" <div style=\"margin:auto\">" "\n\r" \ +" <h1> Low Power Enviromental Sensor : Network Conection </h1>" "\n\r"\ +" <p> The Light value is " + +#define HTTP_MESSAGE_BODY2 "" \ +" </p>" "\n\r" \ +" <p> The Temp value is " + +#define HTTP_MESSAGE_BODY3 "" \ +" </p>" "\n\r" \ +" <p> The Pressure value is " + +#define HTTP_CLOSE "" \ +" </p>" "\n\r" \ +" </div>" "\n\r" \ +"</body>" "\n\r" \ +"</html>" + +#define HTTP_RESPONSE HTTP_STATUS_LINE "\r\n" \ + HTTP_HEADER_FIELDS "\r\n" \ + "\r\n" \ + HTTP_MESSAGE_BODY "\r\n" + +#define IP "10.0.0.10" +#define NETMASK "255.0.0.0" +#define GATEWAY "10.0.0.1" + +void NetWorkingThread(void); +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Pages.cpp Thu Dec 06 15:38:09 2018 +0000 @@ -0,0 +1,91 @@ +#include "Pages.hpp" + + //d.setTime(); + //printf("Info Start -------\n\r"); + //printf("Time -> %s\n\r",d.getTime()); + //printf("Info End ---------\n\r"); + +void Pages::INIT() +{ + setTemperature(0); + setLightLevel(0); + setPressure(0); + _lcd.INIT(); + +} + +void Pages::pageOne() +{ + _lcd.clear(); + // _lcd.disableCursor(); + + //Temperature Page + _lcd.display("T: ",LINE1); + _lcd.display(_temperature); + _lcd.putt(223); + _lcd.display("C"); + + //LightLevel Page + _lcd.display("L: ",LINE1+9); + _lcd.display(_lightLevel); + + //Pressure Page + _lcd.display("P: ",LINE2+2); + _lcd.display(_pressure); + _lcd.display(" mbar"); + _lcd.enableCursor(); +} + +void Pages::pageTwo() +{ + _lcd.clear(); + // _lcd.enableCursor(); + + _lcd.display("00/00/0000 00:00",LINE1); + _lcd.display("dd/mm/yyyy hh:mm",LINE2); + + _lcd.pos(LINE1); +} + +void Pages::pageThree() +{ + _lcd.clear(); + // _lcd.enableCursor(); + + _lcd.display("Life? don't talk",LINE1); + _lcd.display("to me about life",LINE2); + + _lcd.pos(LINE1); +} + +void Pages::setTemperature(S_BYTE temp) +{ + sprintf(_temperature,"%d",temp); +} + +void Pages::setLightLevel(U_BYTE light) +{ + sprintf(_lightLevel,"%u",light); +} + +void Pages::setPressure(U_BYTE pres) +{ + sprintf(_pressure,"%u",pres); +} + +void Pages::setDateTime(char* dateTime) +{ + _lcd.pos(LINE1); + _lcd.display(dateTime,LINE1); +} + +void Pages::cursorPos(UINT_16 location) +{ + _lcd.pos(location); +} + +void Pages::clear() +{ + +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Pages.hpp Thu Dec 06 15:38:09 2018 +0000 @@ -0,0 +1,30 @@ +#ifndef _DISPLAY_HPP +#define _DISPLAY_HPP + #include "mbed.h" + #include "General.hpp" + #include "LCD.hpp" + + class Pages{ + public: + Pages(PinName rs, PinName e, PinName d4, PinName d5, PinName d6, PinName d7) : _lcd(rs,e,d4,d5,d6,d7) {} + void INIT(); + void clear(); + void pageOne(); + void pageTwo(); + void pageThree(); + void cursorPos(UINT_16 location); + + void setTemperature(S_BYTE temp); + void setLightLevel(U_BYTE light); + void setPressure(U_BYTE pres); + + void setDateTime(char* dateTime); + private: + char _temperature[4]; + char _lightLevel[5]; + char _pressure[6]; + private: + LCD _lcd; + }; +#endif +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SDReader.cpp Thu Dec 06 15:38:09 2018 +0000 @@ -0,0 +1,133 @@ +#include "SDReader.hpp" +#include "Button.hpp" + +// Thread for saving DATA to the SD card +void SDThread(void) +{ + // Create object SD of the SDReader class with set SPI pins + SDReader SD(PB_5, D12, D13, D10); // mosi, miso, sclk, cs + + // Create switch to dismount the SD card + BUTTON onBoardSwitch(USER_BUTTON); + + // Create variable to store state of SD card + enum State {MOUNTED, UNMOUNTED, MOUNTING, UNMOUNTING}; + State Mounted = MOUNTING; + + while(1) + { + // FSM for each state of SD card + switch(Mounted) + { + case UNMOUNTED : + wait_ms(100); + if(onBoardSwitch.poll() == 1) + { + Mounted = MOUNTING; + } + break; + + case MOUNTED : + //SD.UPLOAD(1.404f,0.303f,0.124f); + wait_ms(100); + if(onBoardSwitch.poll() == 1) + { + Mounted = UNMOUNTING; + } + break; + + case UNMOUNTING : + SD.unmount(); + Terminal_THREAD.signal_set(Signal_UnMount); + Mounted = UNMOUNTED; + break; + + case MOUNTING : + if(SD.INIT() == 0){ + Mounted = UNMOUNTED; + Terminal_THREAD.signal_set(Signal_UnMount); + } else { + Mounted = MOUNTED; + } + break; + } + } +} + +BYTE SDReader::INIT(void) +{ + BYTE Mount; + + // call the SDBlockDevice instance initialisation method. + if(sd.init() != 0){ + Mount = 0; + } else { + Mount = 1; + } + + if(Mount == 0){ + return Mount; + } else { + //Remove existing file + remove( "/sd/ELEC351.csv" ); + + FILE* fp = fopen("/sd/ELEC351.csv","a+"); + //Check file handle (stream) + if (fp == NULL) { + return Mount; + } + + //Put some text in the file... + fprintf(fp, " TIME STAMP, light, temperature, pressure\n"); + + //Close the file + fclose(fp); + + return Mount; + } +} + +void SDReader::UPLOAD(FLOAT_32 LIGHT, FLOAT_32 TEMP, FLOAT_32 PRESS) +{ + FILE* fp = fopen("/sd/ELEC351.csv","a+"); + //Check file handle (stream) + if (fp == NULL) { + return; + } + + //Put some text in the file... + fprintf(fp, " TIME STAMP, %1.4f, %1.4f, %1.4f\n", LIGHT, TEMP, PRESS); + + //Close the file + fclose(fp); +} + +BYTE* SDReader::DOWNLOAD(void) +{ + FILE* fp = fopen("/sd/ELEC351.csv","r"); + if (fp == NULL) { + + } + + //Read back all strings + BYTE* s1 = new BYTE; + + //while (fscanf(fp, "%s", s1) == 1) + //{ + // + //} + + fgets(s1, sizeof(s1), fp); + + //Close File + fclose(fp); + + return s1; +} + +void SDReader::unmount(void) +{ + sd.deinit(); + return; +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SDReader.hpp Thu Dec 06 15:38:09 2018 +0000 @@ -0,0 +1,21 @@ +#include "mbed.h" +#include "SDBlockDevice.h" +#include "FATFileSystem.h" +#include "General.hpp" +#include "rtos.h" + +// Class SDReader expects mosi miso sclk and cs pins and is used for controlling a spi connected sd reader +class SDReader { + public: + SDReader(PinName mosi, PinName miso, PinName sclk, PinName cs) : sd(mosi, miso, sclk, cs), fs("sd", &sd){} + BYTE INIT(void); + void UPLOAD(FLOAT_32 LIGHT, FLOAT_32 TEMP, FLOAT_32 PRESS); + BYTE* DOWNLOAD(void); + void unmount(void); + private: + SDBlockDevice sd; + FATFileSystem fs; +}; + +void SDThread(void); // Thread for terminal to run in +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Terminal.cpp Thu Dec 06 15:38:09 2018 +0000 @@ -0,0 +1,89 @@ +/******************************************************************************* +This cpp defines the functions for the terminal class which are used to +control the terminal, it also defines the TerminalThread function which +is ran in its own thread and controls the printing of DATA to the Terminal +*******************************************************************************/ +#include "Terminal.hpp" + +// Thread for handiling the terminal +void TerminalThread(void) +{ + // Create Object PC of class Terminal with Set SERIAL_TX and SERIAL_RX pins + Terminal PC(SERIAL_TX, SERIAL_RX); + PC.init(); + PC.DisplayCellIndex(); + // Enter Forever loop + while(1) + { + // If signal from SD thread recieved print message to terminal + Thread::signal_wait(Signal_UnMount); + PC.PrintMSGS("UNMOUNTED SD"); + } +} + +void Terminal::init(void) +{ + // Set baud rate for serial object pc + pc.baud (115200); + + // Hide cursor, move to x 0 y 0 and change print colour to green + pc.printf("\x1b[?25l"); // Hides cursor + //pc.printf("\x1b[3j"); // Clear screen + Cursor(0,0); + Colour(ColourGREEN); + + // Print DATA table to present data + pc.printf("* ELEC351 : Low Power Enviromental Sensor * Date and Time Here *\n\r" + "*********************************************************************\n\r" + "* TIME * TEMP (C) * PRESSURE (mbar)* LIGHT (LUX) *\n\r" + "*********************************************************************\n\r"); + for(BYTE idx = 0; idx < Rows; idx++) + { + pc.printf("* * * * *\n\r"); + } + pc.printf("*********************************************************************\n\r" + "* Debug * *"); + + // Position cursor in first cell of table + Cursor(3,3); + Colour(ColourRED); +} + +// Move cursor of pc terminal to co-ordinates 'X' and 'Y' (between 0 and 255) +void Terminal::Cursor(BYTE X, BYTE Y) +{ + pc.printf("\x1b[%d;%dH",Y,X); +} + +// Change pc terminal print colour (8 bit colour) to colour defined by "COLOUR" +void Terminal::Colour(BYTE COLOUR) +{ + pc.printf("\x1b[38;5;%dm",COLOUR); +} + +// Prints data(STRING) to cell in table defined by IDX +void Terminal::PrintDATA(BYTE* STRING, BYTE IDX) +{ + BYTE Y = (IDX/4)+5; + BYTE X = ((IDX%4)*17)+3; + Cursor(X,Y); + pc.printf("%s",STRING); +} + +// Prints index of cells into each cell for debug purpose +void Terminal::DisplayCellIndex(void){ + for(BYTE IDX = 0; IDX < MaxDATA; IDX++){ + BYTE Y = (IDX/4)+5; + BYTE X = ((IDX%4)*17)+3; + Cursor(X,Y); + pc.printf("%d",IDX); + } +} + +// Prints MSGS (String) to debug line of terminal +void Terminal::PrintMSGS(BYTE* STRING) +{ + Cursor((11),(Rows+6)); + pc.printf("%s",STRING); +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Terminal.hpp Thu Dec 06 15:38:09 2018 +0000 @@ -0,0 +1,37 @@ +/******************************************************************************* +This header defines Terminal class which has all the functions for controlling a +terminal, the serial object is kept private and therefore can only be accessed +through function of the terminal class. +*******************************************************************************/ + +#include "mbed.h" +#include "rtos.h" +#include "General.hpp" + +// Use generic to set number of rows in table +#define Rows 15 +#define MaxDATA (Rows*4) + +// Define 8 bit colours for printing to terminal +#define ColourRED 9 +#define ColourGREEN 118 +#define ColourBLUE 12 +#define ColourWhite 255 +#define ColourPurple 5 + +// Class Terminal expects tx and rx pins and is used for controlling a serialy conected terminal +class Terminal { + public: + Terminal(PinName tx, PinName rx) : pc(tx, rx){} + void init(void); + void PrintDATA(BYTE* STRING, BYTE IDX); + void PrintMSGS(BYTE* STRING); + void DisplayCellIndex(void); // Prints index of cells into each cell for debug purpose + private: + Serial pc; + void Cursor(BYTE X, BYTE Y); // Function moves cursor to position defined by co-ordinates x,y + void Colour(BYTE COLOUR); // Function changes terminal print colour to 8 bit colour defined by COLOUR +}; + +void TerminalThread(void); // Thread for terminal to run in +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dateTime.hpp Thu Dec 06 15:38:09 2018 +0000 @@ -0,0 +1,90 @@ +#ifndef _dateTime_HPP +#define _dateTime_HPP + #include "mbed.h" + #include "General.hpp" + + class dateTime{ + public: + dateTime() + { + getSystemTime(); + time_t check = -1; + if(mktime(&_currentTime_struct) == check) + { + _currentTime_struct.tm_year = 70; + _currentTime_struct.tm_mon = 0; + _currentTime_struct.tm_mday = 1; + _currentTime_struct.tm_hour = 0; + _currentTime_struct.tm_min = 0; + _currentTime_struct.tm_sec = 0; + printf("THIS HAS BEEN RUN TOO\n\r"); + } + + printf("THIS HAS BEEN RUN %d\n\r",check); + } + + + void updateStruct() + { + time_t _newTime_time = mktime(&_newTime_struct); + _newTime_struct = *localtime(&_newTime_time); + if(_newTime_struct.tm_year == 0) + { + _newTime_struct = _currentTime_struct; + } + _currentTime_struct = _newTime_struct; + } + + void addYear (INT_32 years =1){ + _newTime_struct = _currentTime_struct; + _newTime_struct.tm_year = _currentTime_struct.tm_year + years; + updateStruct(); + } + + void addMonth(S_BYTE months =1){ + _newTime_struct = _currentTime_struct; + _newTime_struct.tm_mon = _currentTime_struct.tm_mon + months; + updateStruct(); + } + void addDay (S_BYTE days =1){ + _newTime_struct = _currentTime_struct; + _newTime_struct.tm_mday = _currentTime_struct.tm_mday + days; + updateStruct(); + } + void addHour (S_BYTE hours =1){ + _newTime_struct = _currentTime_struct; + _newTime_struct.tm_hour = _currentTime_struct.tm_hour + hours; + updateStruct(); + } + void addMin (S_BYTE minutes=1){ + _newTime_struct = _currentTime_struct; + _newTime_struct.tm_min = _currentTime_struct.tm_min + minutes; + updateStruct(); + } + void addSec (S_BYTE seconds=1){ + _newTime_struct = _currentTime_struct; + _newTime_struct.tm_sec = _currentTime_struct.tm_sec + seconds; + updateStruct(); + } + + void setSystemTime(){set_time(mktime(&_currentTime_struct));} + char* getSystemTime(){time_t rawTime; time(&rawTime); _currentTime_struct = *localtime(&rawTime); return getTime();} + + char* getTime() {sprintf(dateTimeStr,"%02d/%02d/%4d %02d:%02d:%02d",getDay(),getMonth(),getYear(),getHour(),getMin(),getSec()); return dateTimeStr;} + //char* getTime() {updateTime(); sprintf(dateTimeStr, "Hello world %d:)",42);return dateTimeStr;}; + + signed INT_32 getYear() {return _currentTime_struct.tm_year + 1900;} + BYTE getMonth() {return _currentTime_struct.tm_mon + 1; } + BYTE getDay() {return _currentTime_struct.tm_mday; } + BYTE getHour() {return _currentTime_struct.tm_hour; } + BYTE getMin() {return _currentTime_struct.tm_min; } + BYTE getSec() {return _currentTime_struct.tm_sec; } + private: + //time_t _currentTime_time; + struct tm _currentTime_struct; + struct tm _newTime_struct; + char dateTimeStr[20]; + //01/09/ + }; +#endif +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/displayThread.cpp Thu Dec 06 15:38:09 2018 +0000 @@ -0,0 +1,178 @@ +#include "displayThread.h" +//InterruptIn button1(b1); +//InterruptIn button2(b2); + +InterruptIn button1(b1); +InterruptIn button2(b2); + +U_BYTE buttonPressed; + +signed INT_32 increment[] = {10,1,10,1,1000,100,10,1,10,1,10,1,10,1}; +signed INT_32 cursorPosition[] = {0,1,3,4,6,7,8,9,11,12,14,15}; + +dateTime d; +Pages page(RS,E,d4,d5,d6,d7); //rs,e,d4,d5,d6,d7 +U_BYTE cursorPos=0; +enum pageNumber {PAGEONE, PAGETWO, PAGETHREE}; + +pageNumber currentPage; + +EventQueue buttonQueue; + +Timeout doublePress; + +void DisplayThread() +{ + page.INIT(); + page.pageOne(); + page.pageOne(); + currentPage = PAGEONE; + buttonPressed = 0; + + button1.rise(buttonISR1); + button2.rise(buttonISR2); + + while(1) + { + buttonQueue.dispatch_forever(); + } +} + +void pageSelect(U_BYTE buttonValue) +{ + switch (currentPage) + { + case PAGEONE: + buttonActionOne(buttonValue); + break; + case PAGETWO: + buttonActionTwo(buttonValue); + break; + case PAGETHREE: + buttonActionThree(buttonValue); + break; + } +} + +void buttonActionOne(U_BYTE buttonValue) +{ + switch(buttonValue) + { + case 0x01: + page.pageTwo(); + currentPage = PAGETWO; + page.setDateTime(d.getTime()); + cursorPos=0; + break; + //case 0x02: + // page.pageOne(); + // currentPage = PAGEONE; + // break; + case 0x03: + page.pageThree(); + currentPage = PAGETHREE; + break; + } +} +void buttonActionTwo(U_BYTE buttonValue) +{ + switch (buttonValue) + { + case 0x01: + setValue(cursorPos,increment[cursorPos]); + break; + case 0x02: + setValue(cursorPos,0-increment[cursorPos]); + break; + case 0x03: + cursorPos++; + break; + } + page.cursorPos(LINE1+cursorPosition[cursorPos]); + if(cursorPos == 12) + { + page.pageOne(); + currentPage = PAGEONE; + } + +} + +void buttonActionThree(U_BYTE buttonValue) +{ + switch(buttonValue) + { + case 0x01: + page.pageOne(); + currentPage = PAGEONE; + break; + } +} +void setValue(BYTE cycle,signed INT_32 value) +{ + switch(cycle){ + case 0: + case 1: + d.addDay(value); + page.setDateTime(d.getTime()); + + break; + + case 2: + case 3: + d.addMonth(value); + page.setDateTime(d.getTime()); + break; + + case 4: + case 5: + case 6: + case 7: + d.addYear(value); + page.setDateTime(d.getTime()); + break; + + case 8: + case 9: + d.addHour(value); + page.setDateTime(d.getTime()); + break; + + case 10: + case 11: + d.addMin(value); + page.setDateTime(d.getTime()); + break; + + /*case 12: + case 13: + d.addSec(value); + page.setDateTime(d.getTime()); + break;*/ + } +} + +void buttonISR1() +{ + buttonPressed |= 1; + + if(buttonPressed != 3){ + doublePress.attach(&buttonTO, 0.2); + } +} + +void buttonISR2() +{ + buttonPressed |= 2; + + if(buttonPressed != 3){ + doublePress.attach(&buttonTO, 0.2); + } +} + +void buttonTO() +{ + if(buttonPressed != 0){ + buttonQueue.call(&pageSelect,buttonPressed); + buttonPressed = 0; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/displayThread.h Thu Dec 06 15:38:09 2018 +0000 @@ -0,0 +1,36 @@ +#ifndef _DISPLAYTHREAD_H +#define _DISPLAYTHREAD_H + #include "Pages.hpp" + #include "mbed.h" + #include "dateTime.hpp" + + #define b1 PE_12 + #define b2 PE_14 + + #define RS PD_15 //D9 + #define E PF_12 //D8 + #define d4 PF_13 //D7 + #define d5 PE_9 //D6 + #define d6 PF_14 //D4 + #define d7 PF_15 //D2 + + + #define PRESSED 1 + + extern Thread Display; + +void setValue(BYTE cycle,signed INT_32 value); +void waitForInput(); +void DisplayThread(); +void pageSelect(U_BYTE buttonValue); +void buttonActionOne(U_BYTE buttonValue); +void buttonActionTwo(U_BYTE buttonValue); +void buttonActionThree(U_BYTE buttonValue); + +void buttonISR1(); +void buttonISR2(); + +void buttonTO(); + +#endif +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu Dec 06 15:38:09 2018 +0000 @@ -0,0 +1,73 @@ +#include "mbed.h" +#include "SDReader.hpp" +#include "rtos.h" +#include "General.hpp" +#include "NetWorking.hpp" +#include "Pages.hpp" +#include "Terminal.hpp" +#include "displayThread.h" +#include "sample_buffer.hpp" +#include "dateTime.hpp" + +// Threads +Thread SDcard_THREAD; +Thread Terminal_THREAD; +Thread NetWorking_THREAD; +Thread Display; + + +int number = 22; + +char itemTestA[10]; +char itemTestB[] = "Hello"; + +// Thread ID for the Main function (CMSIS API) +osThreadId tidMain; + +//int main starts all threads then becomes TerminalThread +int main(void) +{ + //Main thread ID + //tidMain = Thread::gettid(); + + // Start each thread + //SDcard_THREAD.start(SDThread); + //Terminal_THREAD.start(TerminalThread); + //NetWorking_THREAD.start(NetWorkingThread); + //Display.start(DisplayThread); + + //NetWorkingThread(); + + + Display.start(DisplayThread); + + + + + +// struct tm test_tm; +// test_tm.tm_year = 0; +// test_tm.tm_mon = 0; +// test_tm.tm_mday = 1; +// test_tm.tm_hour = 0; +// test_tm.tm_min = 0; +// test_tm.tm_sec = 0; +// +// +// +// +// +// time_t test_time; +// +// test_tm.tm_year = 70; +// test_time = mktime(&test_tm); +// test_tm = *localtime(&test_time); +// +// printf("year = %d\n\r",test_tm.tm_year + 1900); +// printf("time = %d\n\r",test_time); + + + + while(1); +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-os.lib Thu Dec 06 15:38:09 2018 +0000 @@ -0,0 +1,1 @@ +https://github.com/ARMmbed/mbed-os/#e62a1b9236b44e70ae3b0902dc538481c04d455b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sample_buffer.cpp Thu Dec 06 15:38:09 2018 +0000 @@ -0,0 +1,58 @@ +#include "mbed.h" +#include "sample_buffer.hpp" + +//Thread sychronisation primatives +Semaphore spaceAvailable(BUFFERSIZE); +Semaphore samplesInBuffer(0); +Mutex bufferLock; + +//Output buffer +char buffer[BUFFERSIZE]; +unsigned int newestIndex = BUFFERSIZE-1; //First time it is incremented, it will be 0 +unsigned int oldestIndex = BUFFERSIZE-1; + +//Producer +void addCharacterToQueue(const char c) +{ + //Is there space? + int32_t Nspaces = spaceAvailable.wait(); + + //Ok, there is space - take the lock + bufferLock.lock(); + + //Update buffer + newestIndex = (newestIndex+1) % BUFFERSIZE; + buffer[newestIndex] = c; + //printf("\tAdded ASCII Character: %2Xh (%c) to buffer, %d spaces available\n", c, c, Nspaces-1); + + //Release lock + bufferLock.unlock(); + + //Signal that a sample has been added + samplesInBuffer.release(); +} + +//Consumer +char takeCharacterFromQueue() +{ + //Are thre any samples in the buffer + int32_t Nsamples = samplesInBuffer.wait(); + + //Ok, there are samples - take the lock + bufferLock.lock(); + + //Update buffer - remove oldest + oldestIndex = (oldestIndex+1) % BUFFERSIZE; + char cc = buffer[oldestIndex]; + //printf("\t\tTaking ASCII Character: %2Xh (%c) from buffer, %d bytes remaining\n", cc, cc, Nsamples-1); + + //Release lock + bufferLock.unlock(); + + //Signal there is space in the buffer + spaceAvailable.release(); + + //return a copy of the result + return cc; +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sample_buffer.hpp Thu Dec 06 15:38:09 2018 +0000 @@ -0,0 +1,8 @@ +#include "mbed.h" + +//Size of the morse character buffer +#define BUFFERSIZE 100 + +extern void addCharacterToQueue(const char c); +extern char takeCharacterFromQueue(); +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sd-driver.lib Thu Dec 06 15:38:09 2018 +0000 @@ -0,0 +1,1 @@ +https://github.com/ARMmbed/sd-driver/#ae7e7440054c9447f8255bdccbcc523b3f6dffe4