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
main.cpp@8:e3fb74a4772c, 2015-05-02 (annotated)
- 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?
User | Revision | Line number | New 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 | } |