UDP comms to ROV
RovComms.cpp
- Committer:
- inky
- Date:
- 2012-01-13
- Revision:
- 0:4a75d653c18c
- Child:
- 1:f51739cada16
File content as of revision 0:4a75d653c18c:
#include "RovComms.h" extern void debug(char *format,...); extern void debugInt(const char *format, int i); Ticker readNetwork; void readNetworkKick() { Net::poll(); } // readNetworkKick() RovComms::RovComms(int addr) { ResetValues(); #ifdef STATIC_IP_ADDR rovAddr = IpAddr(10,0,0,addr); eth = new EthernetNetIf(rovAddr, ipMask, ipGateway, ipDns); #else eth = new EthernetNetIf(); // uses DHCP #endif RxNetworkState = TxNetworkState = INIT; readNetwork.attach(&readNetworkKick, 0.1); // every 100ms read EthernetErr ethErr = eth->setup(); if(ethErr) { printf("Error %d in setup.\n", ethErr); //return -1; } InitRx(addr); if (addr == ROV_ADDR) InitTx(HANDSET_ADDR); else InitTx(ROV_ADDR); } // RovComms() void RovComms::InitRx(int addr) { TCPSocketErr err; RxSock = new TCPSocket(); RxSock->setOnEvent(this, &RovComms::onRxTCPSocketEvent); err = RxSock->bind(Host(IpAddr(), RX_TCP_LISTENING_PORT)); if(err) { //Deal with that error... } else { // set the socket to listen err = RxSock->listen(); //Starts listening if (err) CloseSocket(RxSock, &RxNetworkState); } } void RovComms::CloseSocket(TCPSocket *s, int *state) { s->close(); *state = CLOSED; } void RovComms::InitTx(int addr) { TCPSocketErr bindErr; Host server(IpAddr(10,0,0,addr), RX_TCP_LISTENING_PORT); // ip addr and port nos bindErr = TxSock->connect(server); switch(bindErr) { case TCPSOCKET_CONNECTED: TxNetworkState = CONNECTED; debug("RovComms::InitSlave -> connected"); break; case TCPSOCKET_CONTIMEOUT: case TCPSOCKET_CONRST: case TCPSOCKET_CONABRT: case TCPSOCKET_ERROR: default: CloseSocket(TxSock, &TxNetworkState); break; } // switch } /* @fn Transmit(char *data) * Sends the buffer to the other end */ void RovComms::Transmit(int pktType) { ClearBuffer(iTxData); iTxData[0] = pktType; switch (pktType) { case CMD_ROV: iTxData[ROV_SPEED_POS] = iRovSpeed; iTxData[ROV_TURN_POS] = iRovTurn; iTxData[ROV_VERT_POS] = iRovVert; break; case CMD_AUX: iTxData[AUX_CMD_POS] = 0; iTxData[AUX_LIGHT_POS] = iLight; iTxData[AUX_CAM_POS] = iCamera; iTxData[AUX_SOLENOID_POS] = iWaterSol + iAirSol; break; case CMD_STATS: iTxData[STATS_COMPASS_POS] = 23; iTxData[STATS_PRESSURE_POS] = 4; iTxData[STATS_X_ACCEL_POS] = 1; iTxData[STATS_Y_ACCEL_POS] = 1; iTxData[STATS_Z_ACCEL_POS] = 0; iTxData[STATS_TEMPERATURE_POS] = 20; iTxData[STATS_MISC_POS] = 69; break; case CMD_CLAW: iTxData[1] = 1; iTxData[2] = 2; iTxData[3] = 3; iTxData[4] = 4; break; case CMD_PTZ: iTxData[1] = 5; iTxData[2] = 6; iTxData[3] = 7; iTxData[4] = 8; break; default: return; } // switch pktType int errCode = TxSock->send(iTxData, MAX_BUFFER_SIZE); if (errCode < 0) // TCPSocketErr { } Net::poll(); // tells stack to process the info (transfer from here to the stack and tx it) } char *RovComms::Receive(void) { char *buf={0}; int errCode = 0; Net::poll(); // tell the stack to transfer the data from it's stack to the readable one here errCode = RxSock->recv(buf, MAX_BUFFER_SIZE); if (errCode < 0) // TCPSocketErr { } // decode the packet..... debugInt("Pkt type = ", buf[0]); for (int i=1;i<MAX_BUFFER_SIZE;i++) debugInt("Pkt data = ", buf[i]); return buf; } void RovComms::onConnectedTCPSocketEvent(TCPSocketEvent e) { switch(e) { case TCPSOCKET_ACCEPT: break; case TCPSOCKET_READABLE: Receive(); break; default: break; } } void RovComms::onRxTCPSocketEvent(TCPSocketEvent e) { TCPSocket* pConnectedSock; Host client; TCPSocketErr err; switch (e) { case TCPSOCKET_ACCEPT: err = RxSock->accept(&client, &pConnectedSock); if(!err) pConnectedSock->setOnEvent(this, &RovComms::onConnectedTCPSocketEvent); //Setup the new socket events case TCPSOCKET_READABLE: //The only event for now break; case TCPSOCKET_READABLE: Receive(); break; case TCPSOCKET_WRITEABLE: // continue the write process break; case TCPSOCKET_CONNECTED: case TCPSOCKET_CONTIMEOUT: case TCPSOCKET_CONRST: case TCPSOCKET_CONABRT: case TCPSOCKET_ERROR: default: break; } // switch(e) } // onRxTCPSocketEvent() // Slave socket event handler void RovComms::onTxTCPSocketEvent(TCPSocketEvent e) { TCPSocket* pConnectedSock; Host client; TCPSocketErr err; switch (e) { case TCPSOCKET_ACCEPT: // this event should never happen as a slave!!! break; case TCPSOCKET_READABLE: // don't think this event should happen Receive(); break; case TCPSOCKET_WRITEABLE: // continue the write process break; case TCPSOCKET_CONNECTED: case TCPSOCKET_CONTIMEOUT: case TCPSOCKET_CONRST: case TCPSOCKET_CONABRT: case TCPSOCKET_ERROR: default: break; } // switch(e) } // onSlaveTCPSocketEvent() void RovComms::ResetValues() { iRovSpeed = 0; iRovTurn = 0; iRovVert = 0; iLight = 0; iWaterSol = 0; iAirSol = 0; iCamera = 0; iPressure = 0; iCompass = 0; iAccelX = 0; iAccelY = 0; iAccelZ = 0; } void RovComms::RovPropulsion(int speed, int turn, int vert) { iRovSpeed = 0; iRovTurn = 0; iRovVert = 0; Transmit(CMD_ROV); } void RovComms::FrontLights(int state) { if (state == 1) iLight |= AUX_FN_LIGHT1_ON; else iLight &= ~AUX_FN_LIGHT1_ON; Transmit(CMD_AUX); } void RovComms::RearLights(int state) { if (state == 1) iLight |= AUX_FN_LIGHT2_ON; else iLight &= ~AUX_FN_LIGHT2_ON; Transmit(CMD_AUX); } void RovComms::Camera(int cam) { if (cam == 1) iCamera = AUX_FN_CAM1_ON; else iCamera = AUX_FN_CAM2_ON; Transmit(CMD_AUX); } void RovComms::Debug(const char *format, ...) { // send data to the debug device } // end of file