UDP comms to ROV

Committer:
inky
Date:
Mon Jan 16 17:32:54 2012 +0000
Revision:
2:48524892982c
Parent:
1:f51739cada16

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
inky 0:4a75d653c18c 1
inky 0:4a75d653c18c 2 #include "RovComms.h"
inky 0:4a75d653c18c 3
inky 0:4a75d653c18c 4
inky 0:4a75d653c18c 5 extern void debug(char *format,...);
inky 0:4a75d653c18c 6 extern void debugInt(const char *format, int i);
inky 0:4a75d653c18c 7
inky 0:4a75d653c18c 8
inky 0:4a75d653c18c 9 Ticker readNetwork;
inky 0:4a75d653c18c 10 void readNetworkKick()
inky 0:4a75d653c18c 11 {
inky 0:4a75d653c18c 12 Net::poll();
inky 0:4a75d653c18c 13 } // readNetworkKick()
inky 0:4a75d653c18c 14
inky 0:4a75d653c18c 15
inky 0:4a75d653c18c 16 RovComms::RovComms(int addr)
inky 0:4a75d653c18c 17 {
inky 0:4a75d653c18c 18 ResetValues();
inky 0:4a75d653c18c 19
inky 0:4a75d653c18c 20 #ifdef STATIC_IP_ADDR
inky 0:4a75d653c18c 21 rovAddr = IpAddr(10,0,0,addr);
inky 0:4a75d653c18c 22 eth = new EthernetNetIf(rovAddr, ipMask, ipGateway, ipDns);
inky 0:4a75d653c18c 23 #else
inky 0:4a75d653c18c 24 eth = new EthernetNetIf(); // uses DHCP
inky 0:4a75d653c18c 25 #endif
inky 0:4a75d653c18c 26
inky 0:4a75d653c18c 27 RxNetworkState = TxNetworkState = INIT;
inky 0:4a75d653c18c 28 readNetwork.attach(&readNetworkKick, 0.1); // every 100ms read
inky 0:4a75d653c18c 29 EthernetErr ethErr = eth->setup();
inky 0:4a75d653c18c 30 if(ethErr)
inky 0:4a75d653c18c 31 {
inky 0:4a75d653c18c 32 printf("Error %d in setup.\n", ethErr);
inky 0:4a75d653c18c 33 //return -1;
inky 0:4a75d653c18c 34 }
inky 1:f51739cada16 35 debug("Setting up Tx");
inky 0:4a75d653c18c 36 if (addr == ROV_ADDR)
inky 1:f51739cada16 37 InitUDP(HANDSET_ADDR);
inky 0:4a75d653c18c 38 else
inky 1:f51739cada16 39 InitUDP(ROV_ADDR);
inky 1:f51739cada16 40
inky 1:f51739cada16 41 debug("ROV Comms done");
inky 0:4a75d653c18c 42 } // RovComms()
inky 0:4a75d653c18c 43
inky 1:f51739cada16 44
inky 1:f51739cada16 45 void RovComms::InitUDP(int addr)
inky 0:4a75d653c18c 46 {
inky 1:f51739cada16 47 UdpSkt = new UDPSocket();
inky 1:f51739cada16 48 server = Host( IpAddr(/*10,0,0,addr*/), RX_TCP_LISTENING_PORT, NULL);
inky 1:f51739cada16 49 UdpSkt->setOnEvent(this, &RovComms::onUDPSocketEvent);
inky 1:f51739cada16 50 UdpSkt->bind(server);
inky 0:4a75d653c18c 51 }
inky 0:4a75d653c18c 52
inky 1:f51739cada16 53
inky 1:f51739cada16 54 void RovComms::CloseSocket(UDPSocket *s, int *state)
inky 0:4a75d653c18c 55 {
inky 0:4a75d653c18c 56 s->close();
inky 0:4a75d653c18c 57 *state = CLOSED;
inky 0:4a75d653c18c 58 }
inky 0:4a75d653c18c 59
inky 0:4a75d653c18c 60
inky 0:4a75d653c18c 61 /* @fn Transmit(char *data)
inky 0:4a75d653c18c 62 * Sends the buffer to the other end
inky 0:4a75d653c18c 63 */
inky 0:4a75d653c18c 64 void RovComms::Transmit(int pktType)
inky 0:4a75d653c18c 65 {
inky 0:4a75d653c18c 66 ClearBuffer(iTxData);
inky 0:4a75d653c18c 67
inky 0:4a75d653c18c 68 iTxData[0] = pktType;
inky 0:4a75d653c18c 69 switch (pktType)
inky 0:4a75d653c18c 70 {
inky 0:4a75d653c18c 71 case CMD_ROV:
inky 0:4a75d653c18c 72 iTxData[ROV_SPEED_POS] = iRovSpeed;
inky 0:4a75d653c18c 73 iTxData[ROV_TURN_POS] = iRovTurn;
inky 0:4a75d653c18c 74 iTxData[ROV_VERT_POS] = iRovVert;
inky 0:4a75d653c18c 75 break;
inky 0:4a75d653c18c 76
inky 0:4a75d653c18c 77 case CMD_AUX:
inky 0:4a75d653c18c 78 iTxData[AUX_CMD_POS] = 0;
inky 0:4a75d653c18c 79 iTxData[AUX_LIGHT_POS] = iLight;
inky 0:4a75d653c18c 80 iTxData[AUX_CAM_POS] = iCamera;
inky 0:4a75d653c18c 81 iTxData[AUX_SOLENOID_POS] = iWaterSol + iAirSol;
inky 0:4a75d653c18c 82 break;
inky 0:4a75d653c18c 83
inky 0:4a75d653c18c 84 case CMD_STATS:
inky 0:4a75d653c18c 85 iTxData[STATS_COMPASS_POS] = 23;
inky 0:4a75d653c18c 86 iTxData[STATS_PRESSURE_POS] = 4;
inky 0:4a75d653c18c 87 iTxData[STATS_X_ACCEL_POS] = 1;
inky 0:4a75d653c18c 88 iTxData[STATS_Y_ACCEL_POS] = 1;
inky 0:4a75d653c18c 89 iTxData[STATS_Z_ACCEL_POS] = 0;
inky 0:4a75d653c18c 90 iTxData[STATS_TEMPERATURE_POS] = 20;
inky 0:4a75d653c18c 91 iTxData[STATS_MISC_POS] = 69;
inky 0:4a75d653c18c 92 break;
inky 0:4a75d653c18c 93
inky 0:4a75d653c18c 94 case CMD_CLAW:
inky 0:4a75d653c18c 95 iTxData[1] = 1;
inky 0:4a75d653c18c 96 iTxData[2] = 2;
inky 0:4a75d653c18c 97 iTxData[3] = 3;
inky 0:4a75d653c18c 98 iTxData[4] = 4;
inky 0:4a75d653c18c 99 break;
inky 0:4a75d653c18c 100
inky 0:4a75d653c18c 101 case CMD_PTZ:
inky 0:4a75d653c18c 102 iTxData[1] = 5;
inky 0:4a75d653c18c 103 iTxData[2] = 6;
inky 0:4a75d653c18c 104 iTxData[3] = 7;
inky 0:4a75d653c18c 105 iTxData[4] = 8;
inky 0:4a75d653c18c 106 break;
inky 0:4a75d653c18c 107
inky 0:4a75d653c18c 108 default:
inky 0:4a75d653c18c 109 return;
inky 0:4a75d653c18c 110 } // switch pktType
inky 0:4a75d653c18c 111
inky 1:f51739cada16 112 int errCode = UdpSkt->sendto(iTxData, MAX_BUFFER_SIZE, NULL);
inky 1:f51739cada16 113 if (errCode < 0) // UDPSocketErr
inky 0:4a75d653c18c 114 {
inky 0:4a75d653c18c 115 }
inky 0:4a75d653c18c 116 Net::poll(); // tells stack to process the info (transfer from here to the stack and tx it)
inky 0:4a75d653c18c 117 }
inky 0:4a75d653c18c 118
inky 0:4a75d653c18c 119 char *RovComms::Receive(void)
inky 0:4a75d653c18c 120 {
inky 0:4a75d653c18c 121 int errCode = 0;
inky 0:4a75d653c18c 122 Net::poll(); // tell the stack to transfer the data from it's stack to the readable one here
inky 1:f51739cada16 123 errCode = UdpSkt->recvfrom(iRxData, MAX_BUFFER_SIZE, &server);
inky 0:4a75d653c18c 124 if (errCode < 0) // TCPSocketErr
inky 0:4a75d653c18c 125 {
inky 0:4a75d653c18c 126 }
inky 0:4a75d653c18c 127 // decode the packet.....
inky 1:f51739cada16 128 debugInt("Pkt type = ", iRxData[0]);
inky 0:4a75d653c18c 129 for (int i=1;i<MAX_BUFFER_SIZE;i++)
inky 1:f51739cada16 130 debugInt("Pkt data = ", iRxData[i]);
inky 1:f51739cada16 131 return iRxData;
inky 0:4a75d653c18c 132 }
inky 0:4a75d653c18c 133
inky 1:f51739cada16 134 void RovComms::onUDPSocketEvent(UDPSocketEvent e)
inky 0:4a75d653c18c 135 {
inky 1:f51739cada16 136 switch (e)
inky 1:f51739cada16 137 {
inky 1:f51739cada16 138 case UDPSOCKET_READABLE:
inky 1:f51739cada16 139 {
inky 2:48524892982c 140 Receive();
inky 2:48524892982c 141 //Host client;
inky 2:48524892982c 142 //int len = UdpSkt->recvfrom(iRxData, MAX_BUFFER_SIZE, &client);
inky 1:f51739cada16 143 //printf("Connected from %d.%d.%d.%d\r\n", (unsigned char)client->getIp()[0], (unsigned char)client->getIp()[1],
inky 1:f51739cada16 144 // (unsigned char)client->getIp()[2], (unsigned char)client->getIp()[3]);
inky 1:f51739cada16 145 break;
inky 1:f51739cada16 146 }
inky 0:4a75d653c18c 147
inky 1:f51739cada16 148 default:
inky 1:f51739cada16 149 break;
inky 1:f51739cada16 150 } // end switch
inky 1:f51739cada16 151 }
inky 0:4a75d653c18c 152
inky 0:4a75d653c18c 153
inky 0:4a75d653c18c 154 void RovComms::ResetValues()
inky 0:4a75d653c18c 155 {
inky 0:4a75d653c18c 156 iRovSpeed = 0;
inky 0:4a75d653c18c 157 iRovTurn = 0;
inky 0:4a75d653c18c 158 iRovVert = 0;
inky 0:4a75d653c18c 159
inky 0:4a75d653c18c 160 iLight = 0;
inky 0:4a75d653c18c 161 iWaterSol = 0;
inky 0:4a75d653c18c 162 iAirSol = 0;
inky 0:4a75d653c18c 163 iCamera = 0;
inky 0:4a75d653c18c 164 iPressure = 0;
inky 0:4a75d653c18c 165 iCompass = 0;
inky 0:4a75d653c18c 166 iAccelX = 0;
inky 0:4a75d653c18c 167 iAccelY = 0;
inky 0:4a75d653c18c 168 iAccelZ = 0;
inky 0:4a75d653c18c 169 }
inky 0:4a75d653c18c 170
inky 0:4a75d653c18c 171 void RovComms::RovPropulsion(int speed, int turn, int vert)
inky 0:4a75d653c18c 172 {
inky 0:4a75d653c18c 173 iRovSpeed = 0;
inky 0:4a75d653c18c 174 iRovTurn = 0;
inky 0:4a75d653c18c 175 iRovVert = 0;
inky 0:4a75d653c18c 176 Transmit(CMD_ROV);
inky 0:4a75d653c18c 177 }
inky 0:4a75d653c18c 178
inky 0:4a75d653c18c 179 void RovComms::FrontLights(int state)
inky 0:4a75d653c18c 180 {
inky 0:4a75d653c18c 181 if (state == 1)
inky 0:4a75d653c18c 182 iLight |= AUX_FN_LIGHT1_ON;
inky 0:4a75d653c18c 183 else
inky 0:4a75d653c18c 184 iLight &= ~AUX_FN_LIGHT1_ON;
inky 0:4a75d653c18c 185 Transmit(CMD_AUX);
inky 0:4a75d653c18c 186 }
inky 0:4a75d653c18c 187
inky 0:4a75d653c18c 188 void RovComms::RearLights(int state)
inky 0:4a75d653c18c 189 {
inky 0:4a75d653c18c 190 if (state == 1)
inky 0:4a75d653c18c 191 iLight |= AUX_FN_LIGHT2_ON;
inky 0:4a75d653c18c 192 else
inky 0:4a75d653c18c 193 iLight &= ~AUX_FN_LIGHT2_ON;
inky 0:4a75d653c18c 194 Transmit(CMD_AUX);
inky 0:4a75d653c18c 195 }
inky 0:4a75d653c18c 196
inky 0:4a75d653c18c 197 void RovComms::Camera(int cam)
inky 0:4a75d653c18c 198 {
inky 0:4a75d653c18c 199 if (cam == 1)
inky 0:4a75d653c18c 200 iCamera = AUX_FN_CAM1_ON;
inky 0:4a75d653c18c 201 else
inky 0:4a75d653c18c 202 iCamera = AUX_FN_CAM2_ON;
inky 0:4a75d653c18c 203 Transmit(CMD_AUX);
inky 0:4a75d653c18c 204 }
inky 0:4a75d653c18c 205
inky 0:4a75d653c18c 206 void RovComms::Debug(const char *format, ...)
inky 0:4a75d653c18c 207 {
inky 0:4a75d653c18c 208 // send data to the debug device
inky 0:4a75d653c18c 209 }
inky 0:4a75d653c18c 210
inky 0:4a75d653c18c 211 // end of file