From 782b620cd443703bc299b45b85d96f42b160fef5 Mon Sep 17 00:00:00 2001 From: Mike C Date: Thu, 25 Apr 2013 18:10:09 -0400 Subject: [PATCH 1/3] Shuffled libraries to match current circuit/code --- .gitmodules | 3 + Libraries/Adafruit-RTClib | 1 + Libraries/ColorLCDShield/ColorLCDShield.cpp | 623 ------------------ Libraries/ColorLCDShield/ColorLCDShield.h | 384 ----------- Libraries/ColorLCDShield/keywords.txt | 28 - Libraries/Metro/Metro.cpp | 73 -- Libraries/Metro/Metro.h | 26 - Libraries/Metro/Metro.pdf | Bin 80306 -> 0 bytes Libraries/Metro/about.txt | 7 - .../Metro/examples/blinking/blinking.pde | 36 - .../Metro/examples/blinking_2_instances.zip | Bin 810 -> 0 bytes .../blinking_2_instances.pde | 51 -- .../serialInterval/serialInterval.pde | 24 - .../Libraries/Adafruit_RTClib/RTClib.cpp | 240 +++++++ .../Libraries/Adafruit_RTClib/RTClib.h | 47 ++ .../Libraries/Adafruit_RTClib}/keywords.txt | 25 +- .../Libraries/Metro/Metro.cpp | 73 -- .../Libraries/Metro/Metro.h | 26 - .../Libraries/Metro/Metro.pdf | Bin 80306 -> 0 bytes Universal_Serial_Adapter/attic/UI.cpp | 160 ----- Universal_Serial_Adapter/attic/UI.h | 27 - 21 files changed, 308 insertions(+), 1546 deletions(-) create mode 160000 Libraries/Adafruit-RTClib delete mode 100644 Libraries/ColorLCDShield/ColorLCDShield.cpp delete mode 100644 Libraries/ColorLCDShield/ColorLCDShield.h delete mode 100644 Libraries/ColorLCDShield/keywords.txt delete mode 100755 Libraries/Metro/Metro.cpp delete mode 100755 Libraries/Metro/Metro.h delete mode 100755 Libraries/Metro/Metro.pdf delete mode 100755 Libraries/Metro/about.txt delete mode 100755 Libraries/Metro/examples/blinking/blinking.pde delete mode 100644 Libraries/Metro/examples/blinking_2_instances.zip delete mode 100644 Libraries/Metro/examples/blinking_2_instances/blinking_2_instances.pde delete mode 100755 Libraries/Metro/examples/serialInterval/serialInterval.pde create mode 100644 Universal_Serial_Adapter/Libraries/Adafruit_RTClib/RTClib.cpp create mode 100644 Universal_Serial_Adapter/Libraries/Adafruit_RTClib/RTClib.h rename {Libraries/Metro => Universal_Serial_Adapter/Libraries/Adafruit_RTClib}/keywords.txt (57%) mode change 100755 => 100644 delete mode 100755 Universal_Serial_Adapter/Libraries/Metro/Metro.cpp delete mode 100755 Universal_Serial_Adapter/Libraries/Metro/Metro.h delete mode 100755 Universal_Serial_Adapter/Libraries/Metro/Metro.pdf delete mode 100644 Universal_Serial_Adapter/attic/UI.cpp delete mode 100644 Universal_Serial_Adapter/attic/UI.h diff --git a/.gitmodules b/.gitmodules index a4974dd..417f2c0 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,3 +7,6 @@ [submodule "Libraries/Adafruit-SD"] path = Libraries/Adafruit-SD url = git://github.com/adafruit/SD.git +[submodule ".\\Libraries\\Adafruit-RTClib"] + path = .\\Libraries\\Adafruit-RTClib + url = git://github.com/adafruit/RTClib.git diff --git a/Libraries/Adafruit-RTClib b/Libraries/Adafruit-RTClib new file mode 160000 index 0000000..08c0e61 --- /dev/null +++ b/Libraries/Adafruit-RTClib @@ -0,0 +1 @@ +Subproject commit 08c0e614d045f243f0d7ce46f5edbd0b3a2336fd diff --git a/Libraries/ColorLCDShield/ColorLCDShield.cpp b/Libraries/ColorLCDShield/ColorLCDShield.cpp deleted file mode 100644 index 96ceaab..0000000 --- a/Libraries/ColorLCDShield/ColorLCDShield.cpp +++ /dev/null @@ -1,623 +0,0 @@ -/* - LCDShield.cpp - Arduino Library to control a Nokia 6100 LCD, - specifically that found on SparkFun's Color LCD Shield. - This code should work for both Epson and Phillips display drivers - normally found on the Color LCD Shield. - - License: CC BY-SA 3.0: Creative Commons Share-alike 3.0. Feel free - to use and abuse this code however you'd like. If you find it useful - please attribute, and SHARE-ALIKE! - - This is based on code by Mark Sproul, and Peter Davenport. - Thanks to Coleman Sellers and Harold Timmis for help getting it to work with the Phillips Driver 7-31-2011 -*/ - -#include "ColorLCDShield.h" - -/*extern "C" { - #include "wiring.h" -}*/ - -#include "Arduino.h" - -static char x_offset = 0; -static char y_offset = 0; - -LCDShield::LCDShield() -{ - -#if defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__) - DDRB = ((1<68, 132<-69 scan direction - - LCDCommand(OSCON); // internal oscialltor ON (0xD1) - LCDCommand(SLPOUT); // sleep out (0x94) - - LCDCommand(PWRCTR); // power ctrl (0x20) - LCDData(0x0F); // everything on, no external reference resistors - - LCDCommand(DISINV); // invert display mode (0xA7) - - LCDCommand(DATCTL); // data control (0xBC) - LCDData(0x03); // Inverse page address, reverse rotation column address, column scan-direction !!! try 0x01 - LCDData(0x00); // normal RGB arrangement - LCDData(0x02); // 16-bit Grayscale Type A (12-bit color) - - LCDCommand(VOLCTR); // electronic volume, this is the contrast/brightness (0x81) - LCDData(32); // volume (contrast) setting - fine tuning, original (0-63) - LCDData(3); // internal resistor ratio - coarse adjustment (0-7) - - LCDCommand(NOP); // nop (0x25) - - delay(100); - - LCDCommand(DISON); // display on (0xAF) - } - else if (driver == PHILIPS) - { - LCDCommand(SLEEPOUT); // Sleep Out (0x11) - LCDCommand(BSTRON); // Booster voltage on (0x03) - LCDCommand(DISPON); // Display on (0x29) - - //LCDCommand(INVON); // Inversion on (0x20) - - // 12-bit color pixel format: - LCDCommand(COLMOD); // Color interface format (0x3A) - LCDData(0x03); // 0b011 is 12-bit/pixel mode - - LCDCommand(MADCTL); // Memory Access Control(PHILLIPS) - if (colorSwap) - LCDData(0x08); - else - LCDData(0x00); - - LCDCommand(SETCON); // Set Contrast(PHILLIPS) - LCDData(0x30); - - LCDCommand(NOPP); // nop(PHILLIPS) - } -} - -void LCDShield::clear(int color) -{ - if (driver) // if it's an Epson - { - LCDCommand(PASET); - LCDData(0); - LCDData(131); - - LCDCommand(CASET); - LCDData(0); - LCDData(131); - - LCDCommand(RAMWR); - } - else // otherwise it's a phillips - { - LCDCommand(PASETP); - LCDData(0); - LCDData(131); - - LCDCommand(CASETP); - LCDData(0); - LCDData(131); - - LCDCommand(RAMWRP); - } - - for(unsigned int i=0; i < (131*131)/2; i++) - { - LCDData((color>>4)&0x00FF); - LCDData(((color&0x0F)<<4)|(color>>8)); - LCDData(color&0x0FF); - } - - x_offset = 0; - y_offset = 0; -} - -void LCDShield::contrast(char setting) -{ - if (driver == EPSON) - { - setting &= 0x3F; // 2 msb's not used, mask out - LCDCommand(VOLCTR); // electronic volume, this is the contrast/brightness(EPSON) - LCDData(setting); // volume (contrast) setting - course adjustment, -- original was 24 - LCDData(3); // TODO: Make this coarse adjustment variable, 3's a good place to stay - } - else if (driver == PHILIPS) - { - setting &= 0x7F; // msb is not used, mask it out - LCDCommand(SETCON); // contrast command (PHILLIPS) - LCDData(setting); // volume (contrast) setting - course adjustment, -- original was 24 - } -} - -// Added by Steve Sparks @ Big Nerd Ranch. -// This swaps the Epson RGB order into the Philips RGB order. (Or, vice versa, I suppose.) -uint16_t LCDShield::swapColors(uint16_t in) { - return ((in & 0x000F)<<8)|(in & 0x00F0)|((in & 0x0F00)>>8); -} - -void LCDShield::setPixel(int color, unsigned char x, unsigned char y) -{ - y = (COL_HEIGHT - 1) - y; - x = (ROW_LENGTH - 1) - x; - - if (driver == EPSON) // if it's an epson - { - LCDCommand(PASET); // page start/end ram - LCDData(x); - LCDData(ENDPAGE); - - LCDCommand(CASET); // column start/end ram - LCDData(y); - LCDData(ENDCOL); - - LCDCommand(RAMWR); // write - LCDData((color>>4)&0x00FF); - LCDData(((color&0x0F)<<4)|(color>>8)); - LCDData(color&0x0FF); - } - else if (driver == PHILIPS) // otherwise it's a phillips - { - LCDCommand(PASETP); // page start/end ram - LCDData(x); - LCDData(x); - - LCDCommand(CASETP); // column start/end ram - LCDData(y); - LCDData(y); - - LCDCommand(RAMWRP); // write - - LCDData((unsigned char)((color>>4)&0x00FF)); - LCDData((unsigned char)(((color&0x0F)<<4)|0x00)); - } -} -// 2/18/2013 This Methos added by Tony Contrada in order to create arc segments in varied line thickness, or Filled -void LCDShield::setArc(int x0, int y0, int radius, int arcSegments[], int numSegments, int lineThickness, int color) -{ - //Line Thickness (Num Pixels) - if(lineThickness == FILL) lineThickness = radius; - for(int i = 0; i < lineThickness; i++) - { - int f = 1 - radius; - int ddF_x = 0; - int ddF_y = -2 * radius; - int x = 0; - int y = radius; - while(x < y) - { - if(f >= 0) - { - y--; - ddF_y += 2; - f += ddF_y; - } - x++; - ddF_x += 2; - f += ddF_x + 1; - - for(int i = 0; i < numSegments; i++) - { - if(arcSegments[i] == NNE) setPixel(color, x0 - y, y0 + x); //SHOW NNE - if(arcSegments[i] == ENE) setPixel(color, x0 - x, y0 + y); //SHOW ENE - if(arcSegments[i] == ESE) setPixel(color, x0 + x, y0 + y); //SHOW ESE - if(arcSegments[i] == SSE) setPixel(color, x0 + y, y0 + x); //SHOW SSE - if(arcSegments[i] == SSW) setPixel(color, x0 + y, y0 - x); //SHOW SSW - if(arcSegments[i] == WSW) setPixel(color, x0 + x, y0 - y); //SHOW WSW - if(arcSegments[i] == WNW) setPixel(color, x0 - x, y0 - y); //SHOW WNW - if(arcSegments[i] == NNW) setPixel(color, x0 - y, y0 - x); //SHOW NNW - } - - } - radius--; - } - -} - -// 2/22/2013 - Modified by Tony Contrada to include Line Thickness (in pixels) or a Filled Circle -void LCDShield::setCircle (int x0, int y0, int radius, int color, int lineThickness) -{ - if(lineThickness == FILL) lineThickness = radius; - - for(int r = 0; r < lineThickness; r++) - { - int f = 1 - radius; - int ddF_x = 0; - int ddF_y = -2 * radius; - int x = 0; - int y = radius; - - setPixel(color, x0, y0 + radius); - setPixel(color, x0, y0 - radius); - setPixel(color, x0 + radius, y0); - setPixel(color, x0 - radius, y0); - - while(x < y) - { - if(f >= 0) - { - y--; - ddF_y += 2; - f += ddF_y; - } - x++; - ddF_x += 2; - f += ddF_x + 1; - - setPixel(color, x0 + x, y0 + y); - setPixel(color, x0 - x, y0 + y); - setPixel(color, x0 + x, y0 - y); - setPixel(color, x0 - x, y0 - y); - setPixel(color, x0 + y, y0 + x); - setPixel(color, x0 - y, y0 + x); - setPixel(color, x0 + y, y0 - x); - setPixel(color, x0 - y, y0 - x); - } - radius--; - } - -} - -void LCDShield::setChar(char c, int x, int y, int fColor, int bColor) -{ - y = (COL_HEIGHT - 1) - y; // make display "right" side up - x = (ROW_LENGTH - 2) - x; - - int i,j; - unsigned int nCols; - unsigned int nRows; - unsigned int nBytes; - unsigned char PixelRow; - unsigned char Mask; - unsigned int Word0; - unsigned int Word1; - unsigned char *pFont; - unsigned char *pChar; - - // get pointer to the beginning of the selected font table - pFont = (unsigned char *)FONT8x16; - // get the nColumns, nRows and nBytes - nCols = *pFont; - nRows = *(pFont + 1); - nBytes = *(pFont + 2); - // get pointer to the last byte of the desired character - pChar = pFont + (nBytes * (c - 0x1F)) + nBytes - 1; - - if (driver) // if it's an epson - { - // Row address set (command 0x2B) - LCDCommand(PASET); - LCDData(x); - LCDData(x + nRows - 1); - // Column address set (command 0x2A) - LCDCommand(CASET); - LCDData(y); - LCDData(y + nCols - 1); - - // WRITE MEMORY - LCDCommand(RAMWR); - // loop on each row, working backwards from the bottom to the top - for (i = nRows - 1; i >= 0; i--) { - // copy pixel row from font table and then decrement row - PixelRow = *pChar++; - // loop on each pixel in the row (left to right) - // Note: we do two pixels each loop - Mask = 0x80; - for (j = 0; j < nCols; j += 2) - { - // if pixel bit set, use foreground color; else use the background color - // now get the pixel color for two successive pixels - if ((PixelRow & Mask) == 0) - Word0 = bColor; - else - Word0 = fColor; - Mask = Mask >> 1; - if ((PixelRow & Mask) == 0) - Word1 = bColor; - else - Word1 = fColor; - Mask = Mask >> 1; - // use this information to output three data bytes - LCDData((Word0 >> 4) & 0xFF); - LCDData(((Word0 & 0xF) << 4) | ((Word1 >> 8) & 0xF)); - LCDData(Word1 & 0xFF); - } - } - } - else - { - fColor = swapColors(fColor); - bColor = swapColors(bColor); - - // Row address set (command 0x2B) - LCDCommand(PASETP); - LCDData(x); - LCDData(x + nRows - 1); - // Column address set (command 0x2A) - LCDCommand(CASETP); - LCDData(y); - LCDData(y + nCols - 1); - - // WRITE MEMORY - LCDCommand(RAMWRP); - // loop on each row, working backwards from the bottom to the top - pChar+=nBytes-1; // stick pChar at the end of the row - gonna reverse print on phillips - for (i = nRows - 1; i >= 0; i--) { - // copy pixel row from font table and then decrement row - PixelRow = *pChar--; - // loop on each pixel in the row (left to right) - // Note: we do two pixels each loop - Mask = 0x01; // <- opposite of epson - for (j = 0; j < nCols; j += 2) - { - // if pixel bit set, use foreground color; else use the background color - // now get the pixel color for two successive pixels - if ((PixelRow & Mask) == 0) - Word0 = bColor; - else - Word0 = fColor; - Mask = Mask << 1; // <- opposite of epson - if ((PixelRow & Mask) == 0) - Word1 = bColor; - else - Word1 = fColor; - Mask = Mask << 1; // <- opposite of epson - // use this information to output three data bytes - LCDData((Word0 >> 4) & 0xFF); - LCDData(((Word0 & 0xF) << 4) | ((Word1 >> 8) & 0xF)); - LCDData(Word1 & 0xFF); - } - } - } -} - - -void LCDShield::setStr(char *pString, int x, int y, int fColor, int bColor) -{ - x = x + 16; - y = y + 8; - int originalY = y; - - // loop until null-terminator is seen - while (*pString != 0x00) { - // draw the character - setChar(*pString++, x, y, fColor, bColor); - // advance the y position - y = y + 8; - // bail out if y exceeds 131 - if (y > 131) { - x = x + 16; - y = originalY; - } - if (x > 123) break; - } -} - -void LCDShield::setLine(int x0, int y0, int x1, int y1, int color) -{ - int dy = y1 - y0; // Difference between y0 and y1 - int dx = x1 - x0; // Difference between x0 and x1 - int stepx, stepy; - - if (dy < 0) - { - dy = -dy; - stepy = -1; - } - else - stepy = 1; - - if (dx < 0) - { - dx = -dx; - stepx = -1; - } - else - stepx = 1; - - dy <<= 1; // dy is now 2*dy - dx <<= 1; // dx is now 2*dx - setPixel(color, x0, y0); - - if (dx > dy) - { - int fraction = dy - (dx >> 1); - while (x0 != x1) - { - if (fraction >= 0) - { - y0 += stepy; - fraction -= dx; - } - x0 += stepx; - fraction += dy; - setPixel(color, x0, y0); - } - } - else - { - int fraction = dx - (dy >> 1); - while (y0 != y1) - { - if (fraction >= 0) - { - x0 += stepx; - fraction -= dy; - } - y0 += stepy; - fraction += dx; - setPixel(color, x0, y0); - } - } -} - -void LCDShield::setRect(int x0, int y0, int x1, int y1, unsigned char fill, int color) -{ - // check if the rectangle is to be filled - if (fill == 1) - { - int xDiff; - - if(x0 > x1) - xDiff = x0 - x1; //Find the difference between the x vars - else - xDiff = x1 - x0; - - while(xDiff > 0) - { - setLine(x0, y0, x0, y1, color); - - if(x0 > x1) - x0--; - else - x0++; - - xDiff--; - } - - } - else - { - // best way to draw an unfilled rectangle is to draw four lines - setLine(x0, y0, x1, y0, color); - setLine(x0, y1, x1, y1, color); - setLine(x0, y0, x0, y1, color); - setLine(x1, y0, x1, y1, color); - } -} - -void LCDShield::printLogo(void) -{ - int x = 4, y = 25, logo_ix = 0, z; - char logo; - - for (logo_ix = 0; logo_ix < 1120; logo_ix++) - { - logo = logo_spark[logo_ix]; - for (z = 0; z < 8; z++) - { - if ((logo & 0x80) == 0x80) setPixel(RED, y, x); - x++; - if (x == 132) - { - x = 4; - y++; - } - logo <<= 1; - } - } -} - -void LCDShield::off(void) -{ - if (driver) // If it's an epson - LCDCommand(DISOFF); - else // otherwise it's a phillips - LCDCommand(DISPOFF); -} - -void LCDShield::on(void) -{ - if (driver) // If it's an epson - LCDCommand(DISON); - else // otherwise it's a phillips - LCDCommand(DISPON); -} - diff --git a/Libraries/ColorLCDShield/ColorLCDShield.h b/Libraries/ColorLCDShield/ColorLCDShield.h deleted file mode 100644 index 8af59ef..0000000 --- a/Libraries/ColorLCDShield/ColorLCDShield.h +++ /dev/null @@ -1,384 +0,0 @@ -/* - ColorLCDShield.h - Arduino Library to control a Nokia 6100 LCD, - specifically that found on SparkFun's Color LCD Shield. - This code should work for both Epson and Phillips display drivers - normally found on the Color LCD Shield. - - License: CC BY-SA 3.0: Creative Commons Share-alike 3.0. Feel free - to use and abuse this code however you'd like. If you find it useful - please attribute, and SHARE-ALIKE! - - This is based on code by Mark Sproul, and Peter Davenport. -*/ - -#ifndef ColorLCDShield_H -#define ColorLCDShield_H - -#define PHILLIPS 0 -#define PHILIPS 0 -#define EPSON 1 - -//#include - -#include - -//******************************************************* -// Macros -//******************************************************* -#define sbi(var, mask) ((var) |= (uint8_t)(1 << mask)) -#define cbi(var, mask) ((var) &= (uint8_t)~(1 << mask)) - -//******************************************************************** -// -// LCD Dimension Definitions -// -//******************************************************************** -#define ROW_LENGTH 132 -#define COL_HEIGHT 132 -#define ENDPAGE 132 -#define ENDCOL 130 - -//******************************************************************** -// -// EPSON Controller Definitions -// -//******************************************************************** -#define DISON 0xAF // Display on -#define DISOFF 0xAE // Display off -#define DISNOR 0xA6 // Normal display -#define DISINV 0xA7 // Inverse display -#define SLPIN 0x95 // Sleep in -#define SLPOUT 0x94 // Sleep out -#define COMSCN 0xBB // Common scan direction -#define DISCTL 0xCA // Display control -#define PASET 0x75 // Page address set -#define CASET 0x15 // Column address set -#define DATCTL 0xBC // Data scan direction, etc. -#define RGBSET8 0xCE // 256-color position set -#define RAMWR 0x5C // Writing to memory -#define RAMRD 0x5D // Reading from memory -#define PTLIN 0xA8 // Partial display in -#define PTLOUT 0xA9 // Partial display out -#define RMWIN 0xE0 // Read and modify write -#define RMWOUT 0xEE // End -#define ASCSET 0xAA // Area scroll set -#define SCSTART 0xAB // Scroll start set -#define OSCON 0xD1 // Internal oscillation on -#define OSCOFF 0xD2 // Internal osciallation off -#define PWRCTR 0x20 // Power control -#define VOLCTR 0x81 // Electronic volume control -#define VOLUP 0xD6 // Increment electronic control by 1 -#define VOLDOWN 0xD7 // Decrement electronic control by 1 -#define TMPGRD 0x82 // Temperature gradient set -#define EPCTIN 0xCD // Control EEPROM -#define EPCOUT 0xCC // Cancel EEPROM control -#define EPMWR 0xFC // Write into EEPROM -#define EPMRD 0xFD // Read from EEPROM -#define EPSRRD1 0x7C // Read register 1 -#define EPSRRD2 0x7D // Read register 2 -#define NOP 0x25 // No op - -//******************************************************************** -// -// PHILLIPS Controller Definitions -// -//******************************************************************** -//LCD Commands -#define NOPP 0x00 // No operation -#define BSTRON 0x03 // Booster voltage on -#define SLEEPIN 0x10 // Sleep in -#define SLEEPOUT 0x11 // Sleep out -#define NORON 0x13 // Normal display mode on -#define INVOFF 0x20 // Display inversion off -#define INVON 0x21 // Display inversion on -#define SETCON 0x25 // Set contrast -#define DISPOFF 0x28 // Display off -#define DISPON 0x29 // Display on -#define CASETP 0x2A // Column address set -#define PASETP 0x2B // Page address set -#define RAMWRP 0x2C // Memory write -#define RGBSET 0x2D // Color set -#define MADCTL 0x36 // Memory data access control -#define COLMOD 0x3A // Interface pixel format -#define DISCTR 0xB9 // Super frame inversion -#define EC 0xC0 // Internal or external oscillator - -//******************************************************* -// 12-Bit Color Definitions -//******************************************************* -#define BLACK 0x000 -#define NAVY 0x008 -#define BLUE 0x00F -#define TEAL 0x088 -#define EMERALD 0x0C5 -#define GREEN 0x0F0 -#define CYAN 0x0FF -#define SLATE 0x244 -#define INDIGO 0x408 -#define TURQUOISE 0x4ED -#define OLIVE 0x682 -#define MAROON 0x800 -#define PURPLE 0x808 -#define GRAY 0x888 -#define SKYBLUE 0x8CE -#define BROWN 0xB22 -#define CRIMSON 0xD13 -#define ORCHID 0xD7D -#define RED 0xF00 -#define MAGENTA 0xF0F -#define ORANGE 0xF40 -#define PINK 0xF6A -#define CORAL 0xF75 -#define SALMON 0xF87 -#define GOLD 0xFD0 -#define YELLOW 0xFF0 -#define WHITE 0xFFF - -//******************************************************* -// Circle Definitions -//******************************************************* -#define FILL 0 - -//****************************************************** -// Arc Definitions -//****************************************************** -#define ESE 1 -#define ENE 2 -#define WSW 3 -#define WNW 4 -#define SSE 5 -#define NNE 6 -#define SSW 7 -#define NNW 8 - -#if defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__) - //* Arduino Mega 2560 bit numbers - #define LCD_RES 5 // D8 - #define CS 6 // D9 - #define DIO 5 // D11 - #define SCK_PIN 7 // D13 - - //* Arduino Mega ports - //* NOTE: See LCDShield::LCDShield() if making changes here - #define LCD_PORT_CS PORTH - #define LCD_PORT_SCK PORTB - #define LCD_PORT_RES PORTH - #define LCD_PORT_DIO PORTB -#elif defined (__AVR_ATmega32U4__) - //* Standard Arduino Leonardo port bits - #define LCD_RES 4 // D8 - #define CS 5 // D9 - #define DIO 7 // D11 - #define SCK_PIN 7 // D13 - - //* Arduino Leonardo ports: - #define LCD_PORT_RES PORTB - #define LCD_PORT_CS PORTB - #define LCD_PORT_DIO PORTB - #define LCD_PORT_SCK PORTC -#else - //* Arduino Duemilanove bit numbers - #define LCD_RES 0 // D8 - #define CS 1 // D9 - #define DIO 3 // D11 - #define SCK_PIN 5 // D13 - //#define LCD_PORT PORTB - - //* Arduino Duemilanove ports - #define LCD_PORT_CS PORTB - #define LCD_PORT_SCK PORTB - #define LCD_PORT_RES PORTB - #define LCD_PORT_DIO PORTB -#endif - -const unsigned char FONT8x16[97][16] = { -{0x08,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // columns, rows, bytes, ... -{0x08,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // columns, rows, bytes, ... -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // ' ' -{0x00,0x00,0x18,0x3C,0x3C,0x3C,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00}, // '!' -{0x00,0x63,0x63,0x63,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // '"' -{0x00,0x00,0x00,0x36,0x36,0x7F,0x36,0x36,0x36,0x7F,0x36,0x36,0x00,0x00,0x00,0x00}, // '#' -{0x0C,0x0C,0x3E,0x63,0x61,0x60,0x3E,0x03,0x03,0x43,0x63,0x3E,0x0C,0x0C,0x00,0x00}, // '$' -{0x00,0x00,0x00,0x00,0x00,0x61,0x63,0x06,0x0C,0x18,0x33,0x63,0x00,0x00,0x00,0x00}, // '%' -{0x00,0x00,0x00,0x1C,0x36,0x36,0x1C,0x3B,0x6E,0x66,0x66,0x3B,0x00,0x00,0x00,0x00}, -{0x00,0x30,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x0C,0x18,0x18,0x30,0x30,0x30,0x30,0x18,0x18,0x0C,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x18,0x0C,0x0C,0x06,0x06,0x06,0x06,0x0C,0x0C,0x18,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x00,0x00,0x42,0x66,0x3C,0xFF,0x3C,0x66,0x42,0x00,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x00,0x00,0x18,0x18,0x18,0xFF,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x00,0x00}, -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x01,0x03,0x07,0x0E,0x1C,0x38,0x70,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x3E,0x63,0x63,0x63,0x6B,0x6B,0x63,0x63,0x63,0x3E,0x00,0x00,0x00,0x00}, // '0' -{0x00,0x00,0x0C,0x1C,0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3F,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x3E,0x63,0x03,0x06,0x0C,0x18,0x30,0x61,0x63,0x7F,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x3E,0x63,0x03,0x03,0x1E,0x03,0x03,0x03,0x63,0x3E,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x06,0x0E,0x1E,0x36,0x66,0x66,0x7F,0x06,0x06,0x0F,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x7F,0x60,0x60,0x60,0x7E,0x03,0x03,0x63,0x73,0x3E,0x00,0x00,0x00,0x00}, // '5' -{0x00,0x00,0x1C,0x30,0x60,0x60,0x7E,0x63,0x63,0x63,0x63,0x3E,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x7F,0x63,0x03,0x06,0x06,0x0C,0x0C,0x18,0x18,0x18,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x3E,0x63,0x63,0x63,0x3E,0x63,0x63,0x63,0x63,0x3E,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x3E,0x63,0x63,0x63,0x63,0x3F,0x03,0x03,0x06,0x3C,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00}, // ':' -{0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x00,0x00}, -{0x00,0x00,0x00,0x06,0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x06,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x00,0x60,0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x60,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x3E,0x63,0x63,0x06,0x0C,0x0C,0x0C,0x00,0x0C,0x0C,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x3E,0x63,0x63,0x6F,0x6B,0x6B,0x6E,0x60,0x60,0x3E,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x08,0x1C,0x36,0x63,0x63,0x63,0x7F,0x63,0x63,0x63,0x00,0x00,0x00,0x00}, // 'A' -{0x00,0x00,0x7E,0x33,0x33,0x33,0x3E,0x33,0x33,0x33,0x33,0x7E,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x1E,0x33,0x61,0x60,0x60,0x60,0x60,0x61,0x33,0x1E,0x00,0x00,0x00,0x00}, // 'C' -{0x00,0x00,0x7C,0x36,0x33,0x33,0x33,0x33,0x33,0x33,0x36,0x7C,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x7F,0x33,0x31,0x34,0x3C,0x34,0x30,0x31,0x33,0x7F,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x7F,0x33,0x31,0x34,0x3C,0x34,0x30,0x30,0x30,0x78,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x1E,0x33,0x61,0x60,0x60,0x6F,0x63,0x63,0x37,0x1D,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x63,0x63,0x63,0x63,0x7F,0x63,0x63,0x63,0x63,0x63,0x00,0x00,0x00,0x00}, // 'H' -{0x00,0x00,0x3C,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x0F,0x06,0x06,0x06,0x06,0x06,0x06,0x66,0x66,0x3C,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x73,0x33,0x36,0x36,0x3C,0x36,0x36,0x33,0x33,0x73,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x33,0x7F,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x63,0x77,0x7F,0x6B,0x63,0x63,0x63,0x63,0x63,0x63,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x63,0x63,0x73,0x7B,0x7F,0x6F,0x67,0x63,0x63,0x63,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x1C,0x36,0x63,0x63,0x63,0x63,0x63,0x63,0x36,0x1C,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x7E,0x33,0x33,0x33,0x3E,0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x3E,0x63,0x63,0x63,0x63,0x63,0x63,0x6B,0x6F,0x3E,0x06,0x07,0x00,0x00}, -{0x00,0x00,0x7E,0x33,0x33,0x33,0x3E,0x36,0x36,0x33,0x33,0x73,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x3E,0x63,0x63,0x30,0x1C,0x06,0x03,0x63,0x63,0x3E,0x00,0x00,0x00,0x00}, -{0x00,0x00,0xFF,0xDB,0x99,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x3E,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x36,0x1C,0x08,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x6B,0x6B,0x7F,0x36,0x36,0x00,0x00,0x00,0x00}, -{0x00,0x00,0xC3,0xC3,0x66,0x3C,0x18,0x18,0x3C,0x66,0xC3,0xC3,0x00,0x00,0x00,0x00}, -{0x00,0x00,0xC3,0xC3,0xC3,0x66,0x3C,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x7F,0x63,0x43,0x06,0x0C,0x18,0x30,0x61,0x63,0x7F,0x00,0x00,0x00,0x00}, // 'Z' -{0x00,0x00,0x3C,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3C,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x80,0xC0,0xE0,0x70,0x38,0x1C,0x0E,0x07,0x03,0x01,0x00,0x00,0x00,0x00}, // '\' -{0x00,0x00,0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00,0x00,0x00,0x00}, -{0x08,0x1C,0x36,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00}, // '^' -{0x18,0x18,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x00,0x00,0x00,0x3C,0x46,0x06,0x3E,0x66,0x66,0x3B,0x00,0x00,0x00,0x00}, // '_' -{0x00,0x00,0x70,0x30,0x30,0x3C,0x36,0x33,0x33,0x33,0x33,0x6E,0x00,0x00,0x00,0x00}, // '`' -{0x00,0x00,0x00,0x00,0x00,0x3E,0x63,0x60,0x60,0x60,0x63,0x3E,0x00,0x00,0x00,0x00}, // 'a' -{0x00,0x00,0x0E,0x06,0x06,0x1E,0x36,0x66,0x66,0x66,0x66,0x3B,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x00,0x00,0x00,0x3E,0x63,0x63,0x7E,0x60,0x63,0x3E,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x1C,0x36,0x32,0x30,0x7C,0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x00,0x00,0x00,0x3B,0x66,0x66,0x66,0x66,0x3E,0x06,0x66,0x3C,0x00,0x00}, -{0x00,0x00,0x70,0x30,0x30,0x36,0x3B,0x33,0x33,0x33,0x33,0x73,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x0C,0x0C,0x00,0x1C,0x0C,0x0C,0x0C,0x0C,0x0C,0x1E,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x06,0x06,0x00,0x0E,0x06,0x06,0x06,0x06,0x06,0x66,0x66,0x3C,0x00,0x00}, -{0x00,0x00,0x70,0x30,0x30,0x33,0x33,0x36,0x3C,0x36,0x33,0x73,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x1C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x1E,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x00,0x00,0x00,0x6E,0x7F,0x6B,0x6B,0x6B,0x6B,0x6B,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x00,0x00,0x00,0x6E,0x33,0x33,0x33,0x33,0x33,0x33,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x00,0x00,0x00,0x3E,0x63,0x63,0x63,0x63,0x63,0x3E,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x00,0x00,0x00,0x6E,0x33,0x33,0x33,0x33,0x3E,0x30,0x30,0x78,0x00,0x00}, -{0x00,0x00,0x00,0x00,0x00,0x3B,0x66,0x66,0x66,0x66,0x3E,0x06,0x06,0x0F,0x00,0x00}, -{0x00,0x00,0x00,0x00,0x00,0x6E,0x3B,0x33,0x30,0x30,0x30,0x78,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x00,0x00,0x00,0x3E,0x63,0x38,0x0E,0x03,0x63,0x3E,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x08,0x18,0x18,0x7E,0x18,0x18,0x18,0x18,0x1B,0x0E,0x00,0x00,0x00,0x00}, // 't' -{0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x66,0x3B,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x36,0x36,0x1C,0x1C,0x08,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x63,0x6B,0x6B,0x7F,0x36,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x00,0x00,0x00,0x63,0x36,0x1C,0x1C,0x1C,0x36,0x63,0x00,0x00,0x00,0x00}, -{0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x3F,0x03,0x06,0x3C,0x00,0x00}, -{0x00,0x00,0x00,0x00,0x00,0x7F,0x66,0x0C,0x18,0x30,0x63,0x7F,0x00,0x00,0x00,0x00}, // 'z' -{0x00,0x00,0x0E,0x18,0x18,0x18,0x70,0x18,0x18,0x18,0x18,0x0E,0x00,0x00,0x00,0x00}, // '{' -{0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x00,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00}, // '|' -{0x00,0x00,0x70,0x18,0x18,0x18,0x0E,0x18,0x18,0x18,0x18,0x70,0x00,0x00,0x00,0x00}, // '}' -{0x00,0x00,0x3B,0x6E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00} // '~' -}; - -static char logo_spark[1120] = { -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x80,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x80,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x3f,0xc0,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x3f,0xc0,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x7f,0xc0,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x20,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x0f,0xe0,0x9f,0x01,0xfc,0x09,0x9e,0x1e,0x7f,0x70,0x73,0x9f,0x00,0x00,0x00,0x00, -0x3f,0xf1,0xff,0x87,0xfe,0x3f,0xde,0x3d,0xff,0x78,0xf3,0xff,0x80,0x00,0x00,0x00, -0x3c,0xf9,0xff,0xc7,0xdf,0x3f,0xde,0x79,0xff,0x78,0xf3,0xff,0xc0,0x00,0x00,0x00, -0x78,0x79,0xc3,0xcf,0x0f,0x3f,0x1c,0xf0,0x3c,0x78,0xf3,0xe3,0xc0,0x00,0x00,0x00, -0x7c,0x01,0xc1,0xe0,0x0f,0x3e,0x1f,0xe0,0x3c,0x78,0xf3,0xc3,0xc0,0x00,0x00,0x00, -0x3f,0xc1,0x81,0xe0,0x3f,0x3c,0x1f,0xe0,0x3c,0x78,0xf3,0xc1,0xc0,0x00,0x00,0x00, -0x1f,0xf1,0x81,0xe3,0xff,0x3c,0x1f,0xe0,0x3c,0x78,0xf3,0xc1,0xc0,0x00,0x00,0x00, -0x07,0xf9,0x81,0xe7,0xef,0x3c,0x1f,0xf0,0x3c,0x78,0xf3,0xc1,0xc0,0x00,0x00,0x00, -0x00,0xf9,0x81,0xef,0x07,0x3c,0x1e,0xf8,0x3c,0x78,0xf3,0xc1,0xc0,0x00,0x00,0x00, -0x78,0x79,0xc1,0xef,0x0f,0x3c,0x1e,0x78,0x3c,0x78,0xf3,0xc1,0xc0,0x00,0x00,0x00, -0x78,0x79,0xe3,0xcf,0x0f,0x3c,0x1e,0x3c,0x3c,0x7c,0xf3,0xc1,0xc0,0x00,0x00,0x00, -0x3f,0xf9,0xff,0xcf,0xff,0x3c,0x1e,0x3e,0x3c,0x7f,0xf3,0xc1,0xcf,0x00,0x00,0x00, -0x1f,0xf1,0xff,0x87,0xff,0x3c,0x1e,0x1e,0x3c,0x3f,0xf3,0xc1,0xc7,0x00,0x00,0x00, -0x07,0xc1,0x9e,0x03,0xe0,0x00,0x00,0x02,0x00,0x0e,0x20,0x00,0x00,0x00,0x00,0x00, -0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x03,0x80,0x00,0x00,0x00,0xc0,0x00,0x00,0x18,0x00,0x00,0x08,0x08,0x00,0x00, -0x00,0x01,0x87,0xc3,0x03,0xe0,0xe1,0xf0,0xf8,0x3e,0x33,0x08,0x3e,0x1e,0x00,0x00, -0x00,0x01,0x86,0x03,0x03,0x01,0xb0,0xe0,0xdc,0x66,0x3b,0x08,0x66,0x32,0x00,0x00, -0x00,0x00,0x87,0xc3,0x03,0xe1,0x80,0x40,0xd8,0x63,0x3b,0x08,0x60,0x3c,0x00,0x00, -0x00,0x00,0x87,0x83,0x03,0xc1,0x80,0x40,0xf8,0x63,0x3f,0x08,0x60,0x0e,0x00,0x00, -0x00,0x00,0x06,0x03,0x03,0x01,0xb0,0x40,0xd8,0x66,0x37,0x08,0x66,0x32,0x00,0x00, -0x00,0x00,0x07,0xc3,0xe3,0xe0,0xe0,0x40,0xc8,0x3e,0x33,0x08,0x3e,0x3e,0x00,0x00, -0x00,0x00,0x07,0xc3,0xe3,0xe0,0xe0,0x40,0x88,0x3c,0x33,0x08,0x3c,0x1e,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; - -class LCDShield -{ -private: - void LCDCommand(unsigned char data); - void LCDData(unsigned char data); - uint8_t driver; - uint16_t swapColors(uint16_t in); -public: - LCDShield(); - - void init(int type, bool colorSwap = 0); - void clear(int color); - void contrast(char setting); - - void setPixel(int color, unsigned char x, unsigned char y); - void setCircle (int x0, int y0, int radius, int color, int lineThickness = 1); - void setArc(int x0, int y0, int radius, int segments[], int numSegments, int lineThickness, int color); - - void setChar(char c, int x, int y, int fColor, int bColor); - void setStr(char *pString, int x, int y, int fColor, int bColor); - - - void setLine(int x0, int y0, int x1, int y1, int color); - void setRect(int x0, int y0, int x1, int y1, unsigned char fill, int color); - - void printLogo(void); - - void on(void); - void off(void); -}; - -#endif // ColorLCDShield_H diff --git a/Libraries/ColorLCDShield/keywords.txt b/Libraries/ColorLCDShield/keywords.txt deleted file mode 100644 index a67f143..0000000 --- a/Libraries/ColorLCDShield/keywords.txt +++ /dev/null @@ -1,28 +0,0 @@ -####################################### -# Syntax Coloring Map For Twitter -####################################### - -####################################### -# Datatypes (KEYWORD1) -####################################### - -LCDShield KEYWORD1 - -####################################### -# Methods and Functions (KEYWORD2) -####################################### - -init KEYWORD2 -clear KEYWORD2 -contrast KEYWORD2 -setPixel KEYWORD2 -setChar KEYWORD2 -setStr KEYWORD2 -setLine KEYWORD2 -setRect KEYWORD2 -setCircle KEYWORD2 -setArc KEYWORD2 - -####################################### -# Constants (LITERAL1) -####################################### diff --git a/Libraries/Metro/Metro.cpp b/Libraries/Metro/Metro.cpp deleted file mode 100755 index 3d13747..0000000 --- a/Libraries/Metro/Metro.cpp +++ /dev/null @@ -1,73 +0,0 @@ - -#if defined(ARDUINO) && ARDUINO >= 100 -#include "Arduino.h" -#else -#include "WProgram.h" -#endif -#include "Metro.h" - - -Metro::Metro(unsigned long interval_millis) -{ - this->autoreset = 0; - interval(interval_millis); - reset(); -} - -// New creator so I can use either the original check behavior or benjamin.soelberg's -// suggested one (see below). -// autoreset = 0 is benjamin.soelberg's check behavior -// autoreset != 0 is the original behavior - -Metro::Metro(unsigned long interval_millis, uint8_t autoreset) -{ - this->autoreset = autoreset; // Fix by Paul Bouchier - interval(interval_millis); - reset(); -} - -void Metro::interval(unsigned long interval_millis) -{ - this->interval_millis = interval_millis; -} - -// Benjamin.soelberg's check behavior: -// When a check is true, add the interval to the internal counter. -// This should guarantee a better overall stability. - -// Original check behavior: -// When a check is true, add the interval to the current millis() counter. -// This method can add a certain offset over time. - -char Metro::check() -{ - if (millis() - this->previous_millis >= this->interval_millis) { - // As suggested by benjamin.soelberg@gmail.com, the following line - // this->previous_millis = millis(); - // was changed to - // this->previous_millis += this->interval_millis; - - // If the interval is set to 0 we revert to the original behavior - if (this->interval_millis <= 0 || this->autoreset ) { - this->previous_millis = millis(); - } else { - this->previous_millis += this->interval_millis; - } - - return 1; - } - - - - return 0; - -} - -void Metro::reset() -{ - - this->previous_millis = millis(); - -} - - diff --git a/Libraries/Metro/Metro.h b/Libraries/Metro/Metro.h deleted file mode 100755 index cb21776..0000000 --- a/Libraries/Metro/Metro.h +++ /dev/null @@ -1,26 +0,0 @@ - - -#ifndef Metro_h -#define Metro_h - -#include - -class Metro -{ - -public: - Metro(unsigned long interval_millis); - Metro(unsigned long interval_millis, uint8_t autoreset); - void interval(unsigned long interval_millis); - char check(); - void reset(); - -private: - uint8_t autoreset; - unsigned long previous_millis, interval_millis; - -}; - -#endif - - diff --git a/Libraries/Metro/Metro.pdf b/Libraries/Metro/Metro.pdf deleted file mode 100755 index f42f502ed22b7cdf7ebbffb2b338d4c9ce3f4c91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80306 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 lI`JLY&NMpj?-2_L;GG5)E>zautoreset = 0; to Metro(unsigned long interval_millis) as suggested by Paul Bouchier - -VERSION 2.3.1 - -¥ Updated for Arduino 1.0 \ No newline at end of file diff --git a/Libraries/Metro/examples/blinking/blinking.pde b/Libraries/Metro/examples/blinking/blinking.pde deleted file mode 100755 index d6f9a70..0000000 --- a/Libraries/Metro/examples/blinking/blinking.pde +++ /dev/null @@ -1,36 +0,0 @@ -/* - This code will blink an LED attached to pin 13 on and off. - It will stay on for 0.25 seconds. - It will stay off for 1 second. - */ -#include //Include Metro library -#define LED 13 // Define the led's pin - -//Create a variable to hold theled's current state -int state = HIGH; - -// Instanciate a metro object and set the interval to 250 milliseconds (0.25 seconds). -Metro ledMetro = Metro(250); - -void setup() -{ - pinMode(LED,OUTPUT); - digitalWrite(LED,state); -} - -void loop() -{ - - if (ledMetro.check() == 1) { // check if the metro has passed its interval . - if (state==HIGH) { - state=LOW; - ledMetro.interval(250); // if the pin is HIGH, set the interval to 0.25 seconds. - } - else { - ledMetro.interval(1000); // if the pin is LOW, set the interval to 1 second. - state=HIGH; - } - digitalWrite(LED,state); - } -} - diff --git a/Libraries/Metro/examples/blinking_2_instances.zip b/Libraries/Metro/examples/blinking_2_instances.zip deleted file mode 100644 index 0ce0285b9558fc4ec1d43f774109c1ac187603af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 810 zcmWIWW@h1H0D(~dOLkxeln`YQU`Wcz%*)QqOOH2-&&(?>Nz6-5E!Gc>;9)RZ|HoGd zh`%z5Fa!XN5Mkf|LUbc^aT$TlT)l#nRFKh38xTgX4La!e*g#XFV@(4Q%Zr^U7Z=#*O!j+|E zOBKM>#sN=l5aSSO4cRJP283}-8l7<&hs_R1%Hx2iyZ~=jHjsOmfN&d-j$;Dx0I2IU Ax&QzG diff --git a/Libraries/Metro/examples/blinking_2_instances/blinking_2_instances.pde b/Libraries/Metro/examples/blinking_2_instances/blinking_2_instances.pde deleted file mode 100644 index 5747c82..0000000 --- a/Libraries/Metro/examples/blinking_2_instances/blinking_2_instances.pde +++ /dev/null @@ -1,51 +0,0 @@ -// This code will blink output 13 every 250 ms -// abd will blink output 9 every 125 ms - - -#include // Include Metro library -#define LED0 13 // Define a LED pin -#define LED1 9 // Define another LED pin - -// Create variables to hold the LED states -int state0 = HIGH; -int state1 = HIGH; - -// Instantiate a metro object and set the interval to 250 milliseconds (0.25 seconds). -Metro metro0 = Metro(500); - -// Instantiate another metro object and set the interval to 125 milliseconds (0.125 seconds). -Metro metro1 = Metro(125); - -void setup() -{ - pinMode(LED0,OUTPUT); - digitalWrite(LED0,state0); - - pinMode(LED1,OUTPUT); - digitalWrite(LED1,state1); - -} - -void loop() -{ - - if (metro0.check() == 1) { // check if the metro has passed its interval . - if (state0==HIGH) { - state0=LOW; - } else { - state0=HIGH; - } - digitalWrite(LED0,state0); - } - - if (metro1.check() == 1) { // check if the metro has passed its interval . - if (state1==HIGH) { - state1=LOW; - } else { - state1=HIGH; - } - digitalWrite(LED1,state1); - } - - -} diff --git a/Libraries/Metro/examples/serialInterval/serialInterval.pde b/Libraries/Metro/examples/serialInterval/serialInterval.pde deleted file mode 100755 index 68a9d41..0000000 --- a/Libraries/Metro/examples/serialInterval/serialInterval.pde +++ /dev/null @@ -1,24 +0,0 @@ -// This example sends a Serial message every 250 milliseconds - -#include // Include the Metro library - -Metro serialMetro = Metro(250); // Instantiate an instance - -void setup() { - Serial.begin(115200); // Start the Serial communication -} - -void loop() { - - if (serialMetro.check() == 1) { // check if the metro has passed it's interval . - // Output all the analog readings seperated by a space character - for (int i = 0; i < 6; i++ ) { - Serial.print (analogRead( i) ); - Serial.print(32,BYTE); - } - // Terminate message with a linefeed and a carriage return - Serial.print(13,BYTE); - Serial.print(10,BYTE); - } -} - diff --git a/Universal_Serial_Adapter/Libraries/Adafruit_RTClib/RTClib.cpp b/Universal_Serial_Adapter/Libraries/Adafruit_RTClib/RTClib.cpp new file mode 100644 index 0000000..4516a57 --- /dev/null +++ b/Universal_Serial_Adapter/Libraries/Adafruit_RTClib/RTClib.cpp @@ -0,0 +1,240 @@ +// Code by JeeLabs http://news.jeelabs.org/code/ +// Released to the public domain! Enjoy! + +#include +#include +#include "RTClib.h" + +#define DS1307_ADDRESS 0x68 +#define SECONDS_PER_DAY 86400L + +#define SECONDS_FROM_1970_TO_2000 946684800 + +#if (ARDUINO >= 100) + #include // capital A so it is error prone on case-sensitive filesystems +#else + #include +#endif + +int i = 0; //The new wire library needs to take an int when you are sending for the zero register +//////////////////////////////////////////////////////////////////////////////// +// utility code, some of this could be exposed in the DateTime API if needed + +const uint8_t daysInMonth [] PROGMEM = { 31,28,31,30,31,30,31,31,30,31,30,31 }; //has to be const or compiler compaints + +// number of days since 2000/01/01, valid for 2001..2099 +static uint16_t date2days(uint16_t y, uint8_t m, uint8_t d) { + if (y >= 2000) + y -= 2000; + uint16_t days = d; + for (uint8_t i = 1; i < m; ++i) + days += pgm_read_byte(daysInMonth + i - 1); + if (m > 2 && y % 4 == 0) + ++days; + return days + 365 * y + (y + 3) / 4 - 1; +} + +static long time2long(uint16_t days, uint8_t h, uint8_t m, uint8_t s) { + return ((days * 24L + h) * 60 + m) * 60 + s; +} + +//////////////////////////////////////////////////////////////////////////////// +// DateTime implementation - ignores time zones and DST changes +// NOTE: also ignores leap seconds, see http://en.wikipedia.org/wiki/Leap_second + +DateTime::DateTime (uint32_t t) { + t -= SECONDS_FROM_1970_TO_2000; // bring to 2000 timestamp from 1970 + + ss = t % 60; + t /= 60; + mm = t % 60; + t /= 60; + hh = t % 24; + uint16_t days = t / 24; + uint8_t leap; + for (yOff = 0; ; ++yOff) { + leap = yOff % 4 == 0; + if (days < 365 + leap) + break; + days -= 365 + leap; + } + for (m = 1; ; ++m) { + uint8_t daysPerMonth = pgm_read_byte(daysInMonth + m - 1); + if (leap && m == 2) + ++daysPerMonth; + if (days < daysPerMonth) + break; + days -= daysPerMonth; + } + d = days + 1; +} + +DateTime::DateTime (uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t min, uint8_t sec) { + if (year >= 2000) + year -= 2000; + yOff = year; + m = month; + d = day; + hh = hour; + mm = min; + ss = sec; +} + +static uint8_t conv2d(const char* p) { + uint8_t v = 0; + if ('0' <= *p && *p <= '9') + v = *p - '0'; + return 10 * v + *++p - '0'; +} + +// A convenient constructor for using "the compiler's time": +// DateTime now (__DATE__, __TIME__); +// NOTE: using PSTR would further reduce the RAM footprint +DateTime::DateTime (const char* date, const char* time) { + // sample input: date = "Dec 26 2009", time = "12:34:56" + yOff = conv2d(date + 9); + // Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + switch (date[0]) { + case 'J': m = date[1] == 'a' ? 1 : m = date[2] == 'n' ? 6 : 7; break; + case 'F': m = 2; break; + case 'A': m = date[2] == 'r' ? 4 : 8; break; + case 'M': m = date[2] == 'r' ? 3 : 5; break; + case 'S': m = 9; break; + case 'O': m = 10; break; + case 'N': m = 11; break; + case 'D': m = 12; break; + } + d = conv2d(date + 4); + hh = conv2d(time); + mm = conv2d(time + 3); + ss = conv2d(time + 6); +} + +uint8_t DateTime::dayOfWeek() const { + uint16_t day = date2days(yOff, m, d); + return (day + 6) % 7; // Jan 1, 2000 is a Saturday, i.e. returns 6 +} + +uint32_t DateTime::unixtime(void) const { + uint32_t t; + uint16_t days = date2days(yOff, m, d); + t = time2long(days, hh, mm, ss); + t += SECONDS_FROM_1970_TO_2000; // seconds from 1970 to 2000 + + return t; +} + +//////////////////////////////////////////////////////////////////////////////// +// RTC_DS1307 implementation + +static uint8_t bcd2bin (uint8_t val) { return val - 6 * (val >> 4); } +static uint8_t bin2bcd (uint8_t val) { return val + 6 * (val / 10); } + +uint8_t RTC_DS1307::begin(void) { + return 1; +} + + +#if (ARDUINO >= 100) + +uint8_t RTC_DS1307::isrunning(void) { + Wire.beginTransmission(DS1307_ADDRESS); + Wire.write(i); + Wire.endTransmission(); + + Wire.requestFrom(DS1307_ADDRESS, 1); + uint8_t ss = Wire.read(); + return !(ss>>7); +} + +void RTC_DS1307::adjust(const DateTime& dt) { + Wire.beginTransmission(DS1307_ADDRESS); + Wire.write(i); + Wire.write(bin2bcd(dt.second())); + Wire.write(bin2bcd(dt.minute())); + Wire.write(bin2bcd(dt.hour())); + Wire.write(bin2bcd(0)); + Wire.write(bin2bcd(dt.day())); + Wire.write(bin2bcd(dt.month())); + Wire.write(bin2bcd(dt.year() - 2000)); + Wire.write(i); + Wire.endTransmission(); +} + +DateTime RTC_DS1307::now() { + Wire.beginTransmission(DS1307_ADDRESS); + Wire.write(i); + Wire.endTransmission(); + + Wire.requestFrom(DS1307_ADDRESS, 7); + uint8_t ss = bcd2bin(Wire.read() & 0x7F); + uint8_t mm = bcd2bin(Wire.read()); + uint8_t hh = bcd2bin(Wire.read()); + Wire.read(); + uint8_t d = bcd2bin(Wire.read()); + uint8_t m = bcd2bin(Wire.read()); + uint16_t y = bcd2bin(Wire.read()) + 2000; + + return DateTime (y, m, d, hh, mm, ss); +} + +#else + +uint8_t RTC_DS1307::isrunning(void) { + Wire.beginTransmission(DS1307_ADDRESS); + Wire.send(i); + Wire.endTransmission(); + + Wire.requestFrom(DS1307_ADDRESS, 1); + uint8_t ss = Wire.receive(); + return !(ss>>7); +} + +void RTC_DS1307::adjust(const DateTime& dt) { + Wire.beginTransmission(DS1307_ADDRESS); + Wire.send(i); + Wire.send(bin2bcd(dt.second())); + Wire.send(bin2bcd(dt.minute())); + Wire.send(bin2bcd(dt.hour())); + Wire.send(bin2bcd(0)); + Wire.send(bin2bcd(dt.day())); + Wire.send(bin2bcd(dt.month())); + Wire.send(bin2bcd(dt.year() - 2000)); + Wire.send(i); + Wire.endTransmission(); +} + +DateTime RTC_DS1307::now() { + Wire.beginTransmission(DS1307_ADDRESS); + Wire.send(i); + Wire.endTransmission(); + + Wire.requestFrom(DS1307_ADDRESS, 7); + uint8_t ss = bcd2bin(Wire.receive() & 0x7F); + uint8_t mm = bcd2bin(Wire.receive()); + uint8_t hh = bcd2bin(Wire.receive()); + Wire.receive(); + uint8_t d = bcd2bin(Wire.receive()); + uint8_t m = bcd2bin(Wire.receive()); + uint16_t y = bcd2bin(Wire.receive()) + 2000; + + return DateTime (y, m, d, hh, mm, ss); +} + +#endif + + +//////////////////////////////////////////////////////////////////////////////// +// RTC_Millis implementation + +long RTC_Millis::offset = 0; + +void RTC_Millis::adjust(const DateTime& dt) { + offset = dt.unixtime() - millis() / 1000; +} + +DateTime RTC_Millis::now() { + return (uint32_t)(offset + millis() / 1000); +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/Universal_Serial_Adapter/Libraries/Adafruit_RTClib/RTClib.h b/Universal_Serial_Adapter/Libraries/Adafruit_RTClib/RTClib.h new file mode 100644 index 0000000..f5bf9d1 --- /dev/null +++ b/Universal_Serial_Adapter/Libraries/Adafruit_RTClib/RTClib.h @@ -0,0 +1,47 @@ +// Code by JeeLabs http://news.jeelabs.org/code/ +// Released to the public domain! Enjoy! + +// Simple general-purpose date/time class (no TZ / DST / leap second handling!) +class DateTime { +public: + DateTime (uint32_t t =0); + DateTime (uint16_t year, uint8_t month, uint8_t day, + uint8_t hour =0, uint8_t min =0, uint8_t sec =0); + DateTime (const char* date, const char* time); + uint16_t year() const { return 2000 + yOff; } + uint8_t month() const { return m; } + uint8_t day() const { return d; } + uint8_t hour() const { return hh; } + uint8_t minute() const { return mm; } + uint8_t second() const { return ss; } + uint8_t dayOfWeek() const; + + // 32-bit times as seconds since 1/1/2000 + long secondstime() const; + // 32-bit times as seconds since 1/1/1970 + uint32_t unixtime(void) const; + +protected: + uint8_t yOff, m, d, hh, mm, ss; +}; + +// RTC based on the DS1307 chip connected via I2C and the Wire library +class RTC_DS1307 { +public: + static uint8_t begin(void); + static void adjust(const DateTime& dt); + uint8_t isrunning(void); + static DateTime now(); +}; + +// RTC using the internal millis() clock, has to be initialized before use +// NOTE: this clock won't be correct once the millis() timer rolls over (>49d?) +class RTC_Millis { +public: + static void begin(const DateTime& dt) { adjust(dt); } + static void adjust(const DateTime& dt); + static DateTime now(); + +protected: + static long offset; +}; diff --git a/Libraries/Metro/keywords.txt b/Universal_Serial_Adapter/Libraries/Adafruit_RTClib/keywords.txt old mode 100755 new mode 100644 similarity index 57% rename from Libraries/Metro/keywords.txt rename to Universal_Serial_Adapter/Libraries/Adafruit_RTClib/keywords.txt index 62ca8a2..f0bdeac --- a/Libraries/Metro/keywords.txt +++ b/Universal_Serial_Adapter/Libraries/Adafruit_RTClib/keywords.txt @@ -1,23 +1,32 @@ ####################################### -# Syntax Coloring Map For Test +# Syntax Coloring Map For RTC ####################################### ####################################### # Datatypes (KEYWORD1) ####################################### -Metro KEYWORD1 +DateTime KEYWORD1 +RTC_DS1307 KEYWORD1 +RTC_Millis KEYWORD1 ####################################### # Methods and Functions (KEYWORD2) ####################################### -check KEYWORD2 -interval KEYWORD2 - -####################################### -# Instances (KEYWORD2) -####################################### +year KEYWORD2 +month KEYWORD2 +day KEYWORD2 +hour KEYWORD2 +minute KEYWORD2 +second KEYWORD2 +dayOfWeek KEYWORD2 +secondstime KEYWORD2 +unixtime KEYWORD2 +begin KEYWORD2 +adjust KEYWORD2 +isrunning KEYWORD2 +now KEYWORD2 ####################################### # Constants (LITERAL1) diff --git a/Universal_Serial_Adapter/Libraries/Metro/Metro.cpp b/Universal_Serial_Adapter/Libraries/Metro/Metro.cpp deleted file mode 100755 index 3d13747..0000000 --- a/Universal_Serial_Adapter/Libraries/Metro/Metro.cpp +++ /dev/null @@ -1,73 +0,0 @@ - -#if defined(ARDUINO) && ARDUINO >= 100 -#include "Arduino.h" -#else -#include "WProgram.h" -#endif -#include "Metro.h" - - -Metro::Metro(unsigned long interval_millis) -{ - this->autoreset = 0; - interval(interval_millis); - reset(); -} - -// New creator so I can use either the original check behavior or benjamin.soelberg's -// suggested one (see below). -// autoreset = 0 is benjamin.soelberg's check behavior -// autoreset != 0 is the original behavior - -Metro::Metro(unsigned long interval_millis, uint8_t autoreset) -{ - this->autoreset = autoreset; // Fix by Paul Bouchier - interval(interval_millis); - reset(); -} - -void Metro::interval(unsigned long interval_millis) -{ - this->interval_millis = interval_millis; -} - -// Benjamin.soelberg's check behavior: -// When a check is true, add the interval to the internal counter. -// This should guarantee a better overall stability. - -// Original check behavior: -// When a check is true, add the interval to the current millis() counter. -// This method can add a certain offset over time. - -char Metro::check() -{ - if (millis() - this->previous_millis >= this->interval_millis) { - // As suggested by benjamin.soelberg@gmail.com, the following line - // this->previous_millis = millis(); - // was changed to - // this->previous_millis += this->interval_millis; - - // If the interval is set to 0 we revert to the original behavior - if (this->interval_millis <= 0 || this->autoreset ) { - this->previous_millis = millis(); - } else { - this->previous_millis += this->interval_millis; - } - - return 1; - } - - - - return 0; - -} - -void Metro::reset() -{ - - this->previous_millis = millis(); - -} - - diff --git a/Universal_Serial_Adapter/Libraries/Metro/Metro.h b/Universal_Serial_Adapter/Libraries/Metro/Metro.h deleted file mode 100755 index cb21776..0000000 --- a/Universal_Serial_Adapter/Libraries/Metro/Metro.h +++ /dev/null @@ -1,26 +0,0 @@ - - -#ifndef Metro_h -#define Metro_h - -#include - -class Metro -{ - -public: - Metro(unsigned long interval_millis); - Metro(unsigned long interval_millis, uint8_t autoreset); - void interval(unsigned long interval_millis); - char check(); - void reset(); - -private: - uint8_t autoreset; - unsigned long previous_millis, interval_millis; - -}; - -#endif - - diff --git a/Universal_Serial_Adapter/Libraries/Metro/Metro.pdf b/Universal_Serial_Adapter/Libraries/Metro/Metro.pdf deleted file mode 100755 index f42f502ed22b7cdf7ebbffb2b338d4c9ce3f4c91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80306 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 lI`JLY&NMpj?-2_L;GG5)E>z - -#include "Project.h" -#include "UI.h" - -// Figure out offsets for text printing -int xLoc(float toSkip) { // Physically -- vertical - return (CHAR_HEIGHT * toSkip) + (CHAR_HEIGHT / 2); -} -int yLoc (float toSkip) { // Physical -- horizontal - return (CHAR_WIDTH * toSkip) + (CHAR_WIDTH / 2); -} - -void setLineSpeed(linespeed aLineSpeed) { - if (aLineSpeed >= maxlinespeed) { - currentLineSpeed = (linespeed)0; - } - else { - currentLineSpeed = aLineSpeed; - } - bool sel = selectedMode == modelinespeed ? true : false; - printLineSpeed(currentLineSpeed, sel); -} - -void setMode(serialmode aMode) { - if (aMode != modelinespeed) { - serialmode previousMode = currentMode; - currentMode = aMode; - - lcd.setStr(" ", xLoc(previousMode), yLoc(0), TEXT, BACKGROUND); - lcd.setStr("*", xLoc(currentMode), yLoc(0), TEXT, BACKGROUND); - } - else { - setLineSpeed((linespeed)(currentLineSpeed + 1)); - } -} - -void setSelection(serialmode aMode) { - serialmode previousSelection = selectedMode; - selectedMode = aMode; - - int yLocOne = yLoc(1); - - int xSelected = 0; - if (selectedMode != modelinespeed) { - xSelected = xLoc(selectedMode) + CHAR_HEIGHT; - } - - int xPrevious = 0; - if (previousSelection != modelinespeed) { - xPrevious = xLoc(previousSelection) + CHAR_HEIGHT; - } - - int previousLength = 0; - if (previousSelection != modelinespeed) { - previousLength = strlen(modeToText[previousSelection]) * CHAR_WIDTH; - } - - int selectedLength = 0; - if (selectedMode != modelinespeed) { - selectedLength = strlen(modeToText[selectedMode]) * CHAR_WIDTH; - } - - if (selectedMode != modelinespeed) { - lcd.setLine(xSelected, yLocOne, xSelected, yLocOne + selectedLength, HILIGHT); - } - else { - printLineSpeed(currentLineSpeed, true); - } - - if (previousSelection != modelinespeed) { - lcd.setLine(xPrevious, yLocOne, xPrevious, yLocOne + previousLength, BACKGROUND); - } - else { - printLineSpeed(currentLineSpeed, false); - } -} - -void printTitles() { - lcd.setStr(" RX Ln Spd Tx ", xLoc(5), 0, TEXT, BACKGROUND); -} - -void printMode(serialmode aMode) { - lcd.setStr(modeToText[aMode], xLoc(aMode), yLoc(1), TEXT, BACKGROUND); -} - -void printLineSpeed(linespeed aLineSpeed, bool selected) { - int xPosText = xLoc(6); - int yPosText = yLoc(5); - - int xPosLine = xLoc(7); - int yPosLine = yLoc(5); - - char* toPrint = linespeeds[aLineSpeed].description; - int length = strlen(toPrint); - - lcd.setStr(" ", xPosText, yPosText, BACKGROUND, BACKGROUND); - lcd.setLine(xPosLine, yPosLine, xPosLine, yPosLine + 7 * CHAR_WIDTH, BACKGROUND); - - lcd.setStr(toPrint, xPosText, yPosText, TEXT, BACKGROUND); - if (selected) { - lcd.setLine(xPosLine, yPosLine, xPosLine, yPosLine + length * CHAR_WIDTH, HILIGHT); - } -} - -void printRx(bool show) { - int vertXPosStart = xLoc(6.25); - int vertYPosStart = yLoc(1.5); - int vertXPosEnd = xLoc(7.25); - int vertYPosEnd = yLoc(1.5); - - int lftXPosStart = vertXPosEnd; - int lftYPosStart = vertYPosStart; - int lftXPosEnd = vertXPosStart + (CHAR_HEIGHT / 2); - int lftYPosEnd = vertYPosStart - CHAR_WIDTH; - - int rtXPosStart = vertXPosEnd; - int rtYPosStart = vertYPosStart; - int rtXPosEnd = vertXPosStart + (CHAR_HEIGHT / 2); - int rtYPosEnd = vertYPosStart + CHAR_WIDTH; - - int color = show ? EMERALD : BACKGROUND; - - lcd.setLine(vertXPosStart, vertYPosStart, vertXPosEnd, vertYPosEnd, color); - lcd.setLine(lftXPosStart, lftYPosStart, lftXPosEnd, lftYPosEnd, color); - lcd.setLine(rtXPosStart, rtYPosStart, rtXPosEnd, rtYPosEnd, color); -} - -void printTx(bool show) { - int vertXPosStart = xLoc(6.25); - int vertYPosStart = yLoc(13.5); - int vertXPosEnd = xLoc(7.25); - int vertYPosEnd = yLoc(13.5); - - int lftXPosStart = vertXPosStart; - int lftYPosStart = vertYPosStart; - int lftXPosEnd = vertXPosStart + (CHAR_HEIGHT / 2); - int lftYPosEnd = vertYPosStart - CHAR_WIDTH; - - int rtXPosStart = vertXPosStart; - int rtYPosStart = vertYPosStart; - int rtXPosEnd = vertXPosStart + (CHAR_HEIGHT / 2); - int rtYPosEnd = vertYPosStart + CHAR_WIDTH; - - int color = show ? SKYBLUE : BACKGROUND; - - lcd.setLine(vertXPosStart, vertYPosStart, vertXPosEnd, vertYPosEnd, color); - lcd.setLine(lftXPosStart, lftYPosStart, lftXPosEnd, lftYPosEnd, color); - lcd.setLine(rtXPosStart, rtYPosStart, rtXPosEnd, rtYPosEnd, color); -} diff --git a/Universal_Serial_Adapter/attic/UI.h b/Universal_Serial_Adapter/attic/UI.h deleted file mode 100644 index 11e4d55..0000000 --- a/Universal_Serial_Adapter/attic/UI.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - Serial Adapter Project: Dynamic serial TTY passthroughs - by: Mike Crosson - Nusku Networks - date: 2013/03/09 - license: CC-BY SA 3.0 - Creative commons share-alike 3.0 - use this code however you'd like, just keep this license and - attribute. -*/ - -// Font sizes -#define CHAR_WIDTH 8 -#define CHAR_HEIGHT 16 - -void setLineSpeed(linespeed aLineSpeed); -void setMode(serialmode aMode); -void setSelection(serialmode aMode); - -void printTitles(); -void printMode(serialmode aMode); -void printLineSpeed(linespeed aLineSpeed, bool selected); -void printRx(bool show); -void printTx(bool show); - -int xLoc(float toSkip); -int yLoc (float toSkip); - From 22a462911c28e815ea7683bd8cc6080776e3f0ca Mon Sep 17 00:00:00 2001 From: Mike C Date: Thu, 25 Apr 2013 18:13:53 -0400 Subject: [PATCH 2/3] Removed RTClib in favor of it being built as part of the project -- allows for tweaks --- .../Libraries/Adafruit_RTClib/RTClib.cpp | 240 ------------------ .../Libraries/Adafruit_RTClib/RTClib.h | 47 ---- .../Libraries/Adafruit_RTClib/keywords.txt | 34 --- 3 files changed, 321 deletions(-) delete mode 100644 Universal_Serial_Adapter/Libraries/Adafruit_RTClib/RTClib.cpp delete mode 100644 Universal_Serial_Adapter/Libraries/Adafruit_RTClib/RTClib.h delete mode 100644 Universal_Serial_Adapter/Libraries/Adafruit_RTClib/keywords.txt diff --git a/Universal_Serial_Adapter/Libraries/Adafruit_RTClib/RTClib.cpp b/Universal_Serial_Adapter/Libraries/Adafruit_RTClib/RTClib.cpp deleted file mode 100644 index 4516a57..0000000 --- a/Universal_Serial_Adapter/Libraries/Adafruit_RTClib/RTClib.cpp +++ /dev/null @@ -1,240 +0,0 @@ -// Code by JeeLabs http://news.jeelabs.org/code/ -// Released to the public domain! Enjoy! - -#include -#include -#include "RTClib.h" - -#define DS1307_ADDRESS 0x68 -#define SECONDS_PER_DAY 86400L - -#define SECONDS_FROM_1970_TO_2000 946684800 - -#if (ARDUINO >= 100) - #include // capital A so it is error prone on case-sensitive filesystems -#else - #include -#endif - -int i = 0; //The new wire library needs to take an int when you are sending for the zero register -//////////////////////////////////////////////////////////////////////////////// -// utility code, some of this could be exposed in the DateTime API if needed - -const uint8_t daysInMonth [] PROGMEM = { 31,28,31,30,31,30,31,31,30,31,30,31 }; //has to be const or compiler compaints - -// number of days since 2000/01/01, valid for 2001..2099 -static uint16_t date2days(uint16_t y, uint8_t m, uint8_t d) { - if (y >= 2000) - y -= 2000; - uint16_t days = d; - for (uint8_t i = 1; i < m; ++i) - days += pgm_read_byte(daysInMonth + i - 1); - if (m > 2 && y % 4 == 0) - ++days; - return days + 365 * y + (y + 3) / 4 - 1; -} - -static long time2long(uint16_t days, uint8_t h, uint8_t m, uint8_t s) { - return ((days * 24L + h) * 60 + m) * 60 + s; -} - -//////////////////////////////////////////////////////////////////////////////// -// DateTime implementation - ignores time zones and DST changes -// NOTE: also ignores leap seconds, see http://en.wikipedia.org/wiki/Leap_second - -DateTime::DateTime (uint32_t t) { - t -= SECONDS_FROM_1970_TO_2000; // bring to 2000 timestamp from 1970 - - ss = t % 60; - t /= 60; - mm = t % 60; - t /= 60; - hh = t % 24; - uint16_t days = t / 24; - uint8_t leap; - for (yOff = 0; ; ++yOff) { - leap = yOff % 4 == 0; - if (days < 365 + leap) - break; - days -= 365 + leap; - } - for (m = 1; ; ++m) { - uint8_t daysPerMonth = pgm_read_byte(daysInMonth + m - 1); - if (leap && m == 2) - ++daysPerMonth; - if (days < daysPerMonth) - break; - days -= daysPerMonth; - } - d = days + 1; -} - -DateTime::DateTime (uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t min, uint8_t sec) { - if (year >= 2000) - year -= 2000; - yOff = year; - m = month; - d = day; - hh = hour; - mm = min; - ss = sec; -} - -static uint8_t conv2d(const char* p) { - uint8_t v = 0; - if ('0' <= *p && *p <= '9') - v = *p - '0'; - return 10 * v + *++p - '0'; -} - -// A convenient constructor for using "the compiler's time": -// DateTime now (__DATE__, __TIME__); -// NOTE: using PSTR would further reduce the RAM footprint -DateTime::DateTime (const char* date, const char* time) { - // sample input: date = "Dec 26 2009", time = "12:34:56" - yOff = conv2d(date + 9); - // Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec - switch (date[0]) { - case 'J': m = date[1] == 'a' ? 1 : m = date[2] == 'n' ? 6 : 7; break; - case 'F': m = 2; break; - case 'A': m = date[2] == 'r' ? 4 : 8; break; - case 'M': m = date[2] == 'r' ? 3 : 5; break; - case 'S': m = 9; break; - case 'O': m = 10; break; - case 'N': m = 11; break; - case 'D': m = 12; break; - } - d = conv2d(date + 4); - hh = conv2d(time); - mm = conv2d(time + 3); - ss = conv2d(time + 6); -} - -uint8_t DateTime::dayOfWeek() const { - uint16_t day = date2days(yOff, m, d); - return (day + 6) % 7; // Jan 1, 2000 is a Saturday, i.e. returns 6 -} - -uint32_t DateTime::unixtime(void) const { - uint32_t t; - uint16_t days = date2days(yOff, m, d); - t = time2long(days, hh, mm, ss); - t += SECONDS_FROM_1970_TO_2000; // seconds from 1970 to 2000 - - return t; -} - -//////////////////////////////////////////////////////////////////////////////// -// RTC_DS1307 implementation - -static uint8_t bcd2bin (uint8_t val) { return val - 6 * (val >> 4); } -static uint8_t bin2bcd (uint8_t val) { return val + 6 * (val / 10); } - -uint8_t RTC_DS1307::begin(void) { - return 1; -} - - -#if (ARDUINO >= 100) - -uint8_t RTC_DS1307::isrunning(void) { - Wire.beginTransmission(DS1307_ADDRESS); - Wire.write(i); - Wire.endTransmission(); - - Wire.requestFrom(DS1307_ADDRESS, 1); - uint8_t ss = Wire.read(); - return !(ss>>7); -} - -void RTC_DS1307::adjust(const DateTime& dt) { - Wire.beginTransmission(DS1307_ADDRESS); - Wire.write(i); - Wire.write(bin2bcd(dt.second())); - Wire.write(bin2bcd(dt.minute())); - Wire.write(bin2bcd(dt.hour())); - Wire.write(bin2bcd(0)); - Wire.write(bin2bcd(dt.day())); - Wire.write(bin2bcd(dt.month())); - Wire.write(bin2bcd(dt.year() - 2000)); - Wire.write(i); - Wire.endTransmission(); -} - -DateTime RTC_DS1307::now() { - Wire.beginTransmission(DS1307_ADDRESS); - Wire.write(i); - Wire.endTransmission(); - - Wire.requestFrom(DS1307_ADDRESS, 7); - uint8_t ss = bcd2bin(Wire.read() & 0x7F); - uint8_t mm = bcd2bin(Wire.read()); - uint8_t hh = bcd2bin(Wire.read()); - Wire.read(); - uint8_t d = bcd2bin(Wire.read()); - uint8_t m = bcd2bin(Wire.read()); - uint16_t y = bcd2bin(Wire.read()) + 2000; - - return DateTime (y, m, d, hh, mm, ss); -} - -#else - -uint8_t RTC_DS1307::isrunning(void) { - Wire.beginTransmission(DS1307_ADDRESS); - Wire.send(i); - Wire.endTransmission(); - - Wire.requestFrom(DS1307_ADDRESS, 1); - uint8_t ss = Wire.receive(); - return !(ss>>7); -} - -void RTC_DS1307::adjust(const DateTime& dt) { - Wire.beginTransmission(DS1307_ADDRESS); - Wire.send(i); - Wire.send(bin2bcd(dt.second())); - Wire.send(bin2bcd(dt.minute())); - Wire.send(bin2bcd(dt.hour())); - Wire.send(bin2bcd(0)); - Wire.send(bin2bcd(dt.day())); - Wire.send(bin2bcd(dt.month())); - Wire.send(bin2bcd(dt.year() - 2000)); - Wire.send(i); - Wire.endTransmission(); -} - -DateTime RTC_DS1307::now() { - Wire.beginTransmission(DS1307_ADDRESS); - Wire.send(i); - Wire.endTransmission(); - - Wire.requestFrom(DS1307_ADDRESS, 7); - uint8_t ss = bcd2bin(Wire.receive() & 0x7F); - uint8_t mm = bcd2bin(Wire.receive()); - uint8_t hh = bcd2bin(Wire.receive()); - Wire.receive(); - uint8_t d = bcd2bin(Wire.receive()); - uint8_t m = bcd2bin(Wire.receive()); - uint16_t y = bcd2bin(Wire.receive()) + 2000; - - return DateTime (y, m, d, hh, mm, ss); -} - -#endif - - -//////////////////////////////////////////////////////////////////////////////// -// RTC_Millis implementation - -long RTC_Millis::offset = 0; - -void RTC_Millis::adjust(const DateTime& dt) { - offset = dt.unixtime() - millis() / 1000; -} - -DateTime RTC_Millis::now() { - return (uint32_t)(offset + millis() / 1000); -} - -//////////////////////////////////////////////////////////////////////////////// diff --git a/Universal_Serial_Adapter/Libraries/Adafruit_RTClib/RTClib.h b/Universal_Serial_Adapter/Libraries/Adafruit_RTClib/RTClib.h deleted file mode 100644 index f5bf9d1..0000000 --- a/Universal_Serial_Adapter/Libraries/Adafruit_RTClib/RTClib.h +++ /dev/null @@ -1,47 +0,0 @@ -// Code by JeeLabs http://news.jeelabs.org/code/ -// Released to the public domain! Enjoy! - -// Simple general-purpose date/time class (no TZ / DST / leap second handling!) -class DateTime { -public: - DateTime (uint32_t t =0); - DateTime (uint16_t year, uint8_t month, uint8_t day, - uint8_t hour =0, uint8_t min =0, uint8_t sec =0); - DateTime (const char* date, const char* time); - uint16_t year() const { return 2000 + yOff; } - uint8_t month() const { return m; } - uint8_t day() const { return d; } - uint8_t hour() const { return hh; } - uint8_t minute() const { return mm; } - uint8_t second() const { return ss; } - uint8_t dayOfWeek() const; - - // 32-bit times as seconds since 1/1/2000 - long secondstime() const; - // 32-bit times as seconds since 1/1/1970 - uint32_t unixtime(void) const; - -protected: - uint8_t yOff, m, d, hh, mm, ss; -}; - -// RTC based on the DS1307 chip connected via I2C and the Wire library -class RTC_DS1307 { -public: - static uint8_t begin(void); - static void adjust(const DateTime& dt); - uint8_t isrunning(void); - static DateTime now(); -}; - -// RTC using the internal millis() clock, has to be initialized before use -// NOTE: this clock won't be correct once the millis() timer rolls over (>49d?) -class RTC_Millis { -public: - static void begin(const DateTime& dt) { adjust(dt); } - static void adjust(const DateTime& dt); - static DateTime now(); - -protected: - static long offset; -}; diff --git a/Universal_Serial_Adapter/Libraries/Adafruit_RTClib/keywords.txt b/Universal_Serial_Adapter/Libraries/Adafruit_RTClib/keywords.txt deleted file mode 100644 index f0bdeac..0000000 --- a/Universal_Serial_Adapter/Libraries/Adafruit_RTClib/keywords.txt +++ /dev/null @@ -1,34 +0,0 @@ -####################################### -# Syntax Coloring Map For RTC -####################################### - -####################################### -# Datatypes (KEYWORD1) -####################################### - -DateTime KEYWORD1 -RTC_DS1307 KEYWORD1 -RTC_Millis KEYWORD1 - -####################################### -# Methods and Functions (KEYWORD2) -####################################### - -year KEYWORD2 -month KEYWORD2 -day KEYWORD2 -hour KEYWORD2 -minute KEYWORD2 -second KEYWORD2 -dayOfWeek KEYWORD2 -secondstime KEYWORD2 -unixtime KEYWORD2 -begin KEYWORD2 -adjust KEYWORD2 -isrunning KEYWORD2 -now KEYWORD2 - -####################################### -# Constants (LITERAL1) -####################################### - From 4a60bf7477575b714e8d99f027468dfb27acd3e4 Mon Sep 17 00:00:00 2001 From: Mike C Date: Thu, 25 Apr 2013 18:14:23 -0400 Subject: [PATCH 3/3] Initial addition of RTC code -- debugging enabled due to this code being untested --- Universal_Serial_Adapter/Project.h | 2 +- Universal_Serial_Adapter/RTClib.cpp | 240 ++++++++++++++++++ Universal_Serial_Adapter/RTClib.h | 47 ++++ .../Universal_Serial_Adapter.ino | 36 ++- 4 files changed, 322 insertions(+), 3 deletions(-) create mode 100644 Universal_Serial_Adapter/RTClib.cpp create mode 100644 Universal_Serial_Adapter/RTClib.h diff --git a/Universal_Serial_Adapter/Project.h b/Universal_Serial_Adapter/Project.h index 3c68be8..65eaeb0 100644 --- a/Universal_Serial_Adapter/Project.h +++ b/Universal_Serial_Adapter/Project.h @@ -11,7 +11,7 @@ #ifndef Project_h #define Project_h -#define DEBUG false // For controlling debug output via serial +#define DEBUG true // For controlling debug output via serial // Buttons / Joystick / Input Hardware Pinouts #define okButtonPin 22 diff --git a/Universal_Serial_Adapter/RTClib.cpp b/Universal_Serial_Adapter/RTClib.cpp new file mode 100644 index 0000000..4516a57 --- /dev/null +++ b/Universal_Serial_Adapter/RTClib.cpp @@ -0,0 +1,240 @@ +// Code by JeeLabs http://news.jeelabs.org/code/ +// Released to the public domain! Enjoy! + +#include +#include +#include "RTClib.h" + +#define DS1307_ADDRESS 0x68 +#define SECONDS_PER_DAY 86400L + +#define SECONDS_FROM_1970_TO_2000 946684800 + +#if (ARDUINO >= 100) + #include // capital A so it is error prone on case-sensitive filesystems +#else + #include +#endif + +int i = 0; //The new wire library needs to take an int when you are sending for the zero register +//////////////////////////////////////////////////////////////////////////////// +// utility code, some of this could be exposed in the DateTime API if needed + +const uint8_t daysInMonth [] PROGMEM = { 31,28,31,30,31,30,31,31,30,31,30,31 }; //has to be const or compiler compaints + +// number of days since 2000/01/01, valid for 2001..2099 +static uint16_t date2days(uint16_t y, uint8_t m, uint8_t d) { + if (y >= 2000) + y -= 2000; + uint16_t days = d; + for (uint8_t i = 1; i < m; ++i) + days += pgm_read_byte(daysInMonth + i - 1); + if (m > 2 && y % 4 == 0) + ++days; + return days + 365 * y + (y + 3) / 4 - 1; +} + +static long time2long(uint16_t days, uint8_t h, uint8_t m, uint8_t s) { + return ((days * 24L + h) * 60 + m) * 60 + s; +} + +//////////////////////////////////////////////////////////////////////////////// +// DateTime implementation - ignores time zones and DST changes +// NOTE: also ignores leap seconds, see http://en.wikipedia.org/wiki/Leap_second + +DateTime::DateTime (uint32_t t) { + t -= SECONDS_FROM_1970_TO_2000; // bring to 2000 timestamp from 1970 + + ss = t % 60; + t /= 60; + mm = t % 60; + t /= 60; + hh = t % 24; + uint16_t days = t / 24; + uint8_t leap; + for (yOff = 0; ; ++yOff) { + leap = yOff % 4 == 0; + if (days < 365 + leap) + break; + days -= 365 + leap; + } + for (m = 1; ; ++m) { + uint8_t daysPerMonth = pgm_read_byte(daysInMonth + m - 1); + if (leap && m == 2) + ++daysPerMonth; + if (days < daysPerMonth) + break; + days -= daysPerMonth; + } + d = days + 1; +} + +DateTime::DateTime (uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t min, uint8_t sec) { + if (year >= 2000) + year -= 2000; + yOff = year; + m = month; + d = day; + hh = hour; + mm = min; + ss = sec; +} + +static uint8_t conv2d(const char* p) { + uint8_t v = 0; + if ('0' <= *p && *p <= '9') + v = *p - '0'; + return 10 * v + *++p - '0'; +} + +// A convenient constructor for using "the compiler's time": +// DateTime now (__DATE__, __TIME__); +// NOTE: using PSTR would further reduce the RAM footprint +DateTime::DateTime (const char* date, const char* time) { + // sample input: date = "Dec 26 2009", time = "12:34:56" + yOff = conv2d(date + 9); + // Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + switch (date[0]) { + case 'J': m = date[1] == 'a' ? 1 : m = date[2] == 'n' ? 6 : 7; break; + case 'F': m = 2; break; + case 'A': m = date[2] == 'r' ? 4 : 8; break; + case 'M': m = date[2] == 'r' ? 3 : 5; break; + case 'S': m = 9; break; + case 'O': m = 10; break; + case 'N': m = 11; break; + case 'D': m = 12; break; + } + d = conv2d(date + 4); + hh = conv2d(time); + mm = conv2d(time + 3); + ss = conv2d(time + 6); +} + +uint8_t DateTime::dayOfWeek() const { + uint16_t day = date2days(yOff, m, d); + return (day + 6) % 7; // Jan 1, 2000 is a Saturday, i.e. returns 6 +} + +uint32_t DateTime::unixtime(void) const { + uint32_t t; + uint16_t days = date2days(yOff, m, d); + t = time2long(days, hh, mm, ss); + t += SECONDS_FROM_1970_TO_2000; // seconds from 1970 to 2000 + + return t; +} + +//////////////////////////////////////////////////////////////////////////////// +// RTC_DS1307 implementation + +static uint8_t bcd2bin (uint8_t val) { return val - 6 * (val >> 4); } +static uint8_t bin2bcd (uint8_t val) { return val + 6 * (val / 10); } + +uint8_t RTC_DS1307::begin(void) { + return 1; +} + + +#if (ARDUINO >= 100) + +uint8_t RTC_DS1307::isrunning(void) { + Wire.beginTransmission(DS1307_ADDRESS); + Wire.write(i); + Wire.endTransmission(); + + Wire.requestFrom(DS1307_ADDRESS, 1); + uint8_t ss = Wire.read(); + return !(ss>>7); +} + +void RTC_DS1307::adjust(const DateTime& dt) { + Wire.beginTransmission(DS1307_ADDRESS); + Wire.write(i); + Wire.write(bin2bcd(dt.second())); + Wire.write(bin2bcd(dt.minute())); + Wire.write(bin2bcd(dt.hour())); + Wire.write(bin2bcd(0)); + Wire.write(bin2bcd(dt.day())); + Wire.write(bin2bcd(dt.month())); + Wire.write(bin2bcd(dt.year() - 2000)); + Wire.write(i); + Wire.endTransmission(); +} + +DateTime RTC_DS1307::now() { + Wire.beginTransmission(DS1307_ADDRESS); + Wire.write(i); + Wire.endTransmission(); + + Wire.requestFrom(DS1307_ADDRESS, 7); + uint8_t ss = bcd2bin(Wire.read() & 0x7F); + uint8_t mm = bcd2bin(Wire.read()); + uint8_t hh = bcd2bin(Wire.read()); + Wire.read(); + uint8_t d = bcd2bin(Wire.read()); + uint8_t m = bcd2bin(Wire.read()); + uint16_t y = bcd2bin(Wire.read()) + 2000; + + return DateTime (y, m, d, hh, mm, ss); +} + +#else + +uint8_t RTC_DS1307::isrunning(void) { + Wire.beginTransmission(DS1307_ADDRESS); + Wire.send(i); + Wire.endTransmission(); + + Wire.requestFrom(DS1307_ADDRESS, 1); + uint8_t ss = Wire.receive(); + return !(ss>>7); +} + +void RTC_DS1307::adjust(const DateTime& dt) { + Wire.beginTransmission(DS1307_ADDRESS); + Wire.send(i); + Wire.send(bin2bcd(dt.second())); + Wire.send(bin2bcd(dt.minute())); + Wire.send(bin2bcd(dt.hour())); + Wire.send(bin2bcd(0)); + Wire.send(bin2bcd(dt.day())); + Wire.send(bin2bcd(dt.month())); + Wire.send(bin2bcd(dt.year() - 2000)); + Wire.send(i); + Wire.endTransmission(); +} + +DateTime RTC_DS1307::now() { + Wire.beginTransmission(DS1307_ADDRESS); + Wire.send(i); + Wire.endTransmission(); + + Wire.requestFrom(DS1307_ADDRESS, 7); + uint8_t ss = bcd2bin(Wire.receive() & 0x7F); + uint8_t mm = bcd2bin(Wire.receive()); + uint8_t hh = bcd2bin(Wire.receive()); + Wire.receive(); + uint8_t d = bcd2bin(Wire.receive()); + uint8_t m = bcd2bin(Wire.receive()); + uint16_t y = bcd2bin(Wire.receive()) + 2000; + + return DateTime (y, m, d, hh, mm, ss); +} + +#endif + + +//////////////////////////////////////////////////////////////////////////////// +// RTC_Millis implementation + +long RTC_Millis::offset = 0; + +void RTC_Millis::adjust(const DateTime& dt) { + offset = dt.unixtime() - millis() / 1000; +} + +DateTime RTC_Millis::now() { + return (uint32_t)(offset + millis() / 1000); +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/Universal_Serial_Adapter/RTClib.h b/Universal_Serial_Adapter/RTClib.h new file mode 100644 index 0000000..f5bf9d1 --- /dev/null +++ b/Universal_Serial_Adapter/RTClib.h @@ -0,0 +1,47 @@ +// Code by JeeLabs http://news.jeelabs.org/code/ +// Released to the public domain! Enjoy! + +// Simple general-purpose date/time class (no TZ / DST / leap second handling!) +class DateTime { +public: + DateTime (uint32_t t =0); + DateTime (uint16_t year, uint8_t month, uint8_t day, + uint8_t hour =0, uint8_t min =0, uint8_t sec =0); + DateTime (const char* date, const char* time); + uint16_t year() const { return 2000 + yOff; } + uint8_t month() const { return m; } + uint8_t day() const { return d; } + uint8_t hour() const { return hh; } + uint8_t minute() const { return mm; } + uint8_t second() const { return ss; } + uint8_t dayOfWeek() const; + + // 32-bit times as seconds since 1/1/2000 + long secondstime() const; + // 32-bit times as seconds since 1/1/1970 + uint32_t unixtime(void) const; + +protected: + uint8_t yOff, m, d, hh, mm, ss; +}; + +// RTC based on the DS1307 chip connected via I2C and the Wire library +class RTC_DS1307 { +public: + static uint8_t begin(void); + static void adjust(const DateTime& dt); + uint8_t isrunning(void); + static DateTime now(); +}; + +// RTC using the internal millis() clock, has to be initialized before use +// NOTE: this clock won't be correct once the millis() timer rolls over (>49d?) +class RTC_Millis { +public: + static void begin(const DateTime& dt) { adjust(dt); } + static void adjust(const DateTime& dt); + static DateTime now(); + +protected: + static long offset; +}; diff --git a/Universal_Serial_Adapter/Universal_Serial_Adapter.ino b/Universal_Serial_Adapter/Universal_Serial_Adapter.ino index 84dc949..f819040 100644 --- a/Universal_Serial_Adapter/Universal_Serial_Adapter.ino +++ b/Universal_Serial_Adapter/Universal_Serial_Adapter.ino @@ -8,7 +8,7 @@ attribute. */ -#include +#include #include "Project.h" #include "Config.h" @@ -26,6 +26,7 @@ UI* ui; Config* config; +RTC_DS1307 rtc; // helper for interrupt method call void processSerial() { @@ -33,11 +34,26 @@ void processSerial() { } void setup() { + // Setup various IO busses Serial.begin(115200); + Wire.begin(); + // Ensure RTC is set to run on battery + // clear /EOSC bit + // Sometimes necessary to ensure that the clock + // keeps running on just battery power. Once set, + // it shouldn't need to be reset but it's a good + // idea to make sure. + Wire.beginTransmission(0x68); // address DS3231 + Wire.write(0x0E); // select register + Wire.write(0b00011100); // write register bitmap, bit 7 is /EOSC + Wire.endTransmission(); + + rtc.begin(); + + // Stuff used for serial and UI config = new Config(); config->setDefaults(); - ui = new UI(); // Setup serial IO on an interrupt timer @@ -48,6 +64,22 @@ void setup() { } void loop() { + if (DEBUG) { + DateTime now = RTC.now(); + Serial.print(now.year(), DEC); + Serial.print('/'); + Serial.print(now.month(), DEC); + Serial.print('/'); + Serial.print(now.day(), DEC); + Serial.print(' '); + Serial.print(now.hour(), DEC); + Serial.print(':'); + Serial.print(now.minute(), DEC); + Serial.print(':'); + Serial.print(now.second(), DEC); + Serial.println(); + } + // Serial data is processed via an interrupt so isn't needed in the main loop ui->processInputEvents(); ui->processTimeoutEvents();