TELNET TO UART using STM32F103C8 generic board and ENC28J60. It is a very initial version with just for test program. Uses UIPEthernet Library courtesy of Zoltan hudak and Norbert Truchsess. Thanks
Dependencies: UIPEthernet mbed-STM32F103C8T6 mbed Adafruit_GFX
Fork of WebSwitch_ENC28J60 by
main.cpp@8:bb8aa896c7f5, 2016-12-05 (annotated)
- Committer:
- neutron_striker
- Date:
- Mon Dec 05 18:30:59 2016 +0000
- Revision:
- 8:bb8aa896c7f5
- Parent:
- 7:df33cd7ec9de
In this version OLED display has been added to display IP address assigned via DHCP
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
hudakz | 5:0ab8292e37da | 1 | /* |
hudakz | 5:0ab8292e37da | 2 | * In this project LED1 on the mbed board is switched on/off using a web browser. |
hudakz | 5:0ab8292e37da | 3 | * However, you can easily modify the project to remotely switch on/off any external device. |
hudakz | 5:0ab8292e37da | 4 | * The HTTP server is built from an mbed board and an ENC28J60 board. |
hudakz | 5:0ab8292e37da | 5 | * ENC28J60 is driven by the UIPEthernet library <https://github.com/ntruchsess/arduino_uip>. |
hudakz | 4:d34811deedab | 6 | * The example is based on the Tuxgraphics Web Switch <http://www.tuxgraphics.org/>. |
hudakz | 0:68a0003c4cb8 | 7 | */ |
hudakz | 6:b38a3b476a45 | 8 | |
neutron_striker | 8:bb8aa896c7f5 | 9 | //data transmission from telnet to UART is very smooth but from uart to telnet is not good when I pasted a text of one page all i got was |
neutron_striker | 8:bb8aa896c7f5 | 10 | //garbage. |
neutron_striker | 8:bb8aa896c7f5 | 11 | |
neutron_striker | 7:df33cd7ec9de | 12 | #define TARGET_STM32F103C8T6 1 // uncomment this line when using STM32F103C8T6 boards! |
hudakz | 6:b38a3b476a45 | 13 | |
hudakz | 6:b38a3b476a45 | 14 | #if defined(TARGET_STM32F103C8T6) |
hudakz | 6:b38a3b476a45 | 15 | #define LED_PIN PC_13 |
hudakz | 6:b38a3b476a45 | 16 | const int OFF = 1; |
hudakz | 6:b38a3b476a45 | 17 | const int ON = 0; |
hudakz | 6:b38a3b476a45 | 18 | #else |
hudakz | 6:b38a3b476a45 | 19 | #define LED_PIN LED1 |
hudakz | 6:b38a3b476a45 | 20 | const int OFF = 0; |
hudakz | 6:b38a3b476a45 | 21 | const int ON = 1; |
hudakz | 6:b38a3b476a45 | 22 | #endif |
hudakz | 6:b38a3b476a45 | 23 | |
hudakz | 6:b38a3b476a45 | 24 | #include "mbed.h" |
hudakz | 6:b38a3b476a45 | 25 | #include "UIPEthernet.h" |
hudakz | 6:b38a3b476a45 | 26 | #include "UIPServer.h" |
hudakz | 6:b38a3b476a45 | 27 | #include "UIPClient.h" |
hudakz | 6:b38a3b476a45 | 28 | #include "string" |
hudakz | 0:68a0003c4cb8 | 29 | |
neutron_striker | 8:bb8aa896c7f5 | 30 | |
hudakz | 5:0ab8292e37da | 31 | using namespace std; |
hudakz | 0:68a0003c4cb8 | 32 | |
neutron_striker | 7:df33cd7ec9de | 33 | Serial pc(PA_9, PA_10); // tx, rx |
hudakz | 6:b38a3b476a45 | 34 | |
neutron_striker | 8:bb8aa896c7f5 | 35 | |
neutron_striker | 8:bb8aa896c7f5 | 36 | /////////OLED STUFF////////////////////////////// |
neutron_striker | 8:bb8aa896c7f5 | 37 | #include "Adafruit_SSD1306.h" |
neutron_striker | 8:bb8aa896c7f5 | 38 | //I2C obj(sda,scl); |
neutron_striker | 8:bb8aa896c7f5 | 39 | I2C i2c2(PB_11,PB_10); //read more info about SSD1306 trouble in "SSD1306_test" project. and I don't know why but using PB_8 and PB_9 for I2C screws up SPI or atleast the ENC28J60, need to find out maybe from STM32F103 DATASHEET. |
neutron_striker | 8:bb8aa896c7f5 | 40 | //Adafruit_SSD1306_I2c(I2C &i2c, PinName RST, uint8_t i2cAddress = SSD_I2C_ADDRESS, uint8_t rawHeight = 32, uint8_t rawWidth = 128) |
neutron_striker | 8:bb8aa896c7f5 | 41 | Adafruit_SSD1306_I2c lcd(i2c2,PB_13,0x78,64,128); //also mbed takes i2c address in 8bit mode, any unused pin can be given as "reset" pin. |
neutron_striker | 8:bb8aa896c7f5 | 42 | |
neutron_striker | 8:bb8aa896c7f5 | 43 | ///////////////////////////////////////////////////// |
neutron_striker | 8:bb8aa896c7f5 | 44 | |
neutron_striker | 8:bb8aa896c7f5 | 45 | |
hudakz | 6:b38a3b476a45 | 46 | #define DHCP 1 // if you'd like to use static IP address comment out this line |
hudakz | 6:b38a3b476a45 | 47 | |
hudakz | 0:68a0003c4cb8 | 48 | // UIPEthernet is the name of a global instance of UIPEthernetClass. |
hudakz | 0:68a0003c4cb8 | 49 | // Do not change the name! It is used within the UIPEthernet library. |
neutron_striker | 7:df33cd7ec9de | 50 | UIPEthernetClass UIPEthernet(PB_5, PB_4, PB_3, PB_6); // mosi, miso, sck, cs |
neutron_striker | 7:df33cd7ec9de | 51 | |
neutron_striker | 7:df33cd7ec9de | 52 | // However, make sure that it does not collide with any of the SPI pins |
neutron_striker | 7:df33cd7ec9de | 53 | // already used in the UIPEthernet(...) constructor above! |
neutron_striker | 7:df33cd7ec9de | 54 | // In this example we are turning on/off LED1. |
neutron_striker | 7:df33cd7ec9de | 55 | DigitalOut sw(LED_PIN); // Change LED_PIN to a pin of your choice. |
neutron_striker | 7:df33cd7ec9de | 56 | |
hudakz | 4:d34811deedab | 57 | |
hudakz | 5:0ab8292e37da | 58 | // If your board/plaform is not present yet then uncomment |
hudakz | 5:0ab8292e37da | 59 | // the following two lines and replace TARGET_YOUR_BOARD as appropriate. |
hudakz | 4:d34811deedab | 60 | |
hudakz | 5:0ab8292e37da | 61 | //#elif defined(TARGET_YOUR_BOARD) |
hudakz | 5:0ab8292e37da | 62 | //UIPEthernetClass UIPEthernet(SPI_MOSI, SPI_MISO, SPI_SCK, SPI_CS); // mosi, miso, sck, cs |
hudakz | 4:d34811deedab | 63 | |
neutron_striker | 7:df33cd7ec9de | 64 | //#endif |
hudakz | 0:68a0003c4cb8 | 65 | |
hudakz | 4:d34811deedab | 66 | // Note: |
hudakz | 4:d34811deedab | 67 | // If it happends that any of the SPI_MOSI, SPI_MISO, SPI_SCK, SPI_CS pins collide with LED1 pin |
hudakz | 5:0ab8292e37da | 68 | // then either use different SPI port (if available on the board) and change the pin names |
hudakz | 5:0ab8292e37da | 69 | // in the constructor UIPEthernet(...) accordingly or instead of using LED1 pin, select |
hudakz | 5:0ab8292e37da | 70 | // a free pin (not used by SPI port) and connect to it an external LED which is connected |
hudakz | 5:0ab8292e37da | 71 | // to a 220 Ohm resitor that is connected to the groud. |
hudakz | 4:d34811deedab | 72 | // In the second case remember to replace LED1 in sw(LED1) constructor (see below). |
hudakz | 5:0ab8292e37da | 73 | // MAC number must be unique within the connected network. Modify as appropriate. |
hudakz | 5:0ab8292e37da | 74 | const uint8_t MY_MAC[6] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x06 }; |
neutron_striker | 7:df33cd7ec9de | 75 | const uint16_t MY_PORT = 23; // for TELNET connection |
neutron_striker | 7:df33cd7ec9de | 76 | EthernetServer server = EthernetServer(MY_PORT); |
neutron_striker | 8:bb8aa896c7f5 | 77 | #define MAX_NUM_CLIENT 1 |
neutron_striker | 8:bb8aa896c7f5 | 78 | EthernetClient clients[MAX_NUM_CLIENT]; |
hudakz | 0:68a0003c4cb8 | 79 | |
neutron_striker | 7:df33cd7ec9de | 80 | void loop(); |
hudakz | 0:68a0003c4cb8 | 81 | |
neutron_striker | 7:df33cd7ec9de | 82 | typedef uint8_t byte; |
hudakz | 0:68a0003c4cb8 | 83 | |
neutron_striker | 7:df33cd7ec9de | 84 | int main(void) { |
neutron_striker | 7:df33cd7ec9de | 85 | |
neutron_striker | 7:df33cd7ec9de | 86 | pc.baud(57600); |
neutron_striker | 7:df33cd7ec9de | 87 | // pc.format(8,SerialBase::Even,1); |
neutron_striker | 7:df33cd7ec9de | 88 | pc.printf("Program begins\r\n"); |
neutron_striker | 8:bb8aa896c7f5 | 89 | //lcd.printf("%ux%u OLED Display\r\n", lcd.width(), lcd.height()); |
neutron_striker | 8:bb8aa896c7f5 | 90 | lcd.printf("Telnet Server\n"); |
neutron_striker | 8:bb8aa896c7f5 | 91 | lcd.printf("Waiting for DHCP..\n"); |
neutron_striker | 8:bb8aa896c7f5 | 92 | lcd.display(); |
hudakz | 0:68a0003c4cb8 | 93 | |
hudakz | 6:b38a3b476a45 | 94 | #if defined(DHCP) |
hudakz | 6:b38a3b476a45 | 95 | pc.printf("Searching for DHCP server..\r\n"); |
hudakz | 6:b38a3b476a45 | 96 | if(UIPEthernet.begin(MY_MAC) != 1) { |
hudakz | 6:b38a3b476a45 | 97 | pc.printf("No DHCP server found.\r\n"); |
hudakz | 6:b38a3b476a45 | 98 | pc.printf("Exiting application.\r\n"); |
hudakz | 6:b38a3b476a45 | 99 | return 0; |
hudakz | 6:b38a3b476a45 | 100 | } |
hudakz | 6:b38a3b476a45 | 101 | pc.printf("DHCP server found.\r\n"); |
hudakz | 6:b38a3b476a45 | 102 | #else |
hudakz | 6:b38a3b476a45 | 103 | // IP address must be unique and compatible with your network. |
hudakz | 6:b38a3b476a45 | 104 | const IPAddress MY_IP(192, 168, 1, 181); // Change as appropriate. |
hudakz | 5:0ab8292e37da | 105 | UIPEthernet.begin(MY_MAC, MY_IP); |
hudakz | 6:b38a3b476a45 | 106 | #endif |
hudakz | 6:b38a3b476a45 | 107 | IPAddress localIP = UIPEthernet.localIP(); |
neutron_striker | 8:bb8aa896c7f5 | 108 | pc.printf("DHCP assigned IP : "); |
neutron_striker | 8:bb8aa896c7f5 | 109 | //lcd.clearDisplay(); |
neutron_striker | 8:bb8aa896c7f5 | 110 | //lcd.setTextCursor(0,0); |
neutron_striker | 8:bb8aa896c7f5 | 111 | lcd.setTextSize(2); |
neutron_striker | 8:bb8aa896c7f5 | 112 | lcd.printf("IP:"); |
neutron_striker | 8:bb8aa896c7f5 | 113 | for(uint8_t i = 0; i < 4; i++){ |
hudakz | 6:b38a3b476a45 | 114 | pc.printf("%d.", localIP[i]); |
neutron_striker | 8:bb8aa896c7f5 | 115 | lcd.printf("%d.", localIP[i]); |
neutron_striker | 8:bb8aa896c7f5 | 116 | } |
neutron_striker | 8:bb8aa896c7f5 | 117 | lcd.display(); |
neutron_striker | 8:bb8aa896c7f5 | 118 | pc.printf("Starting Telnet server"); |
neutron_striker | 7:df33cd7ec9de | 119 | server.begin(); |
neutron_striker | 7:df33cd7ec9de | 120 | while(1) |
neutron_striker | 7:df33cd7ec9de | 121 | { |
neutron_striker | 7:df33cd7ec9de | 122 | loop(); |
neutron_striker | 7:df33cd7ec9de | 123 | } |
neutron_striker | 7:df33cd7ec9de | 124 | |
neutron_striker | 7:df33cd7ec9de | 125 | } |
neutron_striker | 7:df33cd7ec9de | 126 | |
neutron_striker | 7:df33cd7ec9de | 127 | |
neutron_striker | 7:df33cd7ec9de | 128 | void clientPrint(char*, EthernetClient*); |
neutron_striker | 7:df33cd7ec9de | 129 | |
neutron_striker | 7:df33cd7ec9de | 130 | void loop() { |
neutron_striker | 7:df33cd7ec9de | 131 | // wait for a new client: |
neutron_striker | 7:df33cd7ec9de | 132 | EthernetClient client = server.available(); |
neutron_striker | 7:df33cd7ec9de | 133 | |
neutron_striker | 7:df33cd7ec9de | 134 | if (client) { |
hudakz | 0:68a0003c4cb8 | 135 | |
neutron_striker | 7:df33cd7ec9de | 136 | bool newClient = true; |
neutron_striker | 8:bb8aa896c7f5 | 137 | for (byte i=0;i<MAX_NUM_CLIENT;i++) { |
neutron_striker | 7:df33cd7ec9de | 138 | //check whether this client refers to the same socket as one of the existing instances: |
neutron_striker | 7:df33cd7ec9de | 139 | if (clients[i]==client) { |
neutron_striker | 7:df33cd7ec9de | 140 | newClient = false; |
neutron_striker | 7:df33cd7ec9de | 141 | break; |
neutron_striker | 7:df33cd7ec9de | 142 | } |
neutron_striker | 7:df33cd7ec9de | 143 | } |
hudakz | 0:68a0003c4cb8 | 144 | |
neutron_striker | 7:df33cd7ec9de | 145 | if (newClient) { |
neutron_striker | 7:df33cd7ec9de | 146 | //check which of the existing clients can be overridden: |
neutron_striker | 8:bb8aa896c7f5 | 147 | for (byte i=0;i<MAX_NUM_CLIENT;i++) { |
neutron_striker | 7:df33cd7ec9de | 148 | if (!clients[i] && clients[i]!=client) { |
neutron_striker | 7:df33cd7ec9de | 149 | clients[i] = client; |
neutron_striker | 7:df33cd7ec9de | 150 | // clead out the input buffer: |
neutron_striker | 7:df33cd7ec9de | 151 | client.flush(); |
neutron_striker | 7:df33cd7ec9de | 152 | // clead out the input buffer: |
neutron_striker | 7:df33cd7ec9de | 153 | client.flush(); |
neutron_striker | 7:df33cd7ec9de | 154 | pc.printf("We have a new client\r\n"); |
neutron_striker | 7:df33cd7ec9de | 155 | clientPrint("Hello Client\r\n",&client); |
neutron_striker | 7:df33cd7ec9de | 156 | clientPrint("my IP ",&client); |
neutron_striker | 7:df33cd7ec9de | 157 | //char localIP[]= UIPEthernet.localIP(); |
neutron_striker | 7:df33cd7ec9de | 158 | //client.write(localIP,strlen(localIP)); |
neutron_striker | 7:df33cd7ec9de | 159 | break; |
neutron_striker | 7:df33cd7ec9de | 160 | } |
neutron_striker | 7:df33cd7ec9de | 161 | } |
neutron_striker | 7:df33cd7ec9de | 162 | } |
hudakz | 0:68a0003c4cb8 | 163 | |
neutron_striker | 7:df33cd7ec9de | 164 | if (client.available() > 0) { |
neutron_striker | 7:df33cd7ec9de | 165 | // read the bytes incoming from the client: |
neutron_striker | 7:df33cd7ec9de | 166 | char thisChar = client.read(); |
neutron_striker | 7:df33cd7ec9de | 167 | // echo the bytes back to all other connected clients: |
neutron_striker | 8:bb8aa896c7f5 | 168 | for (byte i=0;i<MAX_NUM_CLIENT;i++) { |
neutron_striker | 7:df33cd7ec9de | 169 | if (clients[i] && clients[i]!=client) { |
neutron_striker | 7:df33cd7ec9de | 170 | clients[i].write(thisChar); |
neutron_striker | 7:df33cd7ec9de | 171 | } |
neutron_striker | 7:df33cd7ec9de | 172 | } |
neutron_striker | 7:df33cd7ec9de | 173 | // echo the bytes to the server as well: |
neutron_striker | 7:df33cd7ec9de | 174 | pc.putc(thisChar); |
neutron_striker | 7:df33cd7ec9de | 175 | } |
neutron_striker | 7:df33cd7ec9de | 176 | } |
neutron_striker | 8:bb8aa896c7f5 | 177 | for (byte i=0;i<MAX_NUM_CLIENT;i++) { |
neutron_striker | 7:df33cd7ec9de | 178 | if (!(clients[i].connected())) { |
neutron_striker | 7:df33cd7ec9de | 179 | // client.stop() invalidates the internal socket-descriptor, so next use of == will allways return false; |
neutron_striker | 7:df33cd7ec9de | 180 | clients[i].stop(); |
neutron_striker | 7:df33cd7ec9de | 181 | } |
neutron_striker | 7:df33cd7ec9de | 182 | } |
neutron_striker | 7:df33cd7ec9de | 183 | |
neutron_striker | 7:df33cd7ec9de | 184 | |
neutron_striker | 7:df33cd7ec9de | 185 | //This part is what I copied from ESP8266 WIFI TELNET example. |
neutron_striker | 7:df33cd7ec9de | 186 | //check UART for data |
neutron_striker | 7:df33cd7ec9de | 187 | if(pc.readable()){ |
neutron_striker | 7:df33cd7ec9de | 188 | /* |
neutron_striker | 7:df33cd7ec9de | 189 | size_t len = Serial.available(); |
neutron_striker | 7:df33cd7ec9de | 190 | uint8_t sbuf[len]; |
neutron_striker | 7:df33cd7ec9de | 191 | Serial.readBytes((char*)sbuf, len); |
neutron_striker | 7:df33cd7ec9de | 192 | */ |
neutron_striker | 7:df33cd7ec9de | 193 | char data_from_uart = pc.getc(); |
neutron_striker | 7:df33cd7ec9de | 194 | //push UART data to all connected telnet clients |
neutron_striker | 8:bb8aa896c7f5 | 195 | for(uint8_t i = 0; i < MAX_NUM_CLIENT; i++){ |
neutron_striker | 7:df33cd7ec9de | 196 | if (clients[i] && clients[i].connected()){ |
neutron_striker | 7:df33cd7ec9de | 197 | clients[i].write(data_from_uart); |
neutron_striker | 8:bb8aa896c7f5 | 198 | //wait(0.001); |
neutron_striker | 7:df33cd7ec9de | 199 | } |
neutron_striker | 7:df33cd7ec9de | 200 | } |
neutron_striker | 7:df33cd7ec9de | 201 | } |
neutron_striker | 7:df33cd7ec9de | 202 | |
neutron_striker | 7:df33cd7ec9de | 203 | } |
hudakz | 0:68a0003c4cb8 | 204 | |
neutron_striker | 7:df33cd7ec9de | 205 | void clientPrint(char * str, EthernetClient* client) |
neutron_striker | 7:df33cd7ec9de | 206 | {//TODO: make a member for client printf deriving from printf class |
neutron_striker | 7:df33cd7ec9de | 207 | uint8_t i=0; |
neutron_striker | 7:df33cd7ec9de | 208 | while(str[i]!='\0') |
neutron_striker | 7:df33cd7ec9de | 209 | { |
neutron_striker | 7:df33cd7ec9de | 210 | client->write((uint8_t)str[i]); |
neutron_striker | 7:df33cd7ec9de | 211 | i++; |
hudakz | 0:68a0003c4cb8 | 212 | } |
neutron_striker | 7:df33cd7ec9de | 213 | } |