![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Poker code for Secondary Mbed
Revision 0:1324145f6904, committed 2013-12-11
- Comitter:
- wjenkins7
- Date:
- Wed Dec 11 07:07:19 2013 +0000
- Commit message:
- Mbed Poker Secondary
Changed in this revision
diff -r 000000000000 -r 1324145f6904 NokiaLCD.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/NokiaLCD.cpp Wed Dec 11 07:07:19 2013 +0000 @@ -0,0 +1,482 @@ +/* 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 130 +#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 LCD6100: + case LCD6610: + 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++; + _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: + case PCF8833: + + _putp(colour); + + break; + case LCD6610: + + 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; + } + _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 LCD6100: + case PCF8833: + for (int i=0; i<width*height; i++) { + _putp(colour); + } + break; + case LCD6610: + 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 LCD6100: + case PCF8833: + for (int i=0; i<width*height; i++) { + _putp(colour[i]); + } + break; + case LCD6610: + 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 LCD6100: + 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 LCD6610: + 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; +}
diff -r 000000000000 -r 1324145f6904 NokiaLCD.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/NokiaLCD.h Wed Dec 11 07:07:19 2013 +0000 @@ -0,0 +1,151 @@ +/* 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 + +
diff -r 000000000000 -r 1324145f6904 NokiaLCD.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/NokiaLCD.lib Wed Dec 11 07:07:19 2013 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/simon/code/NokiaLCD/#2d1b23692cbb
diff -r 000000000000 -r 1324145f6904 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed Dec 11 07:07:19 2013 +0000 @@ -0,0 +1,606 @@ +#include "mbed.h" +#include <mpr121.h> +#include "NokiaLCD.h" + +Serial device(p13,p14); +Serial pc(USBTX, USBRX); + +//PwmOut IRLED(p21); +// Setup the i2c bus on pins 28 and 27 +I2C i2c1(p9, p10); +I2C i2c2(p28, p27); + +// Setup the Mpr121: +// constructor(i2c object, i2c address of the mpr121) +Mpr121 mpr1(&i2c1, Mpr121::ADD_VSS); +Mpr121 mpr2(&i2c2, Mpr121::ADD_VSS); + +NokiaLCD lcd2(p5, p7, p8, p15, NokiaLCD::LCD6610); // mosi, sclk, cs, rst, type +//NokiaLCD lcd3(p5, p7, p16, p17, NokiaLCD::LCD6610); +NokiaLCD lcd1(p5, p7, p18, p19, NokiaLCD::LCD6610); + +void print_on_lcd(int n, int suit, int card, int id) +{ + char x,y,w; + x = 0; + y = 0; + w = 0; + switch(id) { + case 0: + // lcd1.reset(); + lcd1.background(0x2b8135); + lcd1.foreground(0x000000); + // lcd1.cls(); + lcd1.locate(0,3); + /*if(n >= 0) { + lcd1.printf("Raise to %d",n); + } + if(n == -1) { + lcd1.printf("Fold"); + } + if(n == -2) { + lcd1.printf("Call"); + } + if(n == -4) { + lcd1.reset(); + lcd1.cls(); + lcd1.printf("Time up!"); + } + if (n==-3) { + lcd1.printf("Exceeds limit, enter new value"); + }*/ + + if(n == -6) { + lcd1.locate(5,6); + if((suit==1)||(suit==2))lcd1.foreground(0x000000); + if((suit==3)||(suit==4))lcd1.foreground(0xFF0000); + if(suit == 1) { + y = 'S'; + } else if(suit == 2) { + y = 'C'; + } else if(suit == 3) { + y = 'H'; + } else y = 'D'; + if(card==2) x = '2'; + else if(card == 3) x = '3'; + else if(card == 4) x = '4'; + else if(card == 5) x = '5'; + else if(card == 6) x = '6'; + else if(card == 7) x = '7'; + else if(card == 8) x = '8'; + else if(card == 9) x = '9'; + else if(card == 10) { + x = '1'; + w = '0'; + lcd1.printf(" %c %c%c", y, x, w); + } else if(card == 11) x = 'J'; + else if (card == 12) x = 'Q'; + else if (card == 13) x = 'K'; + else if (card == 1) x = 'A'; + if(card!=10)lcd1.printf(" %c %c", y, x); + } + if(n == -5) { + lcd1.locate(5,8); + if((suit==1)||(suit==2))lcd1.foreground(0x000000); + if((suit==3)||(suit==4))lcd1.foreground(0xFF0000); + if(suit == 1) { + y = 'S'; + } else if(suit == 2) { + y = 'C'; + } else if(suit == 3) { + y = 'H'; + } else y = 'D'; + if(card==2) x = '2'; + else if(card == 3) x = '3'; + else if(card == 4) x = '4'; + else if(card == 5) x = '5'; + else if(card == 6) x = '6'; + else if(card == 7) x = '7'; + else if(card == 8) x = '8'; + else if(card == 9) x = '9'; + else if(card == 0) { + x = '1'; + w = '0'; + lcd1.printf(" %c %c%c", y, x, w); + } else if(card == 11) x = 'J'; + else if (card == 12) x = 'Q'; + else if (card == 13) x = 'K'; + else if (card == 1) x = 'A'; + if(card!=10)lcd1.printf(" %c %c", y, x); + } + break; + case -9: + if(suit==0) { + lcd1.foreground(0x000000); + lcd1.locate(0, 1); + lcd1.printf("Current wallet:"); + lcd1.locate(6,3); + lcd1.printf("%d",n); + } else if(suit==1) { + lcd2.foreground(0x000000); + lcd2.locate(0, 1); + lcd2.printf("Current wallet:"); + lcd2.locate(6,3); + lcd2.printf("%d",n); + } + break; + case -8://(bet-Playerbet[ID],ID, 0, -8) + if(suit==0) { + lcd1.foreground(0x000000); + lcd1.locate(4, 10); + if(card==0)lcd1.printf("To Call: "); + if(card==1)lcd1.printf("To Raise:"); + lcd1.locate(6,12); + lcd1.printf("%d",n); + } else if(suit==1) { + lcd2.foreground(0x000000); + lcd2.locate(4, 10); + if(card==0)lcd2.printf("To Call:"); + if(card==1)lcd2.printf("To Raise:"); + lcd2.locate(6,12); + lcd2.printf("%d",n); + } + break; + case 1: + //lcd2.reset(); + lcd2.background(0x2b8135); + lcd2.foreground(0x000000); + //lcd2.cls(); + lcd2.locate(0,3); + /*if(n >= 0) { + lcd2.printf("Raise to %d",n); + } + if(n == -1) { + lcd2.printf("Fold"); + } + if(n == -2) { + lcd2.printf("Call"); + } + if(n == -4) { + lcd2.reset(); + lcd2.cls(); + lcd2.printf("Time up!"); + } + if (n == -3) { + lcd2.printf("Exceeds limit, enter new value"); + }*/ + + if(n == -6) { + lcd2.locate(5,6); + if((suit==1)||(suit==2))lcd2.foreground(0x000000); + if((suit==3)||(suit==4))lcd2.foreground(0xFF0000); + if(suit == 1) { + y = 'S'; + } else if(suit == 2) { + y = 'C'; + } else if(suit == 3) { + y = 'H'; + } else y = 'D'; + if(card==2) x = '2'; + else if(card == 3) x = '3'; + else if(card == 4) x = '4'; + else if(card == 5) x = '5'; + else if(card == 6) x = '6'; + else if(card == 7) x = '7'; + else if(card == 8) x = '8'; + else if(card == 9) x = '9'; + else if(card == 0) { + x = '1'; + w = '0'; + lcd2.printf(" %c %c%c", y, x, w); + } else if(card == 11) x = 'J'; + else if (card == 12) x = 'Q'; + else if (card == 13) x = 'K'; + else if (card == 1) x = 'A'; + if(card!=10)lcd2.printf(" %c %c", y, x); + } + + if(n == -5) { + lcd2.locate(5,8); + if((suit==1)||(suit==2))lcd2.foreground(0x000000); + if((suit==3)||(suit==4))lcd2.foreground(0xFF0000); + if(suit == 1) { + y = 'S'; + } else if(suit == 2) { + y = 'C'; + } else if(suit == 3) { + y = 'H'; + } else y = 'D'; + if(card==2) x = '2'; + else if(card == 3) x = '3'; + else if(card == 4) x = '4'; + else if(card == 5) x = '5'; + else if(card == 6) x = '6'; + else if(card == 7) x = '7'; + else if(card == 8) x = '8'; + else if(card == 9) x = '9'; + else if(card == 10) { + x = '1'; + w = '0'; + lcd2.printf(" %c %c%c", y, x, w); + } else if(card == 11) x = 'J'; + else if (card == 12) x = 'Q'; + else if (card == 13) x = 'K'; + else if (card == 1) x = 'A'; + if(card!=10)lcd2.printf(" %c %c", y, x); + } + break; + case 2: + lcd1.cls(); + break; + case 3: + lcd2.cls(); + break; + default: + lcd1.cls(); + lcd2.cls(); + x=1; + break; + + } + wait(rand()%1); +} + +int read_keypad(int n) +{ + + pc.printf("\nHello from the mbed & mpr121\n\r"); + + Timer t; + //float s; + //int turn; + unsigned char dataArray[2]; + unsigned int Amount[6]; + int max = 6; + unsigned int Total = 0; + int key = 0; + int count = 0; + //unsigned int card[2] = {3,12}; + //unsigned char suit[2] = {'S','H'}; + + t.reset(); + t.start(); + + while(1) { + //pc.printf("\n Entered value is:"); + if(t.read() == 60.0) { + print_on_lcd(-4, 0, 0, n); + t.stop(); + return 0; + } + if((n == 0)||(n == 1)) { + if(n == 0) { + dataArray[0] = mpr1.read(0x00); + dataArray[1] = mpr1.read(0x01); + } else if(n == 1) { + dataArray[0] = mpr2.read(0x00); + dataArray[1] = mpr2.read(0x01); + } + if(dataArray[0] != 0) { + switch(dataArray[0]) { + case 8: + if(count == max) { + pc.printf("Exceeds limit, enter new value \r\n"); + //print_on_lcd(-3, 0, 0, n); + for(int i=0; i<6; i++) { + Amount[i] = 0; + } + count = 0; + break; + } + pc.printf("MPR value: %d \r\n", 1); + //print_on_lcd(1); + Amount[count] = 1; + count++; + break; + case 128: + if(count == max) { + pc.printf("Exceeds limit, enter new value \r\n"); + //print_on_lcd(-3, 0, 0, n); + for(int i=0; i<6; i++) { + Amount[i] = 0; + } + count = 0; + break; + } + pc.printf("MPR value: %d \r\n", 2); + // print_on_lcd(2); + Amount[count] = 2; + count++; + break; + case 4: + if(count == max) { + pc.printf("Exceeds limit, enter new value \r\n"); + //print_on_lcd(-3, 0, 0, n); + for(int i=0; i<6; i++) { + Amount[i] = 0; + } + count = 0; + break; + } + pc.printf("MPR value: %d \r\n", 4); + // print_on_lcd(4); + Amount[count] = 4; + count++; + break; + case 64: + if(count == max) { + pc.printf("Exceeds limit, enter new value \r\n"); + //print_on_lcd(-3, 0, 0, n); + for(int i=0; i<6; i++) { + Amount[i] = 0; + } + count = 0; + break; + } + pc.printf("MPR value: %d \r\n", 5); + Amount[count] = 5; + // print_on_lcd(5); + count++; + break; + case 2: + if(count == max) { + pc.printf("Exceeds limit, enter new value \r\n"); + //print_on_lcd(-3, 0, 0, n); + for(int i=0; i<6; i++) { + Amount[i] = 0; + } + count = 0; + break; + } + pc.printf("MPR value: %d \r\n", 7); + Amount[count] = 7;//print_on_lcd(7); + count++; + break; + case 32: + if(count == max) { + pc.printf("Exceeds limit, enter new value \r\n"); + //print_on_lcd(-3, 0, 0, n); + for(int i=0; i<6; i++) { + Amount[i] = 0; + } + count = 0; + break; + } + pc.printf("MPR value: %d \r\n", 8);//print_on_lcd(8); + Amount[count] = 8; + count++; + break; + case 1: + + if(count != 0) { + while( count != 0) { + Total += Amount[key]*(pow( 10, (float) (count-1) )); + count--; + key++; + } + pc.printf("Total is: %d \r\n",Total); + //print_on_lcd(Total, 0, 0, n); + for(int i=0; i<6; i++) { + Amount[i] = 0; + } + t.stop(); + return Total; + } else { + pc.printf("MPR value: %s \r\n", "Call"); + print_on_lcd(-2, 0, 0, n); + t.stop(); + return -2; + } + case 16: + if(count == max) { + pc.printf("Exceeds limit, enter new value \r\n"); + //print_on_lcd(-3, 0, 0, n); + for(int i=0; i<6; i++) { + Amount[i] = 0; + } + count = 0; + break; + } + pc.printf("MPR value: %d \r\n", 0); + Amount[count] = 0; + count++; + break; + } + wait(0.5); + dataArray[0] = 0; + } else { + if(dataArray[1] != 0) { + switch(dataArray[1]) { + case 8: + if(count == max) { + pc.printf("Exceeds limit, enter new value \r\n"); + //print_on_lcd(-3, 0, 0, n); + for(int i=0; i<6; i++) { + Amount[i] = 0; + } + count = 0; + break; + } + pc.printf("MPR value: %d \r\n", 3); + Amount[count] = 3; + count++; + break; + case 4: + if(count == max) { + pc.printf("Exceeds limit, enter new value \r\n"); + //print_on_lcd(-3, 0, 0, n); + for(int i=0; i<6; i++) { + Amount[i] = 0; + } + count = 0; + break; + } + pc.printf("MPR value: %d \r\n", 6); + Amount[count] = 6; + count++; + break; + case 2: + if(count == max) { + pc.printf("Exceeds limit, enter new value \r\n"); + //print_on_lcd(-3, 0, 0, n); + for(int i=0; i<6; i++) { + Amount[i] = 0; + } + count = 0; + break; + } + pc.printf("MPR value: %d \r\n", 9); + Amount[count] = 9; + count++; + break; + case 1: + if(count != 0) { + while( count != 0) { + Total += Amount[key]*(pow( 10, (float) (count-1) )); + count--; + key++; + } + pc.printf("Total is: %d \r\n",Total); + //print_on_lcd(Total, 0, 0, n); + for(int i=0; i<6; i++) { + Amount[i] = 0; + } + t.stop(); + return Total; + } else { + pc.printf("MPR value: %s \r\n", "Fold"); + //print_on_lcd(-1, 0, 0, n); + for(int i=0; i<6; i++) { + Amount[i] = 0; + } + count = 0; + t.stop(); + return 0; + } + } + wait(0.5); + dataArray[1] = 0; + } + } + } else { + } + } +} + +int main() +{ + char temp = '0',index,tempc,temp_suit,temp_card, n=0; + int player = 0, Amount,Amount1,temp_int,temp_int1,i=0,arr[7],suit[2],card[2]; + //wait(3); + lcd1.reset(); + lcd1.foreground(0x000000); + lcd1.background(0x2b8135); + lcd1.fill(0, 0, 136, 136, 0x2b8135); + lcd1.locate(0,1); + + lcd2.reset(); + lcd2.foreground(0x000000); + lcd2.background(0x2b8135); + lcd2.fill(0, 0, 136, 136, 0x2b8135); + lcd2.locate(0,1); + n=0; + + while(1) { + pc.printf("\nPlayer id is:"); + temp = device.getc(); + if(n==2)n=0; + i=0; + pc.putc(temp); + + + if(temp == '3') player = 0; + if(temp == '4') player = 1; + if(temp == '6') { + print_on_lcd(2,0,0,player); + print_on_lcd(3,0,0,player); + //device.putc(temp); + } else { + //device.putc(temp); + + temp = device.getc(); + pc.printf("\noutside M"); + if(temp == 'M') { + //device.putc(temp); + pc.printf("\ninside M"); + tempc = device.getc(); + //pc.printf("\ntempc=%c",tempc); + //for(int i=0; i<6; i++) { + //index = device.getc(); + while(tempc != 'D') { + arr[i] =(tempc)-48; + pc.printf("\narr[i]=%d",arr[i]); + //if(i==5) tempc = device.getc(); + tempc = device.getc(); + //pc.printf("\ntempc=%c",tempc); + i++; + } + //Amount1=0; + //Amount1 = 1+arr[4]; + //pc.printf("\namount = %d",Amount1); + //Amount1 = (arr[1]*1) + (arr[2]*10) + (arr[3]*100) + (arr[4]*1000); + Amount1 = 0; + for(int j=0; j<6; j++) { + Amount1 = Amount1 + ((pow (10, (float) (j))) * arr[j]); + pc.printf("\nAmount = %d of player %d",Amount1,player); + } + //if(Amount1 == 500) Amount1 = Amount1*10; + pc.printf("\nAmount = %d of player %d",Amount1,player); + + print_on_lcd(Amount1, player, 0, -9); + Amount1=0; + Amount = read_keypad(player); + if(Amount == -2) device.putc('C'); + else if(Amount == 0) device.putc('F'); + else { + device.putc('R'); + temp_int = Amount1-Amount; + for(int i=0; i<7; i++) { + temp_int1 = temp_int% ((int)(pow(10, (float)1))); + temp_int = temp_int/10; + device.putc( (char) temp_int1); + } + print_on_lcd(Amount1-Amount, player, 0, -9); + device.putc('R'); + } + //print_on_lcd(Amount1-Amount, player, 0, -9); + } + + if(temp == 'I') { + temp_suit = device.getc(); + temp_card = device.getc(); + + if(temp_suit == 'S') { + suit[player] = 1; + } else if(temp_suit == 'C') { + suit[player] = 2; + } else if(temp_suit == 'H') { + suit[player] = 3; + } else suit[player] = 4; + if(temp_card=='2') card[player] = 2; + else if(temp_card == '3') card[player] = 3; + else if(temp_card == '4') card[player] = 4; + else if(temp_card == '5') card[player] = 5; + else if(temp_card == '6') card[player] = 6; + else if(temp_card == '7') card[player] = 7; + else if(temp_card == '8') card[player] = 8; + else if(temp_card == '9') card[player] = 9; + else if(temp_card == '0') card[player] = 10; + else if(temp_card == 'J') card[player] = 11; + else if (temp_card == 'Q') card[player] = 12; + else if (temp_card == 'K') card[player] = 13; + else if (temp_card == 'A') card[player] = 1; + print_on_lcd(n-6,suit[player],card[player],player); + pc.printf("\nPlayer:%d suit:%d face:%d n-6:%d", player, suit[player], card[player],n-6); + n++; + } + + if(temp == 'Z') { + if(player == 0) + print_on_lcd(0,0,0,2); + if(player == 1) + print_on_lcd(0,0,0,3); + } + } + } +} \ No newline at end of file
diff -r 000000000000 -r 1324145f6904 mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Wed Dec 11 07:07:19 2013 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/a9913a65894f \ No newline at end of file
diff -r 000000000000 -r 1324145f6904 mpr121.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mpr121.cpp Wed Dec 11 07:07:19 2013 +0000 @@ -0,0 +1,221 @@ +/* +Copyright (c) 2011 Anthony Buckton (abuckton [at] blackink [dot} net {dot} au) + +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. +*/ + +#include <mbed.h> +#include <sstream> +#include <string> +#include <list> + +#include <mpr121.h> + +Mpr121::Mpr121(I2C *i2c, Address i2cAddress) +{ + this->i2c = i2c; + + address = i2cAddress; + + // Configure the MPR121 settings to default + this->configureSettings(); +} + + +void Mpr121::configureSettings() +{ + // Put the MPR into setup mode + this->write(ELE_CFG,0x00); + + // Electrode filters for when data is > baseline + unsigned char gtBaseline[] = { + 0x01, //MHD_R + 0x01, //NHD_R + 0x00, //NCL_R + 0x00 //FDL_R + }; + + writeMany(MHD_R,gtBaseline,4); + + // Electrode filters for when data is < baseline + unsigned char ltBaseline[] = { + 0x01, //MHD_F + 0x01, //NHD_F + 0xFF, //NCL_F + 0x02 //FDL_F + }; + + writeMany(MHD_F,ltBaseline,4); + + // Electrode touch and release thresholds + unsigned char electrodeThresholds[] = { + E_THR_T, // Touch Threshhold + E_THR_R // Release Threshold + }; + + for(int i=0; i<12; i++){ + int result = writeMany((ELE0_T+(i*2)),electrodeThresholds,2); + } + + // Proximity Settings + unsigned char proximitySettings[] = { + 0xff, //MHD_Prox_R + 0xff, //NHD_Prox_R + 0x00, //NCL_Prox_R + 0x00, //FDL_Prox_R + 0x01, //MHD_Prox_F + 0x01, //NHD_Prox_F + 0xFF, //NCL_Prox_F + 0xff, //FDL_Prox_F + 0x00, //NHD_Prox_T + 0x00, //NCL_Prox_T + 0x00 //NFD_Prox_T + }; + writeMany(MHDPROXR,proximitySettings,11); + + unsigned char proxThresh[] = { + PROX_THR_T, // Touch Threshold + PROX_THR_R // Release Threshold + }; + writeMany(EPROXTTH,proxThresh,2); + + this->write(FIL_CFG,0x04); + + // Set the electrode config to transition to active mode + this->write(ELE_CFG,0x0c); +} + +void Mpr121::setElectrodeThreshold(int electrode, unsigned char touch, unsigned char release){ + + if(electrode > 11) return; + + // Get the current mode + unsigned char mode = this->read(ELE_CFG); + + // Put the MPR into setup mode + this->write(ELE_CFG,0x00); + + // Write the new threshold + this->write((ELE0_T+(electrode*2)), touch); + this->write((ELE0_T+(electrode*2)+1), release); + + //Restore the operating mode + this->write(ELE_CFG, mode); +} + + +unsigned char Mpr121::read(int key){ + + unsigned char data[2]; + + //Start the command + i2c->start(); + + // Address the target (Write mode) + int ack1= i2c->write(address); + + // Set the register key to read + int ack2 = i2c->write(key); + + // Re-start for read of data + i2c->start(); + + // Re-send the target address in read mode + int ack3 = i2c->write(address+1); + + // Read in the result + data[0] = i2c->read(0); + + // Reset the bus + i2c->stop(); + + return data[0]; +} + + +int Mpr121::write(int key, unsigned char value){ + + //Start the command + i2c->start(); + + // Address the target (Write mode) + int ack1= i2c->write(address); + + // Set the register key to write + int ack2 = i2c->write(key); + + // Read in the result + int ack3 = i2c->write(value); + + // Reset the bus + i2c->stop(); + + return (ack1+ack2+ack3)-3; +} + + +int Mpr121::writeMany(int start, unsigned char* dataSet, int length){ + //Start the command + i2c->start(); + + // Address the target (Write mode) + int ack= i2c->write(address); + if(ack!=1){ + return -1; + } + + // Set the register key to write + ack = i2c->write(start); + if(ack!=1){ + return -1; + } + + // Write the date set + int count = 0; + while(ack==1 && (count < length)){ + ack = i2c->write(dataSet[count]); + count++; + } + // Stop the cmd + i2c->stop(); + + return count; +} + + +bool Mpr121::getProximityMode(){ + if(this->read(ELE_CFG) > 0x0c) + return true; + else + return false; +} + +void Mpr121::setProximityMode(bool mode){ + this->write(ELE_CFG,0x00); + if(mode){ + this->write(ELE_CFG,0x30); //Sense proximity from ALL pads + } else { + this->write(ELE_CFG,0x0c); //Sense touch, all 12 pads active. + } +} + + +int Mpr121::readTouchData(){ + return this->read(0x00); +} \ No newline at end of file
diff -r 000000000000 -r 1324145f6904 mpr121.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mpr121.h Wed Dec 11 07:07:19 2013 +0000 @@ -0,0 +1,157 @@ +/* +Copyright (c) 2011 Anthony Buckton (abuckton [at] blackink [dot} net {dot} au) + + +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. + + Parts written by Jim Lindblom of Sparkfun + Ported to mbed by A.Buckton, Feb 2011 +*/ + +#ifndef MPR121_H +#define MPR121_H + +//using namespace std; + +class Mpr121 +{ + +public: + // i2c Addresses, bit-shifted + enum Address { ADD_VSS = 0xb4,// ADD->VSS = 0x5a <-wiring on Sparkfun board + ADD_VDD = 0xb6,// ADD->VDD = 0x5b + ADD_SCL = 0xb8,// ADD->SDA = 0x5c + ADD_SDA = 0xba // ADD->SCL = 0x5d + }; + + // Real initialiser, takes the i2c address of the device. + Mpr121(I2C *i2c, Address i2cAddress); + + bool getProximityMode(); + + void setProximityMode(bool mode); + + int readTouchData(); + + unsigned char read(int key); + + int write(int address, unsigned char value); + int writeMany(int start, unsigned char* dataSet, int length); + + void setElectrodeThreshold(int electrodeId, unsigned char touchThreshold, unsigned char releaseThreshold); + +protected: + // Configures the MPR with standard settings. This is permitted to be overwritten by sub-classes. + void configureSettings(); + +private: + // The I2C bus instance. + I2C *i2c; + + // i2c address of this mpr121 + Address address; +}; + + +// MPR121 Register Defines +#define MHD_R 0x2B +#define NHD_R 0x2C +#define NCL_R 0x2D +#define FDL_R 0x2E +#define MHD_F 0x2F +#define NHD_F 0x30 +#define NCL_F 0x31 +#define FDL_F 0x32 +#define NHDT 0x33 +#define NCLT 0x34 +#define FDLT 0x35 +// Proximity sensing controls +#define MHDPROXR 0x36 +#define NHDPROXR 0x37 +#define NCLPROXR 0x38 +#define FDLPROXR 0x39 +#define MHDPROXF 0x3A +#define NHDPROXF 0x3B +#define NCLPROXF 0x3C +#define FDLPROXF 0x3D +#define NHDPROXT 0x3E +#define NCLPROXT 0x3F +#define FDLPROXT 0x40 +// Electrode Touch/Release thresholds +#define ELE0_T 0x41 +#define ELE0_R 0x42 +#define ELE1_T 0x43 +#define ELE1_R 0x44 +#define ELE2_T 0x45 +#define ELE2_R 0x46 +#define ELE3_T 0x47 +#define ELE3_R 0x48 +#define ELE4_T 0x49 +#define ELE4_R 0x4A +#define ELE5_T 0x4B +#define ELE5_R 0x4C +#define ELE6_T 0x4D +#define ELE6_R 0x4E +#define ELE7_T 0x4F +#define ELE7_R 0x50 +#define ELE8_T 0x51 +#define ELE8_R 0x52 +#define ELE9_T 0x53 +#define ELE9_R 0x54 +#define ELE10_T 0x55 +#define ELE10_R 0x56 +#define ELE11_T 0x57 +#define ELE11_R 0x58 +// Proximity Touch/Release thresholds +#define EPROXTTH 0x59 +#define EPROXRTH 0x5A +// Debounce configuration +#define DEB_CFG 0x5B +// AFE- Analogue Front End configuration +#define AFE_CFG 0x5C +// Filter configuration +#define FIL_CFG 0x5D +// Electrode configuration - transistions to "active mode" +#define ELE_CFG 0x5E + +#define GPIO_CTRL0 0x73 +#define GPIO_CTRL1 0x74 +#define GPIO_DATA 0x75 +#define GPIO_DIR 0x76 +#define GPIO_EN 0x77 +#define GPIO_SET 0x78 +#define GPIO_CLEAR 0x79 +#define GPIO_TOGGLE 0x7A +// Auto configration registers +#define AUTO_CFG_0 0x7B +#define AUTO_CFG_U 0x7D +#define AUTO_CFG_L 0x7E +#define AUTO_CFG_T 0x7F + +// Threshold defaults +// Electrode touch threshold +#define E_THR_T 0x0F +// Electrode release threshold +#define E_THR_R 0x0A +// Prox touch threshold +#define PROX_THR_T 0x02 +// Prox release threshold +#define PROX_THR_R 0x02 + +#endif