Operating System

Dependencies:   UnitTest wolfssh mDNS wolfcrypt wolfSSL

This is an embedded operating system for K64F. It includes a ssh server, a web-server and mDNS server. It has POST on boot. The main purpose of the OS is a router for the thing network.

main.cpp

Committer:
sPymbed
Date:
2019-06-13
Revision:
2:453e73d66757
Parent:
1:4059ac7ebc65
Child:
3:351ee68a721d

File content as of revision 2:453e73d66757:

#include "mbed.h"
#include <EthernetInterface.h>
#include <FreescaleIAP.h>
#include <drivers/vga.h>
#include <gui/desktop.h>

//#define DEBUG
//#define GRAPHICSMODE

const int PORT = 8000;

static const char* SERVER_IP = "172.26.10.207"; //IP of server board
char screen[3840];

DigitalOut red(LED_RED);
DigitalOut blue(LED_BLUE);
DigitalOut green(LED_GREEN);
        
class PrintfTCPHandler
{
public:
    bool HandleTransmissionControlProtocolMessage(TCPSocket* socket, char* data, uint16_t size)
    {
        if(size > 9
            && data[0] == 'G'
            && data[1] == 'E'
            && data[2] == 'T'
            && data[3] == ' '
            && data[4] == '/'
            && data[5] == ' '
            && data[6] == 'H'
            && data[7] == 'T'
            && data[8] == 'T'
            && data[9] == 'P'
        )
        {
            socket->send((uint8_t*)"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);
            socket->close();
        }

        return true;
    }
};

void write(unsigned int n, unsigned int addressOfX, char X){
    unsigned int address = n * SECTOR_SIZE; //Write in last sector     
    char *data   = (char*)address;                     //Read     
    // This works in C and C++
    char b[SECTOR_SIZE];
    b[addressOfX] = X;
    memcpy(b, data, SECTOR_SIZE * sizeof(char));       // int is a POD                           
    erase_sector(address);                
    program_flash(address, b, SECTOR_SIZE);            //an integers has four bytes each.
}

char read(unsigned int address){
    char *data = (char*)address;       //Read
    return data[0];
}

int main() {
    red = 1;
    blue = 0;
    green = 1;
    
    printf("Hello World! --- http://www.AlgorithMan.de\n");

    //TaskManager taskManager;
    /*
    Task task1(&gdt, taskA);
    Task task2(&gdt, taskB);
    taskManager.AddTask(&task1);
    taskManager.AddTask(&task2);
    */

    //InterruptManager interrupts(0x20, &gdt, &taskManager);
    //SyscallHandler syscalls(&interrupts, 0x80);

    printf("Initializing Hardware, Stage 1\n");
    
    #ifdef GRAPHICSMODE
        Desktop desktop(320, 200, 0x00, 0x00, 0xA8);
    #endif
    
    //DriverManager drvManager;

        #ifdef GRAPHICSMODE
            //KeyboardDriver keyboard(&interrupts, &desktop);
        #else
            //PrintfKeyboardEventHandler kbhandler;
            //KeyboardDriver keyboard(&interrupts, &kbhandler);
        #endif
        //drvManager.AddDriver(&keyboard);


        #ifdef GRAPHICSMODE
            //MouseDriver mouse(&interrupts, &desktop);
        #else
            //MouseToConsole mousehandler;
            //MouseDriver mouse(&interrupts, &mousehandler);
        #endif
        //drvManager.AddDriver(&mouse);

        //PeripheralComponentInterconnectController PCIController;
        //PCIController.SelectDrivers(&drvManager, &interrupts);
        
        #ifdef GRAPHICSMODE
            VideoGraphicsArray vga;
        #endif
        
    printf("Initializing Hardware, Stage 2\n");
        //drvManager.ActivateAll();

    printf("Initializing Hardware, Stage 3\n");

    #ifdef GRAPHICSMODE
        vga.SetMode(320, 200, 8);
        Window win1(&desktop, 10, 10, 20, 20, 0xA8, 0x00, 0x00);
        desktop.AddChild(&win1);
        Window win2(&desktop, 40, 15, 30, 30, 0x00, 0xA8, 0x00);
        desktop.AddChild(&win2);
    #endif

    EthernetInterface interface;
    interface.disconnect();
    interface.connect();
       
    // Show the network address
    const char *ip = interface.get_ip_address();
    printf("IP address is: %s\n", ip ? ip : "No IP");
    
    //InternetControlMessageProtocol icmp(&ipv4);

    //interrupts.Activate();

    printf("\n\n\n\n");

    PrintfTCPHandler tcphandler;
    TCPServer server;
    UDPSocket sockUDP(&interface);                 //creat Ethernet socket
    SocketAddress sockAddr(SERVER_IP, PORT);

    server.open(&interface);
    
    server.bind(interface.get_ip_address(), 80);
    server.listen();
    server.set_blocking(false);
    TCPSocket client;            //!< client class
    SocketAddress clt_addr;
    int bufferSize = 512;
    char buffer[bufferSize];
    
    //TransmissionControlProtocolSocket* tcpsocket = tcp.Connect(ip2_be, 1234);
    //tcpsocket->Send((uint8_t*)"Hello TCP!", 10);

    //icmp.RequestEchoReply(gip_be);

    //PrintfUDPHandler udphandler;

    //UserDatagramProtocolSocket* udpsocket = udp.Listen(1234);
    //udp.Bind(udpsocket, &udphandler);
  
    while (true){
          //printf("\nCLIENT - Sending '%i' to server %s\r\n", screen[0], SERVER_IP);       //print message to send
          sockUDP.sendto(SERVER_IP, PORT, screen, sizeof(screen));
          server.accept(&client, &clt_addr);
          int len = client.recv(&buffer, bufferSize);
          
#ifdef DEBUG
      printf("%d: ", len);
      for (int i = 0; i < len; i++)
          printf("%d ", buffer[i]);
      printf("\r\n");
#endif

          tcphandler.HandleTransmissionControlProtocolMessage(&client, (char*)buffer, len);
          wait(0.03333333);
       }
}