Operating System

Dependencies:   UnitTest wolfssh mDNS wolfcrypt wolfSSL

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include <EthernetInterface.h>
00003 #include <drivers/vga.h>
00004 #include <gui/desktop.h>
00005 #include "mDNSResponder.h"
00006 #include "UnitTest.h"
00007 #include <user_settings.h>
00008 #include <string>
00009 
00010 #define MAXDATASIZE (1024*4)
00011 
00012 //#define GRAPHICSMODE
00013 
00014 const int PORT = 8000;
00015 static const char* SERVER_IP = "172.26.10.207"; //IP of server board
00016 char screen[3840];
00017 
00018 DigitalOut red(LED_RED);
00019 DigitalOut blue(LED_BLUE);
00020 DigitalOut green(LED_GREEN);
00021 FlashIAP flash;
00022 Serial pc(USBTX, USBRX);
00023 
00024 class PrintfTCPHandler
00025 {
00026 public:
00027     bool HandleTransmissionControlProtocolMessage(TCPSocket* socket, char* data, uint16_t size)
00028     {
00029         if(size > 9
00030             && data[0] == 'G'
00031             && data[1] == 'E'
00032             && data[2] == 'T'
00033             && data[3] == ' '
00034             && data[4] == '/'
00035             && data[5] == ' '
00036             && data[6] == 'H'
00037             && data[7] == 'T'
00038             && data[8] == 'T'
00039             && data[9] == 'P'
00040         )
00041         {
00042             unsigned int address = flash.get_flash_size() - 4096; //Write in last sector
00043             char *data = (char*)address;                          //Read
00044             socket->send("HTTP/1.1 200 OK\r\nServer: MyOS\r\nContent-Type: text/html\r\n\r\n<html><head><title>My Operating System</title></head><body><b>My Operating System</b> http://www.AlgorithMan.de</body></html>\r\n", 184);
00045             socket->close();
00046         } else {
00047             socket->close();
00048         }
00049 
00050         return true;
00051     }
00052 };
00053 
00054 void write(unsigned int n, unsigned int addressOfX, char X){
00055     unsigned int address = n * 4096;            //Write in n sector     
00056     char *data   = (char*)address;              //Read     
00057     char b[4096];
00058     b[addressOfX] = X;
00059     memcpy(b, data, 4096 * sizeof(char));       //int is a POD                           
00060     flash.erase(address, flash.get_sector_size(address));                
00061     flash.program(b, address, 4096);
00062 }
00063 
00064 void write(char *data, unsigned int size){
00065     unsigned int address = flash.get_flash_size() - 4096; //Write in last sector                     
00066     flash.erase(address, flash.get_sector_size(address));                
00067     flash.program(data, address, size);
00068 }
00069 
00070 char read(unsigned int address){
00071     char *data = (char*)address; //Read
00072     return data[0];
00073 }
00074 
00075 EthernetInterface interface;
00076 
00077 void http() {
00078     PrintfTCPHandler tcphandler;
00079     TCPSocket server;
00080     server.open(&interface);
00081     server.bind(80);
00082     server.listen(1);
00083     TCPSocket *client;
00084     int bufferSize = 512;
00085     char buffer[bufferSize];
00086 
00087     while (true) {
00088         client = server.accept();
00089         int len = client->recv(&buffer, bufferSize);
00090           
00091 #ifdef DEBUG
00092       printf("%d: ", len);
00093       for (int i = 0; i < len; i++)
00094           printf("%d ", buffer[i]);
00095       printf("\r\n");
00096 #endif
00097 
00098         tcphandler.HandleTransmissionControlProtocolMessage(client, (char*)buffer, len);
00099         wait(0.03333333);
00100     }
00101 }
00102 
00103 void mDNS() {
00104     mDNSResponder mdns(interface);
00105     mdns.announce(interface.get_ip_address());
00106     while (true) {
00107         mdns.MDNS_process();
00108         wait(0.03333333);
00109     }
00110 }
00111 
00112 volatile char c = '\0'; // Initialized to the NULL character
00113  
00114 void onCharReceived()
00115 {
00116     //c = pc.getc();
00117     pc.putc(c);
00118 }
00119     
00120 int main() {
00121     //pc.attach(&onCharReceived);
00122     pc.baud(115200);
00123     red = 1;
00124     blue = 0;
00125     green = 1;
00126     
00127     UnitTest unitest;
00128     
00129     unitest.assertOn(red, 1);
00130     
00131     pc.printf("Hello World! --- http://www.AlgorithMan.de\n\r");
00132     
00133     //write("HTTP/1.1 200 OK\r\nServer: MyOS\r\nContent-Type: text/html\r\n\r\n<html><head><title>My Operating System</title></head><body><b>My Operating System</b> http://www.AlgorithMan.de</body></html>\r\n", 184);
00134     
00135     Thread task1;
00136     Thread task2;
00137 
00138     //InterruptManager interrupts(0x20, &gdt, &taskManager);
00139 
00140     pc.printf("Initializing Hardware, Stage 1\n\r");
00141     
00142     #ifdef GRAPHICSMODE
00143         Desktop desktop(320, 200, 0x00, 0x00, 0xA8);
00144     #endif
00145     
00146 
00147         #ifdef GRAPHICSMODE
00148             //KeyboardDriver keyboard(&interrupts, &desktop);
00149         #else
00150             //PrintfKeyboardEventHandler kbhandler;
00151             //KeyboardDriver keyboard(&interrupts, &kbhandler);
00152         #endif
00153 
00154 
00155         #ifdef GRAPHICSMODE
00156             //MouseDriver mouse(&interrupts, &desktop);
00157         #else
00158             //MouseToConsole mousehandler;
00159             //MouseDriver mouse(&interrupts, &mousehandler);
00160         #endif
00161         
00162         #ifdef GRAPHICSMODE
00163             VideoGraphicsArray vga;
00164         #endif
00165         
00166     pc.printf("Initializing Hardware, Stage 2\n\r");
00167 
00168     #ifdef GRAPHICSMODE
00169         vga.SetMode(320, 200, 8);
00170         Window win1(&desktop, 10, 10, 20, 20, 0xA8, 0x00, 0x00);
00171         desktop.AddChild(&win1);
00172         Window win2(&desktop, 40, 15, 30, 30, 0x00, 0xA8, 0x00);
00173         desktop.AddChild(&win2);
00174     #endif
00175 
00176     interface.connect();
00177 
00178     // Show the network address
00179     const char *ip = interface.get_ip_address();
00180     pc.printf("IP address is: %s\n\r", ip ? ip : "No IP");
00181 
00182     //interrupts.Activate();
00183 
00184     //UDPSocket sockUDP;
00185     //sockUDP.open(&interface);
00186     
00187     //TransmissionControlProtocolSocket* tcpsocket = tcp.Connect(ip2_be, 1234);
00188     //tcpsocket->Send((uint8_t*)"Hello TCP!", 10);
00189 
00190     //PrintfUDPHandler udphandler;
00191 
00192     //UserDatagramProtocolSocket* udpsocket = udp.Listen(1234);
00193     //udp.Bind(udpsocket, &udphandler);
00194     task1.start(mDNS);
00195     task2.start(http);
00196     string input;
00197     while (true){
00198         //sockUDP.sendto(SERVER_IP, PORT, screen, sizeof(screen));
00199         char c = pc.getc();
00200         if (c == ';'){
00201             pc.printf("%s\n\r", input.c_str());
00202             input.clear();
00203         } else {
00204             input += c;
00205         }
00206         wait(0.03333333);
00207     }
00208 }