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 Zoltan Hudak

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?

UserRevisionLine numberNew 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 }