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@7:aafb9225f866, 2015-04-29 (annotated)
- Committer:
- vpcola
- Date:
- Wed Apr 29 14:55:06 2015 +0000
- Revision:
- 7:aafb9225f866
- Parent:
- 4:81cea7a352b0
- Child:
- 8:e3fb74a4772c
Updated added SerialShell;
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" |
dan | 0:7dec7e9ac085 | 9 | |
dan | 0:7dec7e9ac085 | 10 | DigitalOut myled(LED1); |
vpcola | 7:aafb9225f866 | 11 | //EthernetInterface eth; |
vpcola | 7:aafb9225f866 | 12 | Serial pc(p9,p10); |
vpcola | 7:aafb9225f866 | 13 | |
vpcola | 7:aafb9225f866 | 14 | SDFileSystem sd(p5,p6,p7,p8,"sd"); // mosi, miso, sck, cs |
vpcola | 7:aafb9225f866 | 15 | SPI_TFT_ILI9341 TFT(p11,p12,p13,p15, p16, p17 ); // mosi, miso, sck, cs, eset, dc |
vpcola | 7:aafb9225f866 | 16 | DigitalOut lcdOn(p14); |
vpcola | 7:aafb9225f866 | 17 | |
vpcola | 7:aafb9225f866 | 18 | #define SHELL_STACK_SIZ 1024 |
vpcola | 7:aafb9225f866 | 19 | // Pre-allocate the shell's stack (on global mem) |
vpcola | 7:aafb9225f866 | 20 | unsigned char shellStack[SHELL_STACK_SIZ]; |
vpcola | 7:aafb9225f866 | 21 | Shell shell(&pc); |
vpcola | 7:aafb9225f866 | 22 | |
vpcola | 7:aafb9225f866 | 23 | // Local Commands |
vpcola | 7:aafb9225f866 | 24 | /** |
vpcola | 7:aafb9225f866 | 25 | * \brief Gets the amount of free memory |
vpcola | 7:aafb9225f866 | 26 | * \param none |
vpcola | 7:aafb9225f866 | 27 | * \return none |
vpcola | 7:aafb9225f866 | 28 | **/ |
vpcola | 7:aafb9225f866 | 29 | static void cmd_mem(Stream * chp, int argc, char * argv[]) |
vpcola | 7:aafb9225f866 | 30 | { |
vpcola | 7:aafb9225f866 | 31 | // In order to get free mem within RTOS |
vpcola | 7:aafb9225f866 | 32 | // we need to get the main thread's stack pointer |
vpcola | 7:aafb9225f866 | 33 | // and subtract it with the top of the heap |
vpcola | 7:aafb9225f866 | 34 | // ------+-------------------+ Last Address of RAM (INITIAL_SP) |
vpcola | 7:aafb9225f866 | 35 | // | Scheduler Stack | |
vpcola | 7:aafb9225f866 | 36 | // +-------------------+ |
vpcola | 7:aafb9225f866 | 37 | // | Main Thread Stack | |
vpcola | 7:aafb9225f866 | 38 | // | | | |
vpcola | 7:aafb9225f866 | 39 | // | v | |
vpcola | 7:aafb9225f866 | 40 | // +-------------------+ <- bottom_of_stack/__get_MSP() |
vpcola | 7:aafb9225f866 | 41 | // RAM | | |
vpcola | 7:aafb9225f866 | 42 | // | Available RAM | |
vpcola | 7:aafb9225f866 | 43 | // | | |
vpcola | 7:aafb9225f866 | 44 | // +-------------------+ <- top_of_heap |
vpcola | 7:aafb9225f866 | 45 | // | ^ | |
vpcola | 7:aafb9225f866 | 46 | // | | | |
vpcola | 7:aafb9225f866 | 47 | // | Heap | |
vpcola | 7:aafb9225f866 | 48 | // +-------------------+ <- __end__ / HEAP_START (linker defined var) |
vpcola | 7:aafb9225f866 | 49 | // | ZI | |
vpcola | 7:aafb9225f866 | 50 | // +-------------------+ |
vpcola | 7:aafb9225f866 | 51 | // | ZI: Shell Stack | |
vpcola | 7:aafb9225f866 | 52 | // +-------------------+ |
vpcola | 7:aafb9225f866 | 53 | // | ZI: Idle Stack | |
vpcola | 7:aafb9225f866 | 54 | // +-------------------+ |
vpcola | 7:aafb9225f866 | 55 | // | ZI: Timer Stack | |
vpcola | 7:aafb9225f866 | 56 | // +-------------------+ |
vpcola | 7:aafb9225f866 | 57 | // | RW | |
vpcola | 7:aafb9225f866 | 58 | // ------+===================+ First Address of RAM |
vpcola | 7:aafb9225f866 | 59 | // | | |
vpcola | 7:aafb9225f866 | 60 | // Flash | | |
vpcola | 7:aafb9225f866 | 61 | // |
vpcola | 7:aafb9225f866 | 62 | |
vpcola | 7:aafb9225f866 | 63 | uint32_t bottom_of_stack = __get_MSP(); |
vpcola | 7:aafb9225f866 | 64 | char * top_of_heap = (char *) malloc(sizeof(char)); |
vpcola | 7:aafb9225f866 | 65 | uint32_t diff = bottom_of_stack - (uint32_t) top_of_heap; |
vpcola | 7:aafb9225f866 | 66 | |
vpcola | 7:aafb9225f866 | 67 | free((void *) top_of_heap); |
vpcola | 7:aafb9225f866 | 68 | chp->printf("Available Memory : %d bytes\r\n", |
vpcola | 7:aafb9225f866 | 69 | diff); |
vpcola | 7:aafb9225f866 | 70 | } |
vpcola | 7:aafb9225f866 | 71 | |
vpcola | 7:aafb9225f866 | 72 | /** |
vpcola | 7:aafb9225f866 | 73 | * \brief List Directories and files |
vpcola | 7:aafb9225f866 | 74 | * \param none |
vpcola | 7:aafb9225f866 | 75 | * \return int |
vpcola | 7:aafb9225f866 | 76 | **/ |
vpcola | 7:aafb9225f866 | 77 | static void cmd_ls(Stream * chp, int argc, char * argv[]) |
vpcola | 7:aafb9225f866 | 78 | { |
vpcola | 7:aafb9225f866 | 79 | DIR * dp; |
vpcola | 7:aafb9225f866 | 80 | struct dirent * dirp; |
vpcola | 7:aafb9225f866 | 81 | char dirroot[256]; |
vpcola | 7:aafb9225f866 | 82 | |
vpcola | 7:aafb9225f866 | 83 | if (argc >= 1) |
vpcola | 7:aafb9225f866 | 84 | sprintf(dirroot, "/sd/%s", argv[0]); |
vpcola | 7:aafb9225f866 | 85 | else |
vpcola | 7:aafb9225f866 | 86 | sprintf(dirroot, "/sd"); |
vpcola | 7:aafb9225f866 | 87 | |
vpcola | 7:aafb9225f866 | 88 | chp->printf("Listing directory [%s]\r\n", dirroot); |
vpcola | 7:aafb9225f866 | 89 | |
vpcola | 7:aafb9225f866 | 90 | dp = opendir(dirroot); |
vpcola | 7:aafb9225f866 | 91 | while((dirp = readdir(dp)) != NULL) |
vpcola | 7:aafb9225f866 | 92 | { |
vpcola | 7:aafb9225f866 | 93 | chp->printf("\t%s\r\n", dirp->d_name); |
vpcola | 7:aafb9225f866 | 94 | } |
vpcola | 7:aafb9225f866 | 95 | closedir(dp); |
vpcola | 7:aafb9225f866 | 96 | } |
vpcola | 7:aafb9225f866 | 97 | |
vpcola | 7:aafb9225f866 | 98 | static void cmd_load(Stream * chp, int argc, char * argv[]) |
vpcola | 7:aafb9225f866 | 99 | { |
vpcola | 7:aafb9225f866 | 100 | char filename[256]; |
vpcola | 7:aafb9225f866 | 101 | |
vpcola | 7:aafb9225f866 | 102 | if (argc != 1) |
vpcola | 7:aafb9225f866 | 103 | { |
vpcola | 7:aafb9225f866 | 104 | chp->printf("load <bitmapfile>\r\n"); |
vpcola | 7:aafb9225f866 | 105 | return; |
vpcola | 7:aafb9225f866 | 106 | } |
vpcola | 7:aafb9225f866 | 107 | |
vpcola | 7:aafb9225f866 | 108 | sprintf(filename, "/sd/%s", argv[0]); |
vpcola | 7:aafb9225f866 | 109 | // Load a bitmap startup file |
vpcola | 7:aafb9225f866 | 110 | int err = TFT.BMP_16(0,0, filename); |
vpcola | 7:aafb9225f866 | 111 | if (err != 1) TFT.printf(" - Err: %d", err); |
vpcola | 7:aafb9225f866 | 112 | } |
vpcola | 7:aafb9225f866 | 113 | |
vpcola | 7:aafb9225f866 | 114 | |
vpcola | 7:aafb9225f866 | 115 | /** |
vpcola | 7:aafb9225f866 | 116 | * \brief Initialize LCD |
vpcola | 7:aafb9225f866 | 117 | * \param none |
vpcola | 7:aafb9225f866 | 118 | * \return void |
vpcola | 7:aafb9225f866 | 119 | **/ |
vpcola | 7:aafb9225f866 | 120 | void init_LCD() |
vpcola | 7:aafb9225f866 | 121 | { |
vpcola | 7:aafb9225f866 | 122 | pc.printf("Initializing LCD Screen ...\r\n"); |
vpcola | 7:aafb9225f866 | 123 | |
vpcola | 7:aafb9225f866 | 124 | // Turn on the LCD |
vpcola | 7:aafb9225f866 | 125 | lcdOn = 1; |
vpcola | 7:aafb9225f866 | 126 | |
vpcola | 7:aafb9225f866 | 127 | TFT.claim(stdout); |
vpcola | 7:aafb9225f866 | 128 | TFT.set_orientation(1); |
vpcola | 7:aafb9225f866 | 129 | TFT.background(Black); // set background to black |
vpcola | 7:aafb9225f866 | 130 | TFT.foreground(White); // set chars to white |
vpcola | 7:aafb9225f866 | 131 | TFT.cls(); // clear the screen |
vpcola | 7:aafb9225f866 | 132 | |
vpcola | 7:aafb9225f866 | 133 | |
vpcola | 7:aafb9225f866 | 134 | TFT.set_font((unsigned char*) Arial12x12); |
vpcola | 7:aafb9225f866 | 135 | TFT.locate(0,0); |
vpcola | 7:aafb9225f866 | 136 | |
vpcola | 7:aafb9225f866 | 137 | printf("Hello World of EMBED!\n"); |
vpcola | 7:aafb9225f866 | 138 | |
vpcola | 7:aafb9225f866 | 139 | } |
vpcola | 7:aafb9225f866 | 140 | |
vpcola | 7:aafb9225f866 | 141 | |
vpcola | 7:aafb9225f866 | 142 | void led1_thread(void const *args) { |
vpcola | 7:aafb9225f866 | 143 | while (true) { |
vpcola | 7:aafb9225f866 | 144 | myled = !myled; |
vpcola | 7:aafb9225f866 | 145 | Thread::wait(1000); |
vpcola | 7:aafb9225f866 | 146 | } |
vpcola | 7:aafb9225f866 | 147 | } |
dan | 0:7dec7e9ac085 | 148 | |
dan | 0:7dec7e9ac085 | 149 | int main() { |
vpcola | 7:aafb9225f866 | 150 | Thread * thread; |
vpcola | 7:aafb9225f866 | 151 | pc.baud(115200); |
vpcola | 7:aafb9225f866 | 152 | |
vpcola | 7:aafb9225f866 | 153 | pc.printf("\r\nStarting Mbed ...\r\n"); |
vpcola | 7:aafb9225f866 | 154 | // pc.printf("Inititalizing ethernet ....\r\n"); |
vpcola | 7:aafb9225f866 | 155 | // eth.init(); // Use DHCP |
vpcola | 7:aafb9225f866 | 156 | // eth.connect(); |
vpcola | 7:aafb9225f866 | 157 | // pc.printf("IP Address is %s\n", eth.getIPAddress()); |
vpcola | 7:aafb9225f866 | 158 | |
vpcola | 7:aafb9225f866 | 159 | // Initialize the LCD |
vpcola | 7:aafb9225f866 | 160 | init_LCD(); |
vpcola | 7:aafb9225f866 | 161 | |
vpcola | 7:aafb9225f866 | 162 | // After initializing the ethernet interface |
vpcola | 7:aafb9225f866 | 163 | // run it in its own thread |
vpcola | 7:aafb9225f866 | 164 | thread = new Thread(led1_thread); |
vpcola | 7:aafb9225f866 | 165 | |
vpcola | 7:aafb9225f866 | 166 | // Start the shell |
vpcola | 7:aafb9225f866 | 167 | pc.printf("Starting debug shell ...\r\n"); |
vpcola | 7:aafb9225f866 | 168 | shell.addCommand("ls", cmd_ls); |
vpcola | 7:aafb9225f866 | 169 | //shell.addCommand("load", cmd_load); |
vpcola | 7:aafb9225f866 | 170 | shell.addCommand("mem", cmd_mem); |
vpcola | 7:aafb9225f866 | 171 | shell.start(osPriorityNormal, SHELL_STACK_SIZ, shellStack); |
vpcola | 7:aafb9225f866 | 172 | |
vpcola | 7:aafb9225f866 | 173 | // Do something logical here |
vpcola | 7:aafb9225f866 | 174 | // other than looping |
dan | 0:7dec7e9ac085 | 175 | while(1) { |
stevep | 4:81cea7a352b0 | 176 | wait(0.2); |
stevep | 4:81cea7a352b0 | 177 | } |
vpcola | 7:aafb9225f866 | 178 | |
vpcola | 7:aafb9225f866 | 179 | thread->terminate(); |
vpcola | 7:aafb9225f866 | 180 | delete thread; |
dan | 0:7dec7e9ac085 | 181 | } |