A web server for monitoring and controlling a MakerBot Replicator over the USB host and ethernet.

Dependencies:   IAP NTPClient RTC mbed-rtos mbed Socket lwip-sys lwip BurstSPI

Fork of LPC1768_Mini-DK by Frank Vannieuwkerke

Makerbot Server for LPC1768 Copyright (c) 2013, jake (at) allaboutjake (dot) com All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • The name of the author and/or copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER, AUTHOR, OR ANY CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Warnings:

This is not a commercial product or a hardened and secure network appliance. It is intended as a thought experiment or proof of concept and should not be relied upon in any way. Always operate your 3D printer in a safe and controlled manner.

Do not connect this directly to the exposed internet. It is intended to be behind a secure firewall (and NAT) such that it will only accept commands from the local network. Imagine how much fun a hacker could have instructing your 3D printer to continually print Standford bunnies. Well it could be much worse then that- a malicious user could send commands that could crash your machine (both in the software sense, as well as in the "smash your moving parts against the side of the machine repeatedly sense), overheat your extruders, cause your build plate to catch fire, and do severe damage to the machine, any surrounding building and propery. You have been warned.

Never print unattended and be ready to step in and stop the machine if something goes wrong. Keep in mind, a 3D printer has heaters that are operating at high temperatures, and if something starts to burn, it could cause damage to the machine, other property, and/or hurt yourself, pets, or others.

You should understand what you are doing. The source code here is not intended as a finished product or set of step by step instructions. You should engineer your own solution, which may wind up being better than mine.

Proceed at your own risk. You've been warned. (Several times) If you break your Makerbot, burn your house down, or injure yourself or others, I take no responsibility.

Introduction

I've been working on a side project to solve the "last mile" problem for people wanting to print from the network on their bots. I feel like the first half of the problem is solved with the FlashAir- getting the files to the card. The next step is a lightweight way of sending the "play back capture" command to the bot.

I looked around for a microcontroller platform that supports both networking and can function as a USB host. I happened to have an mbed (mbed) on hand that fit the bill. The mbed also has a working online toolchain (you need to own an mbed to gain access to the compiler). Some people don't like the online development environment, but I'm a fan of "working" and "Mac compatible." It was a good start, but cost wise, you would need an mbed LPC1768 module and some sort of carrier board that has both USB host and ethernet, or rig up your own connector solution. I happened to also have a Seedstudio mbed shield carrier board. This provides ethernet and USB connectors, but is another $25, putting the solution at around $75.

I also had an LPC1768 development board here called the "Mini-DK2". It has a USB host and a wired ethernet connector on board (search ebay if you're interested). It's a single-board solution that costs only $32 (and for $40 you can get one with a touchscreen) Its the cheapest development board I've seen with both USB host and an ethernet connector. I considered RasPi, but I'm not on that bandwagon. Since I had the Mini-DK2 on hand from another project that never went anywhere, I moved from the mbed module and carrier board to the DK2.

The mbed environment can compile binaries that work on the DK2 (again, you need to own at least one 1768 mbed already to get a license to use the compiler), and the mbed libraries provide some nice features. A USB Host library and and Ethernet library were readily available. The USBHost library didn't quite work out of the box. It took some time and more learning about the USB protocols than I would have liked, but I have the board communicating over the USB Host and the Makerbot.

Changes to stock mbed libraries

Many libraries are imported, but then converted to folders as to unlink them.

mbed provides a USHost library that includes a USBHostSerial object for connecting to CDC serial devices. Unfortunately, it did not work for me out of the box. I spent some time learning about USB protocols. One good reference is [Jan Axelson's Lakeview Research](http://www.lvr.com/usb_virtual_com_port.htm) discussion about CDC.

I found that the stock library was sending the control transfers to Interface 1. From what I understand, the control transfers needed to go to interface 0. I modified the USBHostSerial library to correct this, and the serial port interface came to life.

Next, I found that I wasn't able to get reliable communication. I traced it to what I think is an odd C++ inheritance and override problem. The USBHostSerial class implements the Stream interface, allowing printf/scanf operations. This is done by overriding the virtual _getc and _putc methods. Unfortunately, and for a reason I can't understand, these methods were not being called consistently. Sometimes they would work, but other times they would not. My solution was to implement transmit/receive methods with different names, and since the names were different, they seemed to get called consistently. I'd like to learn exactly what's going on here, but I don't feel like debugging it for academic purposes when it works just fine with the added methods.

Usage

Connect up your chosen dev board to power, ethernet and the USB host to the Makerbot's USB cable. The Mini-DK uses a USB-OTG adapter for the USB host. If you're using a Mini-DK board with an LCD, it will inform you of it's IP address on the display. This means it is now listening for a connection on port 7654.

If you are using an mbed dev board, or a Mini-DK without a display, the message will be directed to the serial console. Connect your computer to the appropriate port at a baud rate of 115200 to see the messages.

Use a telnet client to connect to the given IP address at port 7654. Telnet clients typically revert to "line mode" on ports other than 21. This means you get a local echo and the command isn't sent until you press enter.

Once connected, you can send the following commands:

A <username>:<password> : Set a username & password for the web interface and the telnet interface. Use the format shown with a colon separating the username from the password.

V : Print the version and Makerbot name, as well as the local firmware version (the Makerbot_Server firmware as discussed here).

B <filename.x3g> : Build from SD the given filename. According tot he protocol spec, this command is limited to 12 characters, so 8.3 filenames only.

P : Pause an active build

R : Resume active build

C : Cancel build- note that this immediately halts the build and does not clear the build area. You might want to pause the build first, and then cancel shortly after to make sure the nozzle isn't left hot and in contact with a printed part.

S : Print build status, tool and platform temps

Q : Quit and logout

The Mini-DK has two onboard buttons (besides the ISP and reset buttons). Currently one button will trigger a pause (if the Makerbot is printing) and the other will resume (if the Makerbot it paused)

Compiling

Edit "Target.h" to set whether you're building for an MBED module or the Mini-DK2

Installation

If you are using a mbed, then you can simply load the BIN file to the mbed using the mass storage bootloader. The mbed mounts as if it were a USB thumbdrive, and you copy the BIN file to the drive. After a reset, you're running the installed firmware.

The MiniDK has a serial bootloader. You connect to this bootloader from the "top" USB connector (not the USB host one). Hold down the ISP button and then tap the reset button and then release the ISP button to put it into programming mode. I use [lpc21isp](http://sourceforge.net/projects/lpc21isp/) to load the binary. The other option is FlashMagic, which uses HEX files, so you'll need to use some sort of bin2hex utility to convert the firmware file if you use this utility. I can't really say if/how this works, as I don't use this method. See this (http://mbed.org/users/frankvnk/notebook/lpc1768-mini-dk/) for more info.

Credits

Some credits, where credit is due.

EthernetInterface - modified to include PHY code for both the MiniDK2 and MBED based on selected #definitions

Mini-DK - Thanks for Frank and Erik for doing all the heavy lifting getting the MBED compiler and libraries and peripherals working on the Mini-DK2

NTP Client - Thanks to Donatien for this library to set the clock over the network

RTC - Thanks to Erik for the RTC library. I've got it in my project, but I don't think I'm using it for anything (yet).

SimpleSocket - Thanks to Yamaguchi-san. Modified slightly to take out references to EthernetInterface::init() and ::getIPAddress(). For some reason these don't like to be called in a thread.

JPEGCamera - Thanks again to Yamaguchi-san. Modified to output the JPEG binary over a socket rather than to a file descriptor.

USBHost - modified as noted above

IAP - Thanks to Okano-san. Pulled out of the Mini-DK folder so that I could link it back to the base repository at the root level.

Committer:
frankvnk
Date:
Thu Jan 10 08:58:47 2013 +0000
Revision:
13:a10300cac491
Parent:
10:d07f76421408
Child:
15:688b3e3958fd
FLASH_BUFFER comment update in main.cpp

Who changed what in which revision?

UserRevisionLine numberNew contents of line
frankvnk 10:d07f76421408 1 /*
frankvnk 10:d07f76421408 2 This file contains 3 examples:
frankvnk 10:d07f76421408 3
frankvnk 10:d07f76421408 4 ONE : Original example with paint demo.
frankvnk 10:d07f76421408 5 TWO : Example for displaying a bitmap read from SD card.
frankvnk 10:d07f76421408 6 Download the house.bmp bitmap file from http://mbed.org/media/uploads/frankvnk/house.bmp
frankvnk 10:d07f76421408 7 Copy this file to the root of an SD card, insert it into the Mini-DK.
frankvnk 10:d07f76421408 8 THREE : Example for copying a bitmap from SD to flash memory, use it as background and
frankvnk 10:d07f76421408 9 write text without disrupting the background image.
frankvnk 10:d07f76421408 10 Download the house.bmp bitmap file from http://mbed.org/media/uploads/frankvnk/house.bmp
frankvnk 10:d07f76421408 11 Copy this file to the root of an SD card, insert it into the Mini-DK.
frankvnk 10:d07f76421408 12
frankvnk 10:d07f76421408 13 IMPORTANT:
frankvnk 13:a10300cac491 14 If copy to flash option is not needed - enable //#define NO_FLASH_BUFFER in Mini_DK.h
frankvnk 13:a10300cac491 15
frankvnk 10:d07f76421408 16
frankvnk 10:d07f76421408 17 UNCOMMENT THE DESIRED CODE TO TEST.
frankvnk 10:d07f76421408 18
frankvnk 10:d07f76421408 19 */
frankvnk 10:d07f76421408 20
frankvnk 10:d07f76421408 21 // =========================================================================================================
frankvnk 10:d07f76421408 22 // ================================================== ONE ==================================================
frankvnk 10:d07f76421408 23 // =========================================================================================================
frankvnk 9:3e117b89c705 24 #include "stdio.h"
frankvnk 9:3e117b89c705 25 #include "mbed.h"
frankvnk 9:3e117b89c705 26 #include "Mini_DK.h"
frankvnk 9:3e117b89c705 27
frankvnk 9:3e117b89c705 28 extern unsigned char p1[]; // the mbed logo
frankvnk 9:3e117b89c705 29 #define RGB565CONVERT(red, green, blue) (uint16_t)( (( red >> 3 ) << 11 ) | (( green >> 2 ) << 5 ) | ( blue >> 3 ))
frankvnk 9:3e117b89c705 30
frankvnk 9:3e117b89c705 31 DigitalOut led(DK_LED1);
frankvnk 9:3e117b89c705 32 // TFT -> mosi, miso, sclk, cs
frankvnk 9:3e117b89c705 33 SPI_TFT TFT(LCD_SDI, LCD_SDO, LCD_SCK, LCD_CS,"TFT");
frankvnk 9:3e117b89c705 34 // ADS7843 -> mosi, miso, sclk, cs, irq, SPI_TFT
frankvnk 9:3e117b89c705 35 TouchScreenADS7843 TP(TP_SDI ,TP_SDO ,TP_SCK ,TP_CS ,TP_IRQ, &TFT);
frankvnk 9:3e117b89c705 36
frankvnk 9:3e117b89c705 37 int main()
frankvnk 9:3e117b89c705 38 {
frankvnk 9:3e117b89c705 39 unsigned short LCD_id;
frankvnk 9:3e117b89c705 40 TFT.claim(stdout); // send stdout to the TFT display
frankvnk 9:3e117b89c705 41
frankvnk 9:3e117b89c705 42 TFT.background(Black); // set background to black
frankvnk 9:3e117b89c705 43 TFT.foreground(White); // set chars to white
frankvnk 9:3e117b89c705 44
frankvnk 9:3e117b89c705 45
frankvnk 9:3e117b89c705 46 // LCD demo
frankvnk 9:3e117b89c705 47 // first show the 4 directions
frankvnk 9:3e117b89c705 48 TFT.cls();
frankvnk 9:3e117b89c705 49 TFT.set_font((unsigned char*) Arial12x12);
frankvnk 9:3e117b89c705 50 TFT.set_orientation(0);
frankvnk 9:3e117b89c705 51 TFT.locate(0,0);
frankvnk 10:d07f76421408 52 printf(" Hello Mbed 0");
frankvnk 9:3e117b89c705 53 TFT.set_orientation(1);
frankvnk 9:3e117b89c705 54 TFT.locate(0,0);
frankvnk 10:d07f76421408 55 printf(" Hello Mbed 1");
frankvnk 9:3e117b89c705 56 TFT.set_orientation(2);
frankvnk 9:3e117b89c705 57 TFT.locate(0,0);
frankvnk 10:d07f76421408 58 printf(" Hello Mbed 2");
frankvnk 9:3e117b89c705 59 TFT.set_orientation(3);
frankvnk 9:3e117b89c705 60 TFT.locate(0,0);
frankvnk 10:d07f76421408 61 printf(" Hello Mbed 3");
frankvnk 9:3e117b89c705 62 TFT.set_orientation(1);
frankvnk 9:3e117b89c705 63 TFT.set_font((unsigned char*) Arial24x23);
frankvnk 9:3e117b89c705 64 TFT.locate(50,100);
frankvnk 10:d07f76421408 65 printf("TFT orientation");
frankvnk 9:3e117b89c705 66
frankvnk 9:3e117b89c705 67 wait(2);
frankvnk 9:3e117b89c705 68
frankvnk 9:3e117b89c705 69 // draw some graphics
frankvnk 9:3e117b89c705 70 TFT.cls();
frankvnk 9:3e117b89c705 71 TFT.set_orientation(1);
frankvnk 9:3e117b89c705 72 TFT.set_font((unsigned char*) Arial24x23);
frankvnk 9:3e117b89c705 73 TFT.locate(120,115);
frankvnk 10:d07f76421408 74 printf("Graphic");
frankvnk 9:3e117b89c705 75 TFT.line(0,0,100,200,Green);
frankvnk 9:3e117b89c705 76 TFT.rect(100,50,50,50,Red);
frankvnk 9:3e117b89c705 77 TFT.fillrect(180,25,40,45,Blue);
frankvnk 9:3e117b89c705 78 TFT.draw_ellipse(80, 150, 33, 33, White);
frankvnk 9:3e117b89c705 79 TFT.fill_ellipse(80, 50, 33, 33, White);
frankvnk 9:3e117b89c705 80 wait(2);
frankvnk 9:3e117b89c705 81 TFT.cls();
frankvnk 9:3e117b89c705 82 TFT.draw_ellipse(160, 120, 100, 50, Yellow);
frankvnk 9:3e117b89c705 83 TFT.draw_ellipse(160, 120, 100, 100, Blue);
frankvnk 9:3e117b89c705 84 TFT.fill_ellipse(160, 120, 80, 40, Green);
frankvnk 9:3e117b89c705 85 wait(2);
frankvnk 9:3e117b89c705 86
frankvnk 9:3e117b89c705 87 // bigger text
frankvnk 9:3e117b89c705 88 TFT.foreground(White);
frankvnk 9:3e117b89c705 89 TFT.background(Blue);
frankvnk 9:3e117b89c705 90 TFT.cls();
frankvnk 9:3e117b89c705 91 TFT.set_font((unsigned char*) Arial24x23);
frankvnk 9:3e117b89c705 92 TFT.locate(0,0);
frankvnk 10:d07f76421408 93 printf("Different Fonts :");
frankvnk 9:3e117b89c705 94
frankvnk 9:3e117b89c705 95 TFT.set_font((unsigned char*) Neu42x35);
frankvnk 9:3e117b89c705 96 TFT.locate(0,50);
frankvnk 10:d07f76421408 97 printf("Hello");
frankvnk 9:3e117b89c705 98 TFT.set_font((unsigned char*) Arial24x23);
frankvnk 9:3e117b89c705 99 TFT.locate(50,100);
frankvnk 10:d07f76421408 100 printf("Hello");
frankvnk 9:3e117b89c705 101 TFT.set_font((unsigned char*) Arial12x12);
frankvnk 9:3e117b89c705 102 TFT.locate(55,150);
frankvnk 10:d07f76421408 103 printf("Hello");
frankvnk 9:3e117b89c705 104
frankvnk 9:3e117b89c705 105 TFT.set_orientation(2);
frankvnk 9:3e117b89c705 106 TFT.set_font((unsigned char*) Arial24x23);
frankvnk 9:3e117b89c705 107 TFT.locate(10,10);
frankvnk 10:d07f76421408 108 printf("Hi mbed");
frankvnk 9:3e117b89c705 109 wait(2);
frankvnk 9:3e117b89c705 110
frankvnk 9:3e117b89c705 111 // mbed logo
frankvnk 9:3e117b89c705 112 TFT.set_orientation(1);
frankvnk 9:3e117b89c705 113 TFT.background(Black);
frankvnk 9:3e117b89c705 114 TFT.cls();
frankvnk 9:3e117b89c705 115 TFT.Bitmap(90,90,172,55,p1);
frankvnk 9:3e117b89c705 116
frankvnk 9:3e117b89c705 117 // Read LCD ID
frankvnk 9:3e117b89c705 118 TFT.set_orientation(0);
frankvnk 9:3e117b89c705 119 LCD_id = TFT.Read_ID();
frankvnk 9:3e117b89c705 120 TFT.locate(10,10);
frankvnk 10:d07f76421408 121 printf("LCD: ILI%04X", LCD_id);
frankvnk 9:3e117b89c705 122 wait(2);
frankvnk 9:3e117b89c705 123
frankvnk 9:3e117b89c705 124 // RGB color wheel demo (cycle through all colors)
frankvnk 9:3e117b89c705 125 TFT.cls();
frankvnk 9:3e117b89c705 126 TFT.foreground(Yellow); // set chars to yellow
frankvnk 9:3e117b89c705 127 TFT.set_font((unsigned char*) Arial12x12);
frankvnk 9:3e117b89c705 128 TFT.locate(10,10);
frankvnk 10:d07f76421408 129 printf("RGB color wheel (2x)");
frankvnk 9:3e117b89c705 130
frankvnk 9:3e117b89c705 131 uint8_t r = 255, g = 0, b = 0, step = 1, i;
frankvnk 9:3e117b89c705 132 for (i=0;i<2;i++)
frankvnk 9:3e117b89c705 133 {
frankvnk 9:3e117b89c705 134 for(;g<255;g+=step) {TFT.fillrect(70,110,100,100,RGB565CONVERT(r, g, b));} // Cycle from FF0000 to FFFF00 : red to yellow
frankvnk 9:3e117b89c705 135 for(;r>0;r-=step) {TFT.fillrect(70,110,100,100,RGB565CONVERT(r, g, b));} // Cycle from FFFF00 to 00FF00 : yellow to green
frankvnk 9:3e117b89c705 136 for(;b<255;b+=step) {TFT.fillrect(70,110,100,100,RGB565CONVERT(r, g, b));} // Cycle from 00FF00 to 00FFFF : green to cyan
frankvnk 9:3e117b89c705 137 for(;g>0;g-=step) {TFT.fillrect(70,110,100,100,RGB565CONVERT(r, g, b));} // Cycle from 00FFFF to 0000FF : cyan to blue
frankvnk 9:3e117b89c705 138 for(;r<255;r+=step) {TFT.fillrect(70,110,100,100,RGB565CONVERT(r, g, b));} // Cycle from 0000FF to FF00FF : blue to purple
frankvnk 9:3e117b89c705 139 for(;b>0;b-=step) {TFT.fillrect(70,110,100,100,RGB565CONVERT(r, g, b));} // Cycle from FF00FF to FF0000 : purple to red
frankvnk 9:3e117b89c705 140 }
frankvnk 9:3e117b89c705 141 wait(2);
frankvnk 9:3e117b89c705 142
frankvnk 9:3e117b89c705 143 // Touchpanel demo
frankvnk 9:3e117b89c705 144 TP.TouchPanel_Calibrate();
frankvnk 9:3e117b89c705 145 TFT.set_font((unsigned char*) Arial12x12);
frankvnk 9:3e117b89c705 146 TFT.set_orientation(0);
frankvnk 9:3e117b89c705 147 TFT.locate(0,0);
frankvnk 10:d07f76421408 148 printf(" X:");
frankvnk 9:3e117b89c705 149 TFT.locate(70,0);
frankvnk 10:d07f76421408 150 printf(" Y:");
frankvnk 9:3e117b89c705 151 while (1)
frankvnk 9:3e117b89c705 152 {
frankvnk 9:3e117b89c705 153 if (!TP._tp_irq)
frankvnk 9:3e117b89c705 154 {
frankvnk 9:3e117b89c705 155 if (TP.Read_Ads7846())
frankvnk 9:3e117b89c705 156 {
frankvnk 9:3e117b89c705 157 TP.getDisplayPoint() ;
frankvnk 9:3e117b89c705 158 TP.TP_DrawPoint(TP.display.x,TP.display.y, Blue);
frankvnk 9:3e117b89c705 159 TFT.locate(25,0);
frankvnk 10:d07f76421408 160 printf("%03d",TP.display.x);
frankvnk 9:3e117b89c705 161 TFT.locate(95,0);
frankvnk 10:d07f76421408 162 printf("%03d",TP.display.y);
frankvnk 9:3e117b89c705 163 // Touchscreen area is larger than LCD area.
frankvnk 9:3e117b89c705 164 // We use the bottom area outside the LCD area to clear the screen (y value > 320).
frankvnk 9:3e117b89c705 165 if (TP.display.y > 320)
frankvnk 9:3e117b89c705 166 {
frankvnk 9:3e117b89c705 167 TFT.cls();
frankvnk 9:3e117b89c705 168 TFT.locate(0,0);
frankvnk 10:d07f76421408 169 printf(" X:");
frankvnk 9:3e117b89c705 170 TFT.locate(70,0);
frankvnk 10:d07f76421408 171 printf(" Y:");
frankvnk 9:3e117b89c705 172 }
frankvnk 9:3e117b89c705 173 }
frankvnk 9:3e117b89c705 174 }
frankvnk 9:3e117b89c705 175 }
frankvnk 9:3e117b89c705 176 }
frankvnk 10:d07f76421408 177
frankvnk 10:d07f76421408 178 /*
frankvnk 10:d07f76421408 179 // =========================================================================================================
frankvnk 10:d07f76421408 180 // ================================================== TWO ==================================================
frankvnk 10:d07f76421408 181 // =========================================================================================================
frankvnk 10:d07f76421408 182
frankvnk 10:d07f76421408 183 #include "stdio.h"
frankvnk 10:d07f76421408 184 #include "mbed.h"
frankvnk 10:d07f76421408 185 #include "SDFileSystem.h"
frankvnk 10:d07f76421408 186 #include "Mini_DK.h"
frankvnk 10:d07f76421408 187
frankvnk 10:d07f76421408 188 // SD card
frankvnk 10:d07f76421408 189 SDFileSystem sd(SD_SDI, SD_SDO, SD_SCK, SD_CS, "sd");
frankvnk 10:d07f76421408 190 // TFT -> mosi, miso, sclk, cs
frankvnk 10:d07f76421408 191 SPI_TFT TFT(LCD_SDI, LCD_SDO, LCD_SCK, LCD_CS,"TFT");
frankvnk 10:d07f76421408 192 // ADS7843 -> mosi, miso, sclk, cs, irq, SPI_TFT
frankvnk 10:d07f76421408 193 TouchScreenADS7843 TP(TP_SDI ,TP_SDO ,TP_SCK ,TP_CS ,TP_IRQ, &TFT);
frankvnk 10:d07f76421408 194
frankvnk 10:d07f76421408 195 int main()
frankvnk 10:d07f76421408 196 {
frankvnk 10:d07f76421408 197 TFT.background(Black); // set background to black
frankvnk 10:d07f76421408 198 TFT.foreground(White); // set chars to white
frankvnk 10:d07f76421408 199
frankvnk 10:d07f76421408 200 TFT.claim(stdout); // send stdout to the TFT display
frankvnk 10:d07f76421408 201 TFT.cls();
frankvnk 10:d07f76421408 202 TFT.set_font((unsigned char*) Arial12x12);
frankvnk 10:d07f76421408 203 TFT.set_orientation(1);
frankvnk 10:d07f76421408 204
frankvnk 10:d07f76421408 205 DISABLE_LCD_MISO;
frankvnk 10:d07f76421408 206 int dummy = TFT.Bitmap(0,0,"/sd/house.bmp");
frankvnk 10:d07f76421408 207 ENABLE_LCD_MISO;
frankvnk 10:d07f76421408 208 TFT.locate(0,0);
frankvnk 10:d07f76421408 209 printf("%02d",dummy);
frankvnk 10:d07f76421408 210 }
frankvnk 10:d07f76421408 211 */
frankvnk 10:d07f76421408 212
frankvnk 10:d07f76421408 213 /*
frankvnk 10:d07f76421408 214 // =========================================================================================================
frankvnk 10:d07f76421408 215 // ================================================= THREE =================================================
frankvnk 10:d07f76421408 216 // =========================================================================================================
frankvnk 10:d07f76421408 217
frankvnk 10:d07f76421408 218 #include "stdio.h"
frankvnk 10:d07f76421408 219 #include "mbed.h"
frankvnk 10:d07f76421408 220 #include "SDFileSystem.h"
frankvnk 10:d07f76421408 221 #include "Mini_DK.h"
frankvnk 10:d07f76421408 222
frankvnk 10:d07f76421408 223 // SD card
frankvnk 10:d07f76421408 224 SDFileSystem sd(SD_SDI, SD_SDO, SD_SCK, SD_CS, "sd");
frankvnk 10:d07f76421408 225 // TFT -> mosi, miso, sclk, cs
frankvnk 10:d07f76421408 226 SPI_TFT TFT(LCD_SDI, LCD_SDO, LCD_SCK, LCD_CS,"TFT");
frankvnk 10:d07f76421408 227 // ADS7843 -> mosi, miso, sclk, cs, irq, SPI_TFT
frankvnk 10:d07f76421408 228 TouchScreenADS7843 TP(TP_SDI ,TP_SDO ,TP_SCK ,TP_CS ,TP_IRQ, &TFT);
frankvnk 10:d07f76421408 229
frankvnk 10:d07f76421408 230
frankvnk 10:d07f76421408 231 Timer timer;
frankvnk 10:d07f76421408 232
frankvnk 10:d07f76421408 233 int main()
frankvnk 10:d07f76421408 234 {
frankvnk 10:d07f76421408 235 DISABLE_LCD_MISO;
frankvnk 10:d07f76421408 236 TFT.background(Black); // set background to black
frankvnk 10:d07f76421408 237 TFT.foreground(White); // set chars to white
frankvnk 10:d07f76421408 238
frankvnk 10:d07f76421408 239 TFT.claim(stdout); // send stdout to the TFT display
frankvnk 10:d07f76421408 240 TFT.cls();
frankvnk 10:d07f76421408 241 TFT.set_font((unsigned char*) Arial12x12);
frankvnk 10:d07f76421408 242 TFT.set_orientation(1);
frankvnk 10:d07f76421408 243
frankvnk 10:d07f76421408 244 TFT.locate(0,200);
frankvnk 10:d07f76421408 245 printf("Loading from SD...");
frankvnk 10:d07f76421408 246 TFT.Bitmap(0,0,"/sd/house.bmp");
frankvnk 10:d07f76421408 247
frankvnk 10:d07f76421408 248 TFT.locate(0,0);
frankvnk 10:d07f76421408 249 printf("Copying to flash...");
frankvnk 10:d07f76421408 250 TFT.fileToFlash("/sd/house.bmp");
frankvnk 10:d07f76421408 251 TFT.locate(0,40);
frankvnk 10:d07f76421408 252 printf("Done: CLS in 2 seconds");
frankvnk 10:d07f76421408 253 wait(2);
frankvnk 10:d07f76421408 254 TFT.backgroundImage(false);
frankvnk 10:d07f76421408 255 TFT.cls();
frankvnk 10:d07f76421408 256 wait(2);
frankvnk 10:d07f76421408 257 TFT.backgroundImage(true);
frankvnk 10:d07f76421408 258
frankvnk 10:d07f76421408 259
frankvnk 10:d07f76421408 260 timer.reset();
frankvnk 10:d07f76421408 261 timer.start();
frankvnk 10:d07f76421408 262 TFT.cls();
frankvnk 10:d07f76421408 263 timer.stop();
frankvnk 10:d07f76421408 264 TFT.foreground(Black);
frankvnk 10:d07f76421408 265 TFT.locate(0,200);
frankvnk 10:d07f76421408 266 printf("Wrote background in %d ms",timer.read_ms());
frankvnk 10:d07f76421408 267 TFT.foreground(Black);
frankvnk 10:d07f76421408 268
frankvnk 10:d07f76421408 269 TFT.set_orientation(3);
frankvnk 10:d07f76421408 270 TFT.locate(0,200);
frankvnk 10:d07f76421408 271 printf("Wrote background in %d ms",timer.read_ms());
frankvnk 10:d07f76421408 272
frankvnk 10:d07f76421408 273 wait(5);
frankvnk 10:d07f76421408 274 TFT.cls();
frankvnk 10:d07f76421408 275 TFT.set_font((unsigned char*) Neu42x35);
frankvnk 10:d07f76421408 276 TFT.locate(0,50);
frankvnk 10:d07f76421408 277 printf("Orient = 3");
frankvnk 10:d07f76421408 278 TFT.set_orientation(0);
frankvnk 10:d07f76421408 279 TFT.locate(0,50);
frankvnk 10:d07f76421408 280 printf("Orient = 0");
frankvnk 10:d07f76421408 281 wait(5);
frankvnk 10:d07f76421408 282
frankvnk 10:d07f76421408 283 TFT.set_orientation(0);
frankvnk 10:d07f76421408 284 TFT.cls();
frankvnk 10:d07f76421408 285 TFT.locate(0,50);
frankvnk 10:d07f76421408 286 printf("Orient = 0");
frankvnk 10:d07f76421408 287
frankvnk 10:d07f76421408 288 while(1);
frankvnk 10:d07f76421408 289 }
frankvnk 10:d07f76421408 290 */