My fork of the blinky project to support ethernet and twitter

Dependencies:   EthernetInterface HTTPClient HTU21D OAuth4Tw SDFileSystem SPI_TFT_ILI9341 SerialShell mbed-rtos mbed-src

Fork of mbed_blinky by Mbed

Committer:
vpcola
Date:
Sat May 02 02:18:51 2015 +0000
Revision:
8:e3fb74a4772c
Parent:
7:aafb9225f866
Updated added twitter capability;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dan 0:7dec7e9ac085 1 #include "mbed.h"
vpcola 7:aafb9225f866 2 #include "rtos.h"
vpcola 7:aafb9225f866 3 #include "EthernetInterface.h"
vpcola 7:aafb9225f866 4 #include "Arial12x12.h"
vpcola 7:aafb9225f866 5 #include "Arial24x23.h"
vpcola 7:aafb9225f866 6 #include "SPI_TFT_ILI9341.h"
vpcola 7:aafb9225f866 7 #include "SDFileSystem.h"
vpcola 7:aafb9225f866 8 #include "Shell.h"
vpcola 8:e3fb74a4772c 9 #include "HTU21D.h"
vpcola 8:e3fb74a4772c 10 #include "oauth.h"
dan 0:7dec7e9ac085 11
vpcola 8:e3fb74a4772c 12 Serial pc(p28, p27); // (USBTX, USBRX);
dan 0:7dec7e9ac085 13 DigitalOut myled(LED1);
vpcola 8:e3fb74a4772c 14 EthernetInterface eth;
vpcola 8:e3fb74a4772c 15 HTU21D htu21d(p9,p10);
vpcola 7:aafb9225f866 16
vpcola 7:aafb9225f866 17 SDFileSystem sd(p5,p6,p7,p8,"sd"); // mosi, miso, sck, cs
vpcola 7:aafb9225f866 18 SPI_TFT_ILI9341 TFT(p11,p12,p13,p15, p16, p17 ); // mosi, miso, sck, cs, eset, dc
vpcola 7:aafb9225f866 19 DigitalOut lcdOn(p14);
vpcola 7:aafb9225f866 20
vpcola 7:aafb9225f866 21 #define SHELL_STACK_SIZ 1024
vpcola 7:aafb9225f866 22 // Pre-allocate the shell's stack (on global mem)
vpcola 7:aafb9225f866 23 unsigned char shellStack[SHELL_STACK_SIZ];
vpcola 7:aafb9225f866 24 Shell shell(&pc);
vpcola 7:aafb9225f866 25
vpcola 8:e3fb74a4772c 26 // IMPORTANT: please change the following keys for your application.
vpcola 8:e3fb74a4772c 27
vpcola 8:e3fb74a4772c 28 static char const consumer_key[] = "AAAAAAAAAAAAAAAAAAAAAA";
vpcola 8:e3fb74a4772c 29 static char const consumer_secret[] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
vpcola 8:e3fb74a4772c 30
vpcola 8:e3fb74a4772c 31 static char const token_key[] = "00000000-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
vpcola 8:e3fb74a4772c 32 static char const token_secret[] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
vpcola 8:e3fb74a4772c 33
vpcola 8:e3fb74a4772c 34 //
vpcola 8:e3fb74a4772c 35 // Sends tweets to Twitter
vpcola 8:e3fb74a4772c 36 //
vpcola 8:e3fb74a4772c 37 void tweet(char const *message)
vpcola 8:e3fb74a4772c 38 {
vpcola 8:e3fb74a4772c 39
vpcola 8:e3fb74a4772c 40 std::string uri = "http://api.twitter.com/1/statuses/update.xml";
vpcola 8:e3fb74a4772c 41 uri += "?status=";
vpcola 8:e3fb74a4772c 42 uri += oauth_url_escape(message);
vpcola 8:e3fb74a4772c 43
vpcola 8:e3fb74a4772c 44 std::string req_url;
vpcola 8:e3fb74a4772c 45 std::string postarg;
vpcola 8:e3fb74a4772c 46
vpcola 8:e3fb74a4772c 47 req_url = oauth_sign_url2(uri.c_str(), &postarg, OA_HMAC, 0, consumer_key, consumer_secret, token_key, token_secret);
vpcola 8:e3fb74a4772c 48 oauth_http_post(req_url.c_str(), postarg.c_str());
vpcola 8:e3fb74a4772c 49 }
vpcola 8:e3fb74a4772c 50
vpcola 8:e3fb74a4772c 51 static uint32_t get_mem()
vpcola 7:aafb9225f866 52 {
vpcola 7:aafb9225f866 53 // In order to get free mem within RTOS
vpcola 7:aafb9225f866 54 // we need to get the main thread's stack pointer
vpcola 7:aafb9225f866 55 // and subtract it with the top of the heap
vpcola 7:aafb9225f866 56 // ------+-------------------+ Last Address of RAM (INITIAL_SP)
vpcola 7:aafb9225f866 57 // | Scheduler Stack |
vpcola 7:aafb9225f866 58 // +-------------------+
vpcola 7:aafb9225f866 59 // | Main Thread Stack |
vpcola 7:aafb9225f866 60 // | | |
vpcola 7:aafb9225f866 61 // | v |
vpcola 7:aafb9225f866 62 // +-------------------+ <- bottom_of_stack/__get_MSP()
vpcola 7:aafb9225f866 63 // RAM | |
vpcola 7:aafb9225f866 64 // | Available RAM |
vpcola 7:aafb9225f866 65 // | |
vpcola 7:aafb9225f866 66 // +-------------------+ <- top_of_heap
vpcola 7:aafb9225f866 67 // | ^ |
vpcola 7:aafb9225f866 68 // | | |
vpcola 7:aafb9225f866 69 // | Heap |
vpcola 7:aafb9225f866 70 // +-------------------+ <- __end__ / HEAP_START (linker defined var)
vpcola 7:aafb9225f866 71 // | ZI |
vpcola 7:aafb9225f866 72 // +-------------------+
vpcola 7:aafb9225f866 73 // | ZI: Shell Stack |
vpcola 7:aafb9225f866 74 // +-------------------+
vpcola 7:aafb9225f866 75 // | ZI: Idle Stack |
vpcola 7:aafb9225f866 76 // +-------------------+
vpcola 7:aafb9225f866 77 // | ZI: Timer Stack |
vpcola 7:aafb9225f866 78 // +-------------------+
vpcola 7:aafb9225f866 79 // | RW |
vpcola 7:aafb9225f866 80 // ------+===================+ First Address of RAM
vpcola 7:aafb9225f866 81 // | |
vpcola 7:aafb9225f866 82 // Flash | |
vpcola 7:aafb9225f866 83 //
vpcola 7:aafb9225f866 84
vpcola 7:aafb9225f866 85 uint32_t bottom_of_stack = __get_MSP();
vpcola 7:aafb9225f866 86 char * top_of_heap = (char *) malloc(sizeof(char));
vpcola 7:aafb9225f866 87 uint32_t diff = bottom_of_stack - (uint32_t) top_of_heap;
vpcola 7:aafb9225f866 88
vpcola 7:aafb9225f866 89 free((void *) top_of_heap);
vpcola 8:e3fb74a4772c 90
vpcola 8:e3fb74a4772c 91 return diff;
vpcola 8:e3fb74a4772c 92 }
vpcola 8:e3fb74a4772c 93
vpcola 8:e3fb74a4772c 94 // Local Commands
vpcola 8:e3fb74a4772c 95 /**
vpcola 8:e3fb74a4772c 96 * \brief Gets the amount of free memory
vpcola 8:e3fb74a4772c 97 * \param none
vpcola 8:e3fb74a4772c 98 * \return none
vpcola 8:e3fb74a4772c 99 **/
vpcola 8:e3fb74a4772c 100 static void cmd_mem(Stream * chp, int argc, char * argv[])
vpcola 8:e3fb74a4772c 101 {
vpcola 7:aafb9225f866 102 chp->printf("Available Memory : %d bytes\r\n",
vpcola 8:e3fb74a4772c 103 get_mem());
vpcola 7:aafb9225f866 104 }
vpcola 7:aafb9225f866 105
vpcola 7:aafb9225f866 106 /**
vpcola 7:aafb9225f866 107 * \brief List Directories and files
vpcola 7:aafb9225f866 108 * \param none
vpcola 7:aafb9225f866 109 * \return int
vpcola 7:aafb9225f866 110 **/
vpcola 7:aafb9225f866 111 static void cmd_ls(Stream * chp, int argc, char * argv[])
vpcola 7:aafb9225f866 112 {
vpcola 7:aafb9225f866 113 DIR * dp;
vpcola 7:aafb9225f866 114 struct dirent * dirp;
vpcola 7:aafb9225f866 115 char dirroot[256];
vpcola 7:aafb9225f866 116
vpcola 7:aafb9225f866 117 if (argc >= 1)
vpcola 7:aafb9225f866 118 sprintf(dirroot, "/sd/%s", argv[0]);
vpcola 7:aafb9225f866 119 else
vpcola 7:aafb9225f866 120 sprintf(dirroot, "/sd");
vpcola 7:aafb9225f866 121
vpcola 7:aafb9225f866 122 chp->printf("Listing directory [%s]\r\n", dirroot);
vpcola 7:aafb9225f866 123
vpcola 7:aafb9225f866 124 dp = opendir(dirroot);
vpcola 7:aafb9225f866 125 while((dirp = readdir(dp)) != NULL)
vpcola 7:aafb9225f866 126 {
vpcola 7:aafb9225f866 127 chp->printf("\t%s\r\n", dirp->d_name);
vpcola 7:aafb9225f866 128 }
vpcola 7:aafb9225f866 129 closedir(dp);
vpcola 7:aafb9225f866 130 }
vpcola 7:aafb9225f866 131
vpcola 7:aafb9225f866 132 static void cmd_load(Stream * chp, int argc, char * argv[])
vpcola 7:aafb9225f866 133 {
vpcola 7:aafb9225f866 134 char filename[256];
vpcola 7:aafb9225f866 135
vpcola 7:aafb9225f866 136 if (argc != 1)
vpcola 7:aafb9225f866 137 {
vpcola 7:aafb9225f866 138 chp->printf("load <bitmapfile>\r\n");
vpcola 7:aafb9225f866 139 return;
vpcola 7:aafb9225f866 140 }
vpcola 7:aafb9225f866 141
vpcola 7:aafb9225f866 142 sprintf(filename, "/sd/%s", argv[0]);
vpcola 7:aafb9225f866 143 // Load a bitmap startup file
vpcola 7:aafb9225f866 144 int err = TFT.BMP_16(0,0, filename);
vpcola 7:aafb9225f866 145 if (err != 1) TFT.printf(" - Err: %d", err);
vpcola 7:aafb9225f866 146 }
vpcola 7:aafb9225f866 147
vpcola 8:e3fb74a4772c 148 /**
vpcola 8:e3fb74a4772c 149 * \brief Gets sensor data on HTU21D
vpcola 8:e3fb74a4772c 150 * \param none
vpcola 8:e3fb74a4772c 151 * \return int
vpcola 8:e3fb74a4772c 152 **/
vpcola 8:e3fb74a4772c 153 static void cmd_sensor(Stream * chp, int argc, char * argv[])
vpcola 8:e3fb74a4772c 154 {
vpcola 8:e3fb74a4772c 155 chp->printf("Temperature : %d °C\r\n", htu21d.sample_ctemp());
vpcola 8:e3fb74a4772c 156 chp->printf("Humitdity : %d%%\r\n", htu21d.sample_humid());
vpcola 8:e3fb74a4772c 157 }
vpcola 7:aafb9225f866 158
vpcola 7:aafb9225f866 159 /**
vpcola 7:aafb9225f866 160 * \brief Initialize LCD
vpcola 7:aafb9225f866 161 * \param none
vpcola 7:aafb9225f866 162 * \return void
vpcola 7:aafb9225f866 163 **/
vpcola 7:aafb9225f866 164 void init_LCD()
vpcola 7:aafb9225f866 165 {
vpcola 7:aafb9225f866 166 pc.printf("Initializing LCD Screen ...\r\n");
vpcola 7:aafb9225f866 167
vpcola 7:aafb9225f866 168 // Turn on the LCD
vpcola 7:aafb9225f866 169 lcdOn = 1;
vpcola 7:aafb9225f866 170
vpcola 7:aafb9225f866 171 TFT.claim(stdout);
vpcola 8:e3fb74a4772c 172 TFT.set_orientation(2);
vpcola 7:aafb9225f866 173 TFT.background(Black); // set background to black
vpcola 7:aafb9225f866 174 TFT.foreground(White); // set chars to white
vpcola 7:aafb9225f866 175 TFT.cls(); // clear the screen
vpcola 7:aafb9225f866 176
vpcola 7:aafb9225f866 177
vpcola 7:aafb9225f866 178 TFT.set_font((unsigned char*) Arial12x12);
vpcola 7:aafb9225f866 179 TFT.locate(0,0);
vpcola 7:aafb9225f866 180
vpcola 7:aafb9225f866 181 printf("Hello World of EMBED!\n");
vpcola 7:aafb9225f866 182
vpcola 7:aafb9225f866 183 }
vpcola 7:aafb9225f866 184
vpcola 7:aafb9225f866 185 void led1_thread(void const *args) {
vpcola 7:aafb9225f866 186 while (true) {
vpcola 7:aafb9225f866 187 myled = !myled;
vpcola 7:aafb9225f866 188 Thread::wait(1000);
vpcola 7:aafb9225f866 189 }
vpcola 7:aafb9225f866 190 }
dan 0:7dec7e9ac085 191
dan 0:7dec7e9ac085 192 int main() {
vpcola 7:aafb9225f866 193 Thread * thread;
vpcola 8:e3fb74a4772c 194 Thread * thread2;
vpcola 7:aafb9225f866 195 pc.baud(115200);
vpcola 7:aafb9225f866 196
vpcola 7:aafb9225f866 197 pc.printf("\r\nStarting Mbed ...\r\n");
vpcola 8:e3fb74a4772c 198 //Initialize the LCD
vpcola 8:e3fb74a4772c 199 pc.printf("Initializing LCD ...\r\n");
vpcola 7:aafb9225f866 200 init_LCD();
vpcola 7:aafb9225f866 201
vpcola 8:e3fb74a4772c 202 printf("Inititalizing ethernet ....\r\n");
vpcola 8:e3fb74a4772c 203 eth.init(); // Use DHCP
vpcola 8:e3fb74a4772c 204 eth.connect();
vpcola 8:e3fb74a4772c 205 printf("IP Address is %s\n", eth.getIPAddress());
vpcola 8:e3fb74a4772c 206
vpcola 7:aafb9225f866 207 // After initializing the ethernet interface
vpcola 7:aafb9225f866 208 // run it in its own thread
vpcola 7:aafb9225f866 209 thread = new Thread(led1_thread);
vpcola 7:aafb9225f866 210
vpcola 7:aafb9225f866 211 // Start the shell
vpcola 8:e3fb74a4772c 212 printf("Starting debug shell ...\r\n");
vpcola 7:aafb9225f866 213 shell.addCommand("ls", cmd_ls);
vpcola 8:e3fb74a4772c 214 shell.addCommand("load", cmd_load);
vpcola 7:aafb9225f866 215 shell.addCommand("mem", cmd_mem);
vpcola 8:e3fb74a4772c 216 shell.addCommand("sensor", cmd_sensor);
vpcola 7:aafb9225f866 217 shell.start(osPriorityNormal, SHELL_STACK_SIZ, shellStack);
vpcola 8:e3fb74a4772c 218 printf("Shell now running!\r\n");
vpcola 8:e3fb74a4772c 219 printf("Available Memory : %d\r\n", get_mem());
vpcola 8:e3fb74a4772c 220
vpcola 7:aafb9225f866 221 // Do something logical here
vpcola 7:aafb9225f866 222 // other than looping
dan 0:7dec7e9ac085 223 while(1) {
vpcola 8:e3fb74a4772c 224 printf("Temperature : %d °C\r\n", htu21d.sample_ctemp());
vpcola 8:e3fb74a4772c 225 printf("Humitdity : %d%%\r\n", htu21d.sample_humid());
vpcola 8:e3fb74a4772c 226 wait(10);
stevep 4:81cea7a352b0 227 }
vpcola 7:aafb9225f866 228
vpcola 7:aafb9225f866 229 thread->terminate();
vpcola 7:aafb9225f866 230 delete thread;
dan 0:7dec7e9ac085 231 }