#include "stacktsk.h" #include "dhcp.h" #include "tick.h" #include "delay.h" #include "udp.h" #include "arp.h" #include "arptsk.h" #include "tcp.h" #include "network.h" /***************************** GLOBAL vars ****************************/ NODE_INFO rnode; NetworkState state; TCP_SOCKET tsock1; unsigned long global_network_amount; unsigned char global_network_char[16]; unsigned char global_network_charlen; /***************************** network funktions ****************************/ void network_init(void) { state = off; } void network_worker(void) { TickGet(); StackTask(); } void network_parse_amount(unsigned char buf[]) { global_network_amount = buf[0]<<24 + buf[1]<<16 + buf[2]<<8 + buf[3]; } void network_read_amount(void) { unsigned char buf[4]; TCPGetArray(tsock1, buf,4); network_parse_amount(buf); } void network_wait(unsigned char n) { int i; for (i=0; i>24); TCPPut(tsock1, amount>>16); TCPPut(tsock1, amount>>8); TCPPut(tsock1, amount); TCPFlush(tsock1); state = ChangeRequested; break; } network_worker(); } while (state != ChangeRequestedDone) { if (TCPIsGetReady(tsock1)) { TCPGet(tsock1, &ack); if (ack == 0) { TCPFlush(tsock1); state = TcpReadyToSend; return 4; } network_read_amount(); TCPFlush(tsock1); state = ChangeRequestedDone; } network_worker(); } state = TcpReadyToSend; return 0; } //request 4+5 char network_send_cancel_generic(char id) { while(state != CancelDone) { switch (state) { case TcpReadyToSend: if ( TCPIsConnected(tsock1) && TCPIsPutReady(tsock1) ) state = TcpSend; break; case TcpSend: TCPPut(tsock1, id); TCPFlush(tsock1); state = CancelDone; } network_worker(); } return network_read_ack(); } //Request ID 4 char network_send_cancel_last(void) { return network_send_cancel_generic(0x04); } //Request ID 5 char network_send_cancel_all(void) { return network_send_cancel_generic(0x05); } //Request ID 6 char network_send_goodbye(void) { char ack; while( state != SockClosed) { switch (state) { case TcpReadyToSend: if ( TCPIsConnected(tsock1) && TCPIsPutReady(tsock1) ) state = TcpSend; break; case TcpSend: TCPPut( tsock1, 0x06 ); TCPFlush( tsock1 ); state = SockClosing; break; case SockClosing: ack = network_read_ack(); TCPDisconnect( tsock1 ); state = SockClosed; break; } network_worker(); } if( TCPIsConnected(tsock1)) return 3; // Didn't close the socket properly; else return ack; } void network_wait_for_dhcp() { while (!DHCPIsBound()) network_worker(); }