Vinod Modhe / Mbed 2 deprecated IR_Remote

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
vin_jm
Date:
Sat Mar 09 00:51:21 2013 +0000
Commit message:
Rev.1

Changed in this revision

IR_Def.h Show annotated file Show diff for this revision Revisions of this file
NokiaLCD.cpp Show annotated file Show diff for this revision Revisions of this file
NokiaLCD.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IR_Def.h	Sat Mar 09 00:51:21 2013 +0000
@@ -0,0 +1,22 @@
+/*Vinod Modhe*/
+/* 4180 Lab3 */
+
+#ifndef IR_DEF_H
+#define IR_DEF_H
+
+//IR Timing
+//UL => Upper Tolerance Limit; LL => Lower Tolerance Limit
+#define IR_9000us_UL        (9500)
+#define IR_9000us_LL        (8500)
+#define IR_4500us_UL      (5000)
+#define IR_4500us_LL      (4000)
+#define IR_2250us_UL      (2500) 
+#define IR_2250us_LL      (2000)
+#define IR_1_UL_us        (2500)
+#define IR_1_LL_us        (2000)
+#define IR_0_UL_us        (1500)
+#define IR_0_LL_us        (1000)   
+#define IR_rep_timeout_ms   (135)    //In NEC protocol, a 110ms interval exists between any two commands and/or repeat pulses. 
+                                   //If any repeat pulse is received later than 135msec after the last command or repeat pulse, it is to be ignored, as it will be erroneous. 
+                                                            
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/NokiaLCD.cpp	Sat Mar 09 00:51:21 2013 +0000
@@ -0,0 +1,455 @@
+/* mbed Nokia LCD Library
+ * Copyright (c) 2007-2010, sford
+ */
+
+#include "NokiaLCD.h"
+
+#include "mbed.h"
+
+#define NOKIALCD_ROWS 16
+#define NOKIALCD_COLS 16
+#define NOKIALCD_WIDTH 130
+#define NOKIALCD_HEIGHT 132
+#define NOKIALCD_FREQUENCY 5000000
+
+NokiaLCD::NokiaLCD(PinName mosi, PinName sclk, PinName cs, PinName rst, LCDType type)
+        : _spi(mosi, NC, sclk)
+        , _rst(rst)
+        , _cs(cs) {
+
+    _type = type;
+
+    _row = 0;
+    _column = 0;
+    _foreground = 0x00FFFFFF;
+    _background = 0x00000000;
+
+    reset();
+}
+
+void NokiaLCD::reset() {
+
+    // setup the SPI interface and bring display out of reset
+    _cs = 1;
+    _rst = 0;
+    _spi.format(9);
+    _spi.frequency(NOKIALCD_FREQUENCY);
+    wait_ms(1);
+    _rst = 1;
+    wait_ms(1);
+
+    _cs = 0;
+
+    switch (_type) {
+        case LCD6100:
+            command(0xCA); // display control
+            data(0);
+            data(32);
+            data(0);
+            command(0xBB);
+            data(1);
+            command(0xD1); // oscillator on
+            command(0x94); // sleep out
+            command(0x20); // power control
+            data(0x0F);
+            command(0xA7); // invert display
+            command(0x81); // Voltage control
+            data(39);      // contrast setting: 0..63
+            data(3);       // resistance ratio
+            wait_ms(1);
+            command(0xBC);
+            data(0);
+            data(1);
+            data(4);
+            command(0xAF);  // turn on the display
+            break;
+            
+        case LCD6610:
+            command(0xCA);    // display control
+            data(0);
+            data(31);
+            data(0);
+            command(0xBB);
+            data(1);
+            command(0xD1); // oscillator on
+            command(0x94); // sleep out
+            command(0x20); // power control
+            data(0x0F);
+            command(0xA7); // invert display
+            command(0x81); // Voltage control
+            data(39);      // contrast setting: 0..63
+            data(3);       // resistance ratio
+            wait_ms(1);
+            command(0xBC);
+            data(0);
+            data(0);
+            data(2);
+            command(0xAF);  // turn on the display
+            break;
+            
+        case PCF8833:
+            command(0x11);  // sleep out
+            command(0x3A);  // column mode
+            data(0x05);
+            command(0x36);  // madctl
+            data(0x60);     // vertical RAM, flip x
+            command(0x25);  // setcon
+            data(0x30);// contrast 0x30
+            wait_ms(2);
+            command(0x29);//DISPON
+            command(0x03);//BSTRON
+            break;
+    }
+
+    _cs = 1;
+
+    cls();
+}
+
+void NokiaLCD::command(int value) {
+    _spi.write(value & 0xFF);
+}
+
+void NokiaLCD::data(int value) {
+    _spi.write(value | 0x100);
+}
+
+void NokiaLCD::_window(int x, int y, int width, int height) {
+    int x1 = x + 0;
+    int y1 = y + 0;
+    int x2 = x1 + width - 1;
+    int y2 = y1 + height - 1;
+
+    switch (_type) {
+        case LCD6610:
+        case LCD6100:
+            command(0x15); // column
+            data(x1);
+            data(x2);
+            command(0x75); // row
+            data(y1);
+            data(y2);
+            command(0x5C); // start write to ram
+            break;
+        case PCF8833:
+            command(0x2A);  // column
+            data(x1);
+            data(x2);
+            command(0x2B); // row
+            data(y1);
+            data(y2);
+            command(0x2C); // start write to ram
+            break;
+    }
+}
+
+void NokiaLCD::_putp(int colour) {
+    int gr = ((colour >> 20) & 0x0F)
+             | ((colour >> 8 ) & 0xF0);
+    int nb = ((colour >> 4 ) & 0x0F);
+    data(nb);
+    data(gr);
+}
+
+const unsigned char FONT8x8[97][8] = {
+    0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00, // columns, rows, num_bytes_per_char
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // space 0x20
+    0x30,0x78,0x78,0x30,0x30,0x00,0x30,0x00, // !
+    0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00, // "
+    0x6C,0x6C,0xFE,0x6C,0xFE,0x6C,0x6C,0x00, // #
+    0x18,0x3E,0x60,0x3C,0x06,0x7C,0x18,0x00, // $
+    0x00,0x63,0x66,0x0C,0x18,0x33,0x63,0x00, // %
+    0x1C,0x36,0x1C,0x3B,0x6E,0x66,0x3B,0x00, // &
+    0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00, // '
+    0x0C,0x18,0x30,0x30,0x30,0x18,0x0C,0x00, // (
+    0x30,0x18,0x0C,0x0C,0x0C,0x18,0x30,0x00, // )
+    0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00, // *
+    0x00,0x30,0x30,0xFC,0x30,0x30,0x00,0x00, // +
+    0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x30, // ,
+    0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00, // -
+    0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00, // .
+    0x03,0x06,0x0C,0x18,0x30,0x60,0x40,0x00, // / (forward slash)
+    0x3E,0x63,0x63,0x6B,0x63,0x63,0x3E,0x00, // 0 0x30
+    0x18,0x38,0x58,0x18,0x18,0x18,0x7E,0x00, // 1
+    0x3C,0x66,0x06,0x1C,0x30,0x66,0x7E,0x00, // 2
+    0x3C,0x66,0x06,0x1C,0x06,0x66,0x3C,0x00, // 3
+    0x0E,0x1E,0x36,0x66,0x7F,0x06,0x0F,0x00, // 4
+    0x7E,0x60,0x7C,0x06,0x06,0x66,0x3C,0x00, // 5
+    0x1C,0x30,0x60,0x7C,0x66,0x66,0x3C,0x00, // 6
+    0x7E,0x66,0x06,0x0C,0x18,0x18,0x18,0x00, // 7
+    0x3C,0x66,0x66,0x3C,0x66,0x66,0x3C,0x00, // 8
+    0x3C,0x66,0x66,0x3E,0x06,0x0C,0x38,0x00, // 9
+    0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x00, // :
+    0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x30, // ;
+    0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x00, // <
+    0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00, // =
+    0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x00, // >
+    0x3C,0x66,0x06,0x0C,0x18,0x00,0x18,0x00, // ?
+    0x3E,0x63,0x6F,0x69,0x6F,0x60,0x3E,0x00, // @ 0x40
+    0x18,0x3C,0x66,0x66,0x7E,0x66,0x66,0x00, // A
+    0x7E,0x33,0x33,0x3E,0x33,0x33,0x7E,0x00, // B
+    0x1E,0x33,0x60,0x60,0x60,0x33,0x1E,0x00, // C
+    0x7C,0x36,0x33,0x33,0x33,0x36,0x7C,0x00, // D
+    0x7F,0x31,0x34,0x3C,0x34,0x31,0x7F,0x00, // E
+    0x7F,0x31,0x34,0x3C,0x34,0x30,0x78,0x00, // F
+    0x1E,0x33,0x60,0x60,0x67,0x33,0x1F,0x00, // G
+    0x66,0x66,0x66,0x7E,0x66,0x66,0x66,0x00, // H
+    0x3C,0x18,0x18,0x18,0x18,0x18,0x3C,0x00, // I
+    0x0F,0x06,0x06,0x06,0x66,0x66,0x3C,0x00, // J
+    0x73,0x33,0x36,0x3C,0x36,0x33,0x73,0x00, // K
+    0x78,0x30,0x30,0x30,0x31,0x33,0x7F,0x00, // L
+    0x63,0x77,0x7F,0x7F,0x6B,0x63,0x63,0x00, // M
+    0x63,0x73,0x7B,0x6F,0x67,0x63,0x63,0x00, // N
+    0x3E,0x63,0x63,0x63,0x63,0x63,0x3E,0x00, // O
+    0x7E,0x33,0x33,0x3E,0x30,0x30,0x78,0x00, // P 0x50
+    0x3C,0x66,0x66,0x66,0x6E,0x3C,0x0E,0x00, // Q
+    0x7E,0x33,0x33,0x3E,0x36,0x33,0x73,0x00, // R
+    0x3C,0x66,0x30,0x18,0x0C,0x66,0x3C,0x00, // S
+    0x7E,0x5A,0x18,0x18,0x18,0x18,0x3C,0x00, // T
+    0x66,0x66,0x66,0x66,0x66,0x66,0x7E,0x00, // U
+    0x66,0x66,0x66,0x66,0x66,0x3C,0x18,0x00, // V
+    0x63,0x63,0x63,0x6B,0x7F,0x77,0x63,0x00, // W
+    0x63,0x63,0x36,0x1C,0x1C,0x36,0x63,0x00, // X
+    0x66,0x66,0x66,0x3C,0x18,0x18,0x3C,0x00, // Y
+    0x7F,0x63,0x46,0x0C,0x19,0x33,0x7F,0x00, // Z
+    0x3C,0x30,0x30,0x30,0x30,0x30,0x3C,0x00, // [
+    0x60,0x30,0x18,0x0C,0x06,0x03,0x01,0x00, // \ (back slash)
+    0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00, // ]
+    0x08,0x1C,0x36,0x63,0x00,0x00,0x00,0x00, // ^
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF, // _
+    0x18,0x18,0x0C,0x00,0x00,0x00,0x00,0x00, // ` 0x60
+    0x00,0x00,0x3C,0x06,0x3E,0x66,0x3B,0x00, // a
+    0x70,0x30,0x3E,0x33,0x33,0x33,0x6E,0x00, // b
+    0x00,0x00,0x3C,0x66,0x60,0x66,0x3C,0x00, // c
+    0x0E,0x06,0x3E,0x66,0x66,0x66,0x3B,0x00, // d
+    0x00,0x00,0x3C,0x66,0x7E,0x60,0x3C,0x00, // e
+    0x1C,0x36,0x30,0x78,0x30,0x30,0x78,0x00, // f
+    0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x7C, // g
+    0x70,0x30,0x36,0x3B,0x33,0x33,0x73,0x00, // h
+    0x18,0x00,0x38,0x18,0x18,0x18,0x3C,0x00, // i
+    0x06,0x00,0x06,0x06,0x06,0x66,0x66,0x3C, // j
+    0x70,0x30,0x33,0x36,0x3C,0x36,0x73,0x00, // k
+    0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00, // l
+    0x00,0x00,0x66,0x7F,0x7F,0x6B,0x63,0x00, // m
+    0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x00, // n
+    0x00,0x00,0x3C,0x66,0x66,0x66,0x3C,0x00, // o
+    0x00,0x00,0x6E,0x33,0x33,0x3E,0x30,0x78, // p
+    0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x0F, // q
+    0x00,0x00,0x6E,0x3B,0x33,0x30,0x78,0x00, // r
+    0x00,0x00,0x3E,0x60,0x3C,0x06,0x7C,0x00, // s
+    0x08,0x18,0x3E,0x18,0x18,0x1A,0x0C,0x00, // t
+    0x00,0x00,0x66,0x66,0x66,0x66,0x3B,0x00, // u
+    0x00,0x00,0x66,0x66,0x66,0x3C,0x18,0x00, // v
+    0x00,0x00,0x63,0x6B,0x7F,0x7F,0x36,0x00, // w
+    0x00,0x00,0x63,0x36,0x1C,0x36,0x63,0x00, // x
+    0x00,0x00,0x66,0x66,0x66,0x3E,0x06,0x7C, // y
+    0x00,0x00,0x7E,0x4C,0x18,0x32,0x7E,0x00, // z
+    0x0E,0x18,0x18,0x70,0x18,0x18,0x0E,0x00, // {
+    0x0C,0x0C,0x0C,0x00,0x0C,0x0C,0x0C,0x00, // |
+    0x70,0x18,0x18,0x0E,0x18,0x18,0x70,0x00, // }
+    0x3B,0x6E,0x00,0x00,0x00,0x00,0x00,0x00, // ~
+    0x1C,0x36,0x36,0x1C,0x00,0x00,0x00,0x00
+}; // DEL
+
+void NokiaLCD::locate(int column, int row) {
+    _column = column;
+    _row = row;
+}
+
+void NokiaLCD::newline() {
+    _column = 0;
+    _row++;
+    if (_row >= _rows) {
+        _row = 0;
+    }
+}
+
+int NokiaLCD::_putc(int value) {
+    int x = _column * 8;  // FIXME: Char sizes
+    int y = _row * 8;
+    bitblit(x + 1, y + 1, 8, 8, (char*)&(FONT8x8[value - 0x1F][0]));
+
+    _column++;
+
+    if (_column >= NOKIALCD_COLS) {
+        _row++;
+        _column = 0;
+    }
+
+    if (_row >= NOKIALCD_ROWS) {
+        _row = 0;
+    }
+
+    return value;
+}
+
+void NokiaLCD::cls() {
+    fill(0, 0, NOKIALCD_WIDTH, NOKIALCD_HEIGHT, _background);
+    _row = 0;
+    _column = 0;
+}
+
+
+void NokiaLCD::window(int x, int y, int width, int height) {
+    _cs = 0;
+    _window(x, y, width, height);
+    _cs = 1;
+}
+
+void NokiaLCD::putp(int colour) {
+    _cs = 0;
+    _putp(colour);
+    _cs = 1;
+}
+
+void NokiaLCD::pixel(int x, int y, int colour) {
+    _cs = 0;
+    _window(x, y, 1, 1);
+    switch (_type) {
+        case LCD6100:
+            int r4 = (colour >> (16 + 4)) & 0xF;
+            int g4 = (colour >> (8 + 4)) & 0xF;
+            int b4 = (colour >> (0 + 4)) & 0xF;
+            int d1 = (r4 << 4) | g4;
+            int d2 = (b4 << 4) | r4;
+            int d3 = (g4 << 4) | b4;
+            data(d1); 
+            data(d2);   
+            data(d3);
+            
+          break;
+        case PCF8833:
+            _putp(colour);
+            break;
+        case LCD6610:
+      }
+    _cs = 1;
+}
+
+void NokiaLCD::fill(int x, int y, int width, int height, int colour) {
+    _cs = 0;
+    _window(x, y, width, height);
+    switch (_type) {
+        case LCD6610:
+        case PCF8833:
+            for (int i=0; i<width*height; i++) {
+                _putp(colour);
+            }
+            break;
+        case LCD6100:
+            for (int i=0; i<width*height/2; i++) {
+                int r4 = (colour >> (16 + 4)) & 0xF;
+                int g4 = (colour >> (8 + 4)) & 0xF;
+                int b4 = (colour >> (0 + 4)) & 0xF;
+                int d1 = (r4 << 4) | g4;
+                int d2 = (b4 << 4) | r4;
+                int d3 = (g4 << 4) | b4;
+                data(d1); 
+                data(d2);   
+                data(d3);
+            }
+            break;
+    }
+    _window(0, 0, NOKIALCD_WIDTH, NOKIALCD_HEIGHT);
+    _cs = 1;
+}
+
+void NokiaLCD::blit(int x, int y, int width, int height, const int* colour) {
+    _cs = 0;
+    _window(x, y, width, height);
+
+    switch (_type) {
+        case LCD6610:
+        case PCF8833:
+            for (int i=0; i<width*height; i++) {
+                 _putp(colour[i]);
+             }
+             break;
+        case LCD6100:
+            for (int i=0; i<width*height/2; i++) {
+                int r41 = (colour[i*2] >> (16 + 4)) & 0xF;
+                int g41 = (colour[i*2] >> (8 + 4)) & 0xF;
+                int b41 = (colour[i*2] >> (0 + 4)) & 0xF;
+           
+                int r42 = (colour[i*2+1] >> (16 + 4)) & 0xF;
+                int g42 = (colour[i*2+1] >> (8 + 4)) & 0xF;
+                int b42 = (colour[i*2+1] >> (0 + 4)) & 0xF;   
+                int d1 = (r41 << 4) | g41;
+                int d2 = (b41 << 4) | r42;
+                int d3 = (g42 << 4) | b42;               
+                   data(d1); 
+                data(d2); 
+                data(d3); 
+            }
+            break;
+     }            
+    _window(0, 0, NOKIALCD_WIDTH, NOKIALCD_HEIGHT);
+    _cs = 1;
+}
+
+void NokiaLCD::bitblit(int x, int y, int width, int height, const char* bitstream) {
+    _cs = 0;
+    _window(x, y, width, height);
+
+    switch (_type) {
+        case LCD6610:
+        case PCF8833:
+            for (int i=0; i<height*width; i++) {
+                int byte = i / 8;
+                int bit = i % 8;
+                int colour = ((bitstream[byte] << bit) & 0x80) ? _foreground : _background;
+                _putp(colour);
+            }
+            break;
+        case LCD6100:
+            for(int i=0; i<height*width/2; i++) {
+                int byte1 = (i*2) / 8;
+                int bit1 = (i*2) % 8;   
+                int colour1 = ((bitstream[byte1] << bit1) & 0x80) ? _foreground : _background;
+                int byte2 = (i*2+1) / 8;
+                int bit2 = (i*2+1) % 8;   
+                int colour2 = ((bitstream[byte2] << bit2) & 0x80) ? _foreground : _background;
+    
+                int r41 = (colour1 >> (16 + 4)) & 0xF;
+                int g41 = (colour1 >> (8 + 4)) & 0xF;
+                int b41 = (colour1 >> (0 + 4)) & 0xF;
+           
+                int r42 = (colour2 >> (16 + 4)) & 0xF;
+                int g42 = (colour2 >> (8 + 4)) & 0xF;
+                int b42 = (colour2 >> (0 + 4)) & 0xF;   
+                int d1 = (r41 << 4) | g41;
+                int d2 = (b41 << 4) | r42;
+                int d3 = (g42 << 4) | b42;               
+                   data(d1); 
+                data(d2); 
+                data(d3); 
+            }
+            break;
+     }
+    _window(0, 0, _width, _height);
+    _cs = 1;
+}
+
+void NokiaLCD::foreground(int c) {
+    _foreground = c;
+}
+
+void NokiaLCD::background(int c) {
+    _background = c;
+}
+
+int NokiaLCD::width() {
+    return NOKIALCD_WIDTH;
+}
+
+int NokiaLCD::height() {
+    return NOKIALCD_HEIGHT;
+}
+
+int NokiaLCD::columns() {
+    return NOKIALCD_COLS;
+}
+
+int NokiaLCD::rows() {
+    return NOKIALCD_ROWS;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/NokiaLCD.h	Sat Mar 09 00:51:21 2013 +0000
@@ -0,0 +1,149 @@
+/* mbed NokiaLCD Library, for a 130x130 Nokia colour LCD
+ * Copyright (c) 2007-2010, sford
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#ifndef MBED_NOKIALCD_H
+#define MBED_NOKIALCD_H
+
+#include "mbed.h"
+
+/** An interface for the 130x130 Nokia Mobile phone screens
+ *
+ * @code
+ * #include "mbed.h"
+ * #include "NokiaLCD.h"
+ *
+ * NokiaLCD lcd(p5, p7, p8, p9, NokiaLCD::6610); // mosi, sclk, cs, rst, type
+ *
+ * int main() {
+ *     lcd.printf("Hello World!");
+ * }
+ * @endcode
+ */
+class NokiaLCD : public Stream {
+
+public:
+    /** LCD panel format */
+    enum LCDType {
+        LCD6100     /**< Nokia 6100, as found on sparkfun board (default) */
+        , LCD6610   /**< Nokia 6610, as found on olimex board */
+        , PCF8833
+    };
+
+    /** Create and Nokia LCD interface, using a SPI and two DigitalOut interfaces
+     *
+     * @param mosi SPI data out
+     * @param sclk SPI clock
+     * @param cs Chip Select (DigitalOut)
+     * @param rst Reset (DigitalOut)
+     * @param type The LCDType to select driver chip variants
+     */
+    NokiaLCD(PinName mosi, PinName sclk, PinName cs, PinName rst, LCDType type = LCD6100);
+
+#if DOXYGEN_ONLY
+    /** Write a character to the LCD
+     *
+     * @param c The character to write to the display
+     */
+    int putc(int c);
+
+    /** Write a formated string to the LCD
+     *
+     * @param format A printf-style format string, followed by the
+     *               variables to use in formating the string.
+     */
+    int printf(const char* format, ...);
+#endif
+
+    /** Locate to a screen column and row
+     *
+     * @param column  The horizontal position from the left, indexed from 0
+     * @param row     The vertical position from the top, indexed from 0
+     */
+    void locate(int column, int row);
+
+    /** Clear the screen and locate to 0,0 */
+    void cls();
+
+    /** Set a pixel on te screen
+     * 
+     * @param x horizontal position from left
+     * @param y vertical position from top
+     * @param colour 24-bit colour in format 0x00RRGGBB
+     */
+    void pixel(int x, int y, int colour);
+    
+    /** Fill an area of the screen
+     * 
+     * @param x horizontal position from left
+     * @param y vertical position from top
+     * @param width width in pixels
+     * @param height height in pixels
+     * @param colour 24-bit colour in format 0x00RRGGBB
+     */    
+    void fill(int x, int y, int width, int height, int colour);
+
+    void blit(int x, int y, int width, int height, const int* colour);
+    void bitblit(int x, int y, int width, int height, const char* bitstream);
+
+    int width();
+    int height();
+    int columns();
+    int rows();
+
+    void reset();
+
+    /** Set the foreground colour
+     * 
+     * @param c 24-bit colour
+     */
+    void foreground(int c);
+
+    /** Set the background colour
+     * 
+     * @param c 24-bit colour
+     */
+    void background(int c);
+
+protected:
+    virtual void _window(int x, int y, int width, int height);
+    virtual void _putp(int colour);
+
+    void command(int value);
+    void data(int value);
+
+    void newline();
+    virtual int _putc(int c);
+    virtual int _getc() {
+        return 0;
+    }
+    void putp(int v);
+    void window(int x, int y, int width, int height);
+
+    SPI _spi;
+    DigitalOut _rst;
+    DigitalOut _cs;
+
+    LCDType _type;
+    int _row, _column, _rows, _columns, _foreground, _background, _width, _height;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sat Mar 09 00:51:21 2013 +0000
@@ -0,0 +1,398 @@
+/*Vinod Modhe*/
+/* 4180 Lab3 */
+
+#include "mbed.h"
+#include "IR_Def.h"
+#include "NokiaLCD.h"
+
+Ticker  system_clock;                                               //This will be used to increment a counter every msec inside it's ISR
+Timer T;                                                            //Timer used for measuring time interval between successive edges of IR input signal
+InterruptIn IR(p30);                                                //Pin to which IR receiver is connected
+void IR_ISR();                                                      //ISR for decoding the IR signal
+void dummy_ISR();                                                   //Required so that 'IR_ISR' is not called on both rising and falling edges of IR signal at the same time
+void sys_tick();                                                    //ISR for 1 msec. system clock
+void RGB_LED(int red, int green, int blue);                         //For writing to ShiftBrite
+LocalFileSystem local("local");                                     // Create the local filesystem under the name "local"
+
+//On board LEDs
+DigitalOut led1(LED1);
+DigitalOut led2(LED2);
+DigitalOut led3(LED3);
+DigitalOut led4(LED4);
+
+//Pin for entering config mode
+DigitalIn config_pin(p21);
+
+//Power Switch Tail
+DigitalOut switch_tail(p20);
+
+//ShiftBrite
+DigitalOut latch(p15);
+DigitalOut enable(p16);
+SPI spi(p11, p12, p13);
+
+//Nokia LCD
+NokiaLCD lcd(p5, p7, p8, p9, NokiaLCD::LCD6100); // mosi, sclk, cs, rst, type
+
+//Global IR variables
+uint8_t state = 0;                       //State variable for IR state machine
+uint8_t Rx_count = 0;                                //Counter to count no. of bits received
+uint32_t Rx_buf = 0;                 //To store recevied IR data
+char Rx_flag = 0;                    //Flag which indicates that a valid IR command was received
+uint32_t Rx_rep_count = 0;           //To keep track of how many repeat pulses are received
+uint32_t Rx_rep_timeout_count = 0;   //Timer which clears the previously received IR command, once it reaches the set limit
+uint32_t T_buf = 0;                  //Buffer to hold value of timer T
+char Rx_ignore_rep_flag = 0;         //0 => Do not ignore repeat pulses
+
+typedef struct IR_Key_Codes {
+    uint32_t red_p,red_m;                   //Key codes for Red+ and Red-
+    uint32_t green_p,green_m;               //Key codes for Green+ and Green-
+    uint32_t blue_p,blue_m;                 //Key codes for Blue+ and Blue-
+    uint32_t switch_tail;                   //Key code for power switch tail
+} IR_t;
+
+int main()
+{
+    switch_tail = 0;                                //Turn OFF the power switch tail
+
+    led1 = led2 = led3 = led4 = 1;                  //Turn ON all LEDs to indicate initialization
+
+    //Nokia LCD Init
+    lcd.background(0x000000);                       //Set background to white
+    lcd.cls();                                      //Clear Screen
+    lcd.locate(0,1);                                //Go to line 1
+    lcd.printf(" R   G   B  FAN");                  //Display this text
+    lcd.locate(0,2);                                //Go to line 2
+    lcd.printf(" 0   0   0  OFF");                  //Display this text
+    lcd.locate(0,15);                               //Go to line 15
+    lcd.printf("100 100 100");                      //Display this text
+
+    config_pin.mode(PullUp);                            //Enable internal pullup
+
+    wait(0.5);
+
+    if(config_pin == 0) {                               //If config pin is pulled low, enter config mode, in which key codes are to be saved in the "IRCodes.txt" file
+        led1 = led4 = 0;
+        led2 = led3 = 1;
+        wait(0.5);
+        Rx_ignore_rep_flag = 1;                   //Ignore repeat pulses while in config mode
+
+        IR_t temp;                                      //Temporary variable to hold the received key codes
+
+        //IR Init
+        IR.mode(PullNone);                              //Disable internal pullup
+        system_clock.attach_us(&sys_tick, 1000);        //This will call the function 'sys_tick' every 1 msec.
+        IR.fall(&IR_ISR);                               //Set IR interrupt to occur on falling edge
+        IR.rise(&dummy_ISR);
+
+        //Store the received IR codes into temp, while ignoring repeat pulses
+        led1 = led2 = led3 = 0;
+        led4 = 1;
+        while(Rx_flag == 0);                                             //Wait for a valid command
+        temp.red_p = Rx_buf;                                              //Copy it into the temp variable
+        Rx_flag = 0;                                                     //Reset the flag
+
+        led1 = led2 = led4 = 0;
+        led3 = 1;
+        while(Rx_flag == 0);
+        temp.red_m = Rx_buf;
+        Rx_flag = 0;
+
+        led1 = led2 = 0;
+        led3 = led4 = 1;
+        while(Rx_flag == 0);
+        temp.green_p = Rx_buf;
+        Rx_flag = 0;
+
+        led1 = led3 = led4 = 0;
+        led2 = 1;
+        while(Rx_flag == 0);
+        temp.green_m = Rx_buf;
+        Rx_flag = 0;
+
+        led1 = led3 = 0;
+        led2 = led4 = 1;
+        while(Rx_flag == 0);
+        temp.blue_p = Rx_buf;
+        Rx_flag = 0;
+
+        led1 = led4 = 0;
+        led2 = led3 = 1;
+        while(Rx_flag == 0);
+        temp.blue_m = Rx_buf;
+        Rx_flag = 0;
+
+        led1 = 0;
+        led2 = led3 = led4 = 1;
+        while(Rx_flag == 0);
+        temp.switch_tail = Rx_buf;
+        Rx_flag = 0;
+
+        FILE *fp = fopen("/local/IRCodes.txt", "w");  // Open "IRCodes.txt" on the local file system for writing
+
+        if(fp != NULL) {                                                            //File was opened successfully
+            //Write the key codes into the file one by one in the correct order
+            fprintf(fp, "%x ", temp.red_p);
+            fprintf(fp, "%x ", temp.red_m);
+            fprintf(fp, "%x ", temp.green_p);
+            fprintf(fp, "%x ", temp.green_m);
+            fprintf(fp, "%x ", temp.blue_p);
+            fprintf(fp, "%x ", temp.blue_m);
+            fprintf(fp, "%x ", temp.switch_tail);
+
+            fclose(fp);
+
+            led1 = led2 = led3 = led4 = 1;
+        } else {                                                                                //File could not be opened
+            led1 = 1;
+            led2 = 0;
+            led3 = 1;
+            led4 = 0;
+
+            while(1) {                                                                      //Stop executing further code and display error lights
+                led1 = !led1;
+                led2 = !led2;
+                led3 = !led3;
+                led4 = !led4;
+
+                wait(0.5);
+            }
+        }
+        Rx_ignore_rep_flag = 0;                         //Disable this flag to not ignore repeat pulses while in normal mode
+    }
+
+    IR_t key_code;                                                                  //Struct variable holding all key codes
+
+    //File System Init
+    FILE *fp = fopen("/local/IRCodes.txt", "r");    // Open "IRCodes.txt" on the local file system for reading
+
+    if(fp != NULL) {                                                                //File was opened successfully
+        fscanf(fp, "%8x", &(key_code.red_p));                   //Read the key codes from the file into the respective struct members
+        fscanf(fp, "%8x", &(key_code.red_m));
+        fscanf(fp, "%8x", &(key_code.green_p));
+        fscanf(fp, "%8x", &(key_code.green_m));
+        fscanf(fp, "%8x", &(key_code.blue_p));
+        fscanf(fp, "%8x", &(key_code.blue_m));
+        fscanf(fp, "%8x", &(key_code.switch_tail));
+        fclose(fp);
+    } else {                                                                                //File could not be opened
+        led1 = 1;
+        led2 = 0;
+        led3 = 1;
+        led4 = 0;
+
+        while(1) {                                                                      //Stop executing further code and display error lights
+            led1 = !led1;
+            led2 = !led2;
+            led3 = !led3;
+            led4 = !led4;
+
+            wait(0.5);
+        }
+    }
+
+    //Shiftbrite Init
+    int red=0;
+    int green=0;
+    int blue=0;
+    spi.format(16,0);
+    spi.frequency(500000);
+    enable=0;
+    latch=0;
+    wait(2);
+
+    RGB_LED( red, green, blue);
+    wait(.1);
+
+    //IR Init
+    IR.mode(PullNone);                        //Disable internal pullup
+    system_clock.attach_us(&sys_tick, 1000);  //This will call the function 'sys_tick' every 1 msec.
+    IR.fall(&IR_ISR);                         //Set IR interrupt to occur on falling edge
+    IR.rise(&dummy_ISR);
+
+    led1 = led2 = led3 = led4 = 0;            //Turn OFF all LEDs to indicate initialization is done
+
+    while(1) {
+        if(Rx_flag == 1) {
+            Rx_flag = 0;
+
+            if(Rx_buf == key_code.red_p) {
+                if((red += 10) > 100) {
+                    red = 100;
+                }
+
+                //Display the scaled rectangle
+                lcd.fill(5,  28, 20, 90, 0x000000);                 //Erase original rectangle
+                lcd.fill(5,  28, 20, (red/10 * 9), 0x0000FF);       //Draw red rectangle
+            } else if(Rx_buf == key_code.red_m) {
+                if((red -= 10) < 0) {
+                    red = 0;
+                }
+
+                //Display the scaled rectangle
+                lcd.fill(5,  28, 20, 90, 0x000000);                 //Erase original rectangle
+                lcd.fill(5,  28, 20, (red/10 *9), 0x0000FF);        //Draw red rectangle
+            } else if(Rx_buf == key_code.green_p) {
+                if((green += 10) > 100) {
+                    green = 100;
+                }
+
+                //Display the scaled rectangle
+                lcd.fill(36,  28, 20, 90, 0x000000);                 //Erase original rectangle
+                lcd.fill(36,  28, 20, (green/10 * 9), 0x00FF00);     //Draw green rectangle
+            } else if(Rx_buf == key_code.green_m) {
+                if((green -= 10) < 0) {
+                    green = 0;
+                }
+
+                //Display the scaled rectangle
+                lcd.fill(36,  28, 20, 90, 0x000000);                 //Erase original rectangle
+                lcd.fill(36,  28, 20, (green/10 * 9), 0x00FF00);     //Draw green rectangle
+            } else if(Rx_buf == key_code.blue_p) {
+                if((blue += 10) > 100) {
+                    blue = 100;
+                }
+
+                //Display the scaled rectangle
+                lcd.fill(67,  28, 20, 90, 0x000000);                 //Erase original rectangle
+                lcd.fill(67,  28, 20, (blue/10 * 9), 0xFF0000);      //Draw blue rectangle
+            } else if(Rx_buf == key_code.blue_m) {
+                if((blue -= 10) < 0) {
+                    blue = 0;
+                }
+
+                //Display the scaled rectangle
+                lcd.fill(67,  28, 20, 90, 0x000000);                 //Erase original rectangle
+                lcd.fill(67,  28, 20, (blue/10* 9), 0xFF0000);          //Draw blue rectangle
+            } else if((Rx_buf == key_code.switch_tail) && (Rx_rep_count == 0)) { //Do not consider repeat pulses for switch tail to avoid rapid switching
+                switch_tail = !switch_tail;
+
+                if(switch_tail == 0) {                              //Fan OFF
+                    lcd.locate(0,2);                                //Go to line 2
+                    lcd.printf(" 0   0   0  OFF");                  //Display this text
+                } else if(switch_tail == 1) {                       //Fan ON
+                    lcd.locate(0,2);                                //Go to line 2
+                    lcd.printf(" 0   0   0  ON ");                  //Display this text
+                }
+
+            }
+
+            RGB_LED( red, green, blue);                       //Write to ShiftBrite after receiving a valid command
+            wait(.1);
+        }
+
+        wait_us(100);                                                     //Wait for 0.1ms
+    }
+}
+
+void RGB_LED(int red, int green, int blue)
+{
+    unsigned int low_color=0;
+    unsigned int high_color=0;
+    high_color=(blue<<4)|((red&0x3C0)>>6);
+    low_color=(((red&0x3F)<<10)|(green));
+    spi.write(high_color);
+    spi.write(low_color);
+    latch=1;
+    latch=0;
+}
+
+void sys_tick()
+{
+    if(Rx_rep_timeout_count < 0xFFFF) { //Do not increment counter beyond 0xFFFF to prevent roll-over
+        ++Rx_rep_timeout_count;       //Increment this counter every 1msec.
+    }
+}
+
+void IR_ISR()
+{
+    if(state == 0) {
+        T.stop();               //Stop timer
+        T.reset();              //Reset timer
+        T.start();              //Start timer
+        IR.rise(&IR_ISR);       //Set IR interrupt to occur on rising edge
+        IR.fall(&dummy_ISR);
+        state = 1;              //Go to next state
+        Rx_count = 0;           //Clear the received bits counter
+    } else if(state == 1) {
+        T.stop();                          //Stop timer
+        T_buf = (uint32_t)T.read_us();     //Read timer
+        T.reset();                         //Reset timer
+        T.start();                         //Start timer
+        IR.fall(&IR_ISR);                  //Set IR interrupt to occur on falling edge
+        IR.rise(&dummy_ISR);
+
+        if(T_buf <= IR_9000us_UL && T_buf >= IR_9000us_LL) { //Check for preamble start pulse(9ms)
+            state = 2;  //Go to next state
+        } else {
+            state = 0; //Reset the state machine
+        }
+    } else if(state == 2) {
+        T.stop();                          //Stop timer
+        T_buf = (uint32_t)T.read_us();     //Read the value in timer
+        T.reset();                         //Reset timer
+        T.start();                         //Start timer
+        IR.fall(&IR_ISR);                  //Set IR interrupt to occur on falling edge
+        IR.rise(&dummy_ISR);
+
+        if(T_buf <= IR_4500us_UL && T_buf >= IR_4500us_LL) { //Check for preamble space(4.5ms)
+            state = 3;                  //Go to next state
+            Rx_rep_timeout_count = 0;   //Reset counter
+            Rx_rep_count = 0;           //Reset the repeat pulse counter
+        } else if(T_buf <= IR_2250us_UL && T_buf >= IR_2250us_LL) { //Check for repeat pulse(2.25ms)
+            state = 0;                      //Reset the state machine
+
+            if(Rx_rep_count < 0xFFFF) {
+                if(Rx_rep_timeout_count < IR_rep_timeout_ms) {  //Only increment the repeat pulse counter if the delay between two successive repeat pulses is less than 135msec.
+                    Rx_rep_timeout_count = 0;                   //Reset the counter everytime a valid repeat pulse is received
+                    ++Rx_rep_count;
+                } else {                                         //Invald repeat pulse received
+                    Rx_rep_count = 0;                            //Reset counter
+                    Rx_flag = 0;                                 //Clear the flag to indicate that an IR command was not received
+                    Rx_buf = 0;                                  //Clear the previously received command
+                }
+            }
+            goto ahead;                    //Repeat the previous command
+        } else { //Wrong pulse
+            Rx_rep_count = 0;     //Reset counter
+            state = 0;                       //Reset the state machine
+        }
+    } else if(state == 3) {
+        T.stop();                      //Stop timer
+        T_buf = T.read_us();          //Read the value in timer
+        T.reset();                     //Reset timer
+        T.start();                     //Start timer
+        IR.fall(&IR_ISR);              //Set IR interrupt to occur on falling edge
+        IR.rise(&dummy_ISR);
+
+        if(T_buf <= IR_1_UL_us && T_buf >= IR_1_LL_us) { //Check if bit is '1'(2.25ms)
+            ++Rx_count;              //Increment the bit counter
+            Rx_buf >>= 1;
+            Rx_buf |= 0x80000000;     //Shift in a '1' from the left side
+            state = 3;               //Remain in current state
+        } else if(T_buf <= IR_0_UL_us && T_buf >= IR_0_LL_us) { //Check if bit is '0'(1.12ms)
+            ++Rx_count;         //Increment the bit counter
+            Rx_buf >>= 1;        //Shift in a '0' from the left side
+            state = 3;          //Remain in current state
+        } else { //Invalid data received
+            Rx_count = 0;//Reset the bit counter
+            state = 0;   //Reset state m/c
+        }
+
+        if(Rx_count == 32) { //Check if all 32 bits have been received
+            state = 0;       //Reset state m/c
+
+ahead:
+
+            if(!((Rx_rep_count > 0) && (Rx_ignore_rep_flag == 1))) {
+                Rx_flag = 1;                             //Set this flag for repeat pulses only if repeat pulses are to be considered
+            }
+            Rx_rep_timeout_count = 0;         //Reset the counter everytime a valid command is received
+        }
+    }
+}
+
+void dummy_ISR()
+{
+    //Do nothing
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Sat Mar 09 00:51:21 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/5e5da4a5990b
\ No newline at end of file