Commit
Dependencies: EthernetInterface NetworkAPI SDC21XX_Motor mbed-rtos mbed
Fork of TCP_Server_Example by
main.cpp
- Committer:
- kkoichy
- Date:
- 2016-07-21
- Revision:
- 13:b9bcffe7e649
- Parent:
- 12:5e342c364d61
File content as of revision 13:b9bcffe7e649:
#include "mbed.h" #include "SDC21XX_Motor.h" #include "rtos.h" #include "EthernetInterface.h" #include "NetworkAPI/buffer.hpp" #include "NetworkAPI/select.hpp" #include "NetworkAPI/ip/address.hpp" #include "NetworkAPI/tcp/socket.hpp" using namespace network; #define MAX_CLIENTS 1 #define SERVER_PORT 11556 #define PERIODE_ENVOI 2.0 #define REDUC_M1 1 #define REDUC_M2 1 #define REDUC_M3 1 #define REDUC_M4 1 #define REDUC_M5 1 #define REDUC_M6 1 Timer t, t2; Mutex mutex1; CAN CanBus(P0_4,P0_5); SDC21XX_Motor Motor1(1, &CanBus, 1, REDUC_M1, 1000); SDC21XX_Motor Motor2(1, &CanBus, 2, REDUC_M2, 1000); SDC21XX_Motor Motor3(2, &CanBus, 1, REDUC_M3, 1000); SDC21XX_Motor Motor4(2, &CanBus, 2, REDUC_M4, 1000); SDC21XX_Motor Motor5(3, &CanBus, 1, REDUC_M5, 1000); SDC21XX_Motor Motor6(3, &CanBus, 2, REDUC_M6, 1000); SDC21XX_Motor Moteur[6] = {Motor1, Motor2, Motor3, Motor4, Motor5, Motor6}; uint8_t client_connected = 0, move_increment = 0, move_increment_val = 0; tcp::Socket server; tcp::Socket client[MAX_CLIENTS]; tcp::Socket *socket = NULL; void periodic_encoder_isr(void const *args) { char reply[45], i = 0; long dummy; while(1) { mutex1.lock(); printf("Ticker\n\r"); reply[0] = 0xa5; for(i = 1;i<6;i++) reply[7*i] = 0xa6; for(i=0;i<6;i++) { reply[1+i*7] = 0x11; reply[2+i*7] = i+1; dummy = Moteur[i].GetRB()->ReadAbsoluteEncoderCount(Moteur[i].GetChannel()); memcpy(&reply[3+i*7], &dummy, 4); } reply[42] = 0xa7; client[0].write((void *)reply, 43); Thread::wait(200); mutex1.unlock(); } } int Process_Data_TCP_IP(uint8_t * data, tcp::Socket * client); int main() { mutex1.lock(); Thread thread1(periodic_encoder_isr); EthernetInterface interface; interface.init(); interface.connect(); printf("IP Address is %s\n\r", interface.getIPAddress()); Select select; int result = 0; int index = 0; network::Buffer buffer(256); std::string message("Hello world!"); // Configure the server socket (assume everty thing works) server.open(); server.bind(SERVER_PORT); server.listen(MAX_CLIENTS); // Add sockets to the select api select.set(&server, Select::Read); for (index = 0; index < MAX_CLIENTS; index++) { select.set(&client[index], Select::Read); } do { // Wait for activity result = select.wait(); if (result < -1) { printf("Failed to select\n\r"); break; } // Get the first socket socket = (tcp::Socket *)select.getReadable(); for (; socket != NULL; socket = (tcp::Socket *)select.getReadable()) { // Check if there was a connection request. if (socket->getHandle() == server.getHandle()) { // Find an unused client for (index = 0; index < MAX_CLIENTS; index++) { if (client[index].getStatus() == network::Socket::Closed) { break; } } // Maximum connections reached if (index == MAX_CLIENTS) { printf("Maximum connections reached\n\r"); continue; } // Accept the client socket->accept(client[index]); printf("Client connected %s:%d\n\r", client[index].getRemoteEndpoint().getAddress().toString().c_str(), client[index].getRemoteEndpoint().getPort()); // Send a nice message to the client client[index].write((void *)message.data(), message.size()); client_connected = 1; mutex1.unlock(); continue; } // It was not the server socket, so it must be a client talking to us. switch (socket->read(buffer)) { case 0: // Remote end disconnected printf("Client disconnected %s:%d\n\r", socket->getRemoteEndpoint().getAddress().toString().c_str(), socket->getRemoteEndpoint().getPort()); client_connected = 0; mutex1.lock(); // Close socket socket->close(); break; case -1: printf("Error while reading data from socket\n\r"); socket->close(); break; default: printf("Message from %s:%d\n\r", socket->getRemoteEndpoint().getAddress().toString().c_str(), socket->getRemoteEndpoint().getPort()); printf("%s\n\r", (char *)buffer.data()); Process_Data_TCP_IP((uint8_t *)buffer.data(), client); break; } } if(move_increment) { if(t.read_ms() > 100) { Moteur[move_increment].GetRB()->SetPosRelative(move_increment_val, Moteur[move_increment].GetChannel()); t.reset(); t.start(); } else if(t2.read_ms() > 500) { move_increment = 0; move_increment_val = 0; } } } while (server.getStatus() == network::Socket::Listening); } int Process_Data_TCP_IP(uint8_t * data, tcp::Socket * client) { uint8_t nb_com = 0, cpt_com = 0, cpt_reply = 0; int32_t param[3], dummy; uint8_t reply[46]; reply[0] = 0xa5; cpt_reply ++; //Check Start byte if(data[0] != 0xa5) return -1; switch(data[1 + cpt_com]) { case 0x01 : param[0] = data[cpt_com + 3] | data[cpt_com + 4] << 8 | data[cpt_com + 5] << 16 | data[cpt_com + 6] << 24; param[1] = data[cpt_com + 7] | data[cpt_com + 8] << 8 | data[cpt_com + 9] << 16 | data[cpt_com + 10] << 24; param[2] = data[cpt_com + 11] | data[cpt_com + 12] << 8 | data[cpt_com + 13] << 16 | data[cpt_com + 14] << 24; Moteur[data[cpt_com + 2] - 1].Setparameters(param[0], param[1], param[2]); break; case 0x02 : param[0] = data[cpt_com + 3] | data[cpt_com + 4] << 8 | data[cpt_com + 5] << 16 | data[cpt_com + 6] << 24; Moteur[data[cpt_com + 2] - 1].GetRB()->SetPosition(param[0], Moteur[data[cpt_com + 2]].GetChannel()); break; case 0x03 : move_increment = data[cpt_com + 2] - 1; t.reset(); t.start(); t2.reset(); t2.start(); move_increment_val = data[cpt_com + 3] | data[cpt_com + 4] << 8 | data[cpt_com + 5] << 16 | data[cpt_com + 6] << 24; break; case 0x11 : if(cpt_reply > 1) { reply[cpt_reply] = 0xa6; cpt_reply++; } reply[cpt_reply] = data[cpt_com + 2]; cpt_reply++; dummy = Moteur[data[cpt_com + 2] - 1].GetRB()->ReadAbsoluteEncoderCount(Moteur[data[cpt_com + 2]].GetChannel()); memcpy(&reply[cpt_reply], &dummy, 4); cpt_reply += 4; break; case 0x80 : // Moteur[0] break; }//end switch reply[cpt_reply] = 0xa7; reply[cpt_reply + 1] = '\0'; client->write((void *)reply, cpt_reply + 1); return 1; }//end function /********************/ // Fonction qui permet de modifier l'adresse MAC de la carte // /!\ /!\ /!\ Le routeur doit être paramétré de façon adequate, pour attribuer une adresse IP définie à cette adresse MAC /!\ /!\ /!\ //(Dans un souci de simplicité, principalement, mais aussi pour différencier la carte des autres appareils se connectant au réseau) extern "C" void mbed_mac_address(char *mac) { mac[0] = 0x12; mac[1] = 0x34; mac[2] = 0x56; mac[3] = 0x78; mac[4] = 0x9A; mac[5] = 0xBC; };