1 | void Server(void)
|
2 | {
|
3 |
|
4 | unsigned char v1,v2,v3,address,adcval;
|
5 | unsigned int j;
|
6 |
|
7 | WORD w, w2;
|
8 | BYTE i,AppBuffer[32];
|
9 | char DataBytes[2] ;
|
10 |
|
11 | BYTE Error_Command[16] = "Error Command!\r\n";
|
12 | BYTE Error_Command2[16] = "Error Mode\r\n";
|
13 | BYTE Info[15] = "TCP vers 0.1\r\n";
|
14 | WORD wMaxGet, wMaxPut, wCurrentChunk;
|
15 | static TCP_SOCKET MySocket;
|
16 | static enum _TCPServerState
|
17 | {
|
18 | SM_HOME = 0,
|
19 | SM_LISTENING,
|
20 | } TCPServerState = SM_HOME;
|
21 |
|
22 | switch(TCPServerState)
|
23 | {
|
24 | case SM_HOME:
|
25 | // Allocate a socket for this server to listen and accept connections on
|
26 | MySocket = TCPOpen(0, TCP_OPEN_SERVER, SERVER_PORT, TCP_PURPOSE_GENERIC_TCP_SERVER);
|
27 | if(MySocket == INVALID_SOCKET)
|
28 | return;
|
29 |
|
30 | TCPServerState = SM_LISTENING;
|
31 | break;
|
32 |
|
33 | case SM_LISTENING:
|
34 | // See if anyone is connected to us
|
35 | if(!TCPIsConnected(MySocket))
|
36 | return;
|
37 |
|
38 |
|
39 | // Figure out how many bytes have been received and how many we can transmit.
|
40 | wMaxGet = TCPIsGetReady(MySocket); // Get TCP RX FIFO byte count
|
41 | wMaxPut = TCPIsPutReady(MySocket); // Get TCP TX FIFO free space
|
42 |
|
43 | // Make sure we don't take more bytes out of the RX FIFO than we can put into the TX FIFO
|
44 | if(wMaxPut < wMaxGet)
|
45 | wMaxGet = wMaxPut;
|
46 |
|
47 | // Process all bytes that we can
|
48 | // This is implemented as a loop, processing up to sizeof(AppBuffer) bytes at a time.
|
49 | // This limits memory usage while maximizing performance. Single byte Gets and Puts are a lot slower than multibyte GetArrays and PutArrays.
|
50 | wCurrentChunk = sizeof(AppBuffer);
|
51 |
|
52 |
|
53 |
|
54 | for(w = 0; w < wMaxGet; w += sizeof(AppBuffer))
|
55 | {
|
56 | // Make sure the last chunk, which will likely be smaller than sizeof(AppBuffer), is treated correctly.
|
57 | if(w + sizeof(AppBuffer) > wMaxGet)
|
58 | wCurrentChunk = wMaxGet - w;
|
59 |
|
60 | // Transfer the data out of the TCP RX FIFO and into our local processing buffer.
|
61 | TCPGetArray(MySocket, AppBuffer, wCurrentChunk);
|
62 |
|
63 | for(w2 = 0; w2 < wCurrentChunk; w2++)
|
64 | {
|
65 | i = AppBuffer[w2];
|
66 | if(i >= 'a' && i <= 'z')
|
67 | {
|
68 | i -= ('a' - 'A');
|
69 | AppBuffer[w2] = i;
|
70 | }
|
71 | }
|
72 |
|
73 | if (AppBuffer[0]=='S'){
|
74 | // 0 1 2 3 4 5 6 7 8 9
|
75 | // [S] [D] [A|B|C|D] 0 X [0..9|A..F] [0..9|A..F] [0..9|A..F][1|2|3|e][P] --> SDA0XFFF1P
|
76 | //
|
77 | // 0 1 2 3 4 5 6 7 8 9
|
78 | // [S] [E] [A|B|C|D] 0 X [0..9|A..F] [0..9|A..F] [0..9|A..F][1|2|3|e][P] --> SDA0XFFF2P
|
79 | //
|
80 |
|
81 | switch(AppBuffer[1]) {
|
82 | case 'D':
|
83 | switch(AppBuffer[2]){
|
84 | case 'A': address = 0xc0; break;
|
85 | case 'B': address = 0xc2; break;
|
86 | case 'C': address = 0xc4; break;
|
87 | case 'D': address = 0xc6; break;
|
88 | }
|
89 | // Convert Value from Ascii to HEX
|
90 | v2 =getHex(AppBuffer[6],AppBuffer[7]);
|
91 | v1 =getHex('0',AppBuffer[5]);
|
92 |
|
93 | if(AppBuffer[9]!='P'){
|
94 | v1=v1|((AppBuffer[8]-0x30)<<4);
|
95 | }
|
96 | //Start I2C2
|
97 | StartI2C2();
|
98 | IdleI2C2();
|
99 |
|
100 | while(I2C2CONbits.SEN );
|
101 |
|
102 | MasterWriteI2C2(address);
|
103 | IdleI2C2();
|
104 | while(I2C2STATbits.ACKSTAT);
|
105 | for(j=0;j<100;j++);
|
106 | IdleI2C2();
|
107 |
|
108 |
|
109 | MasterWriteI2C2(v1);
|
110 | while(I2C2STATbits.ACKSTAT);
|
111 | for(j=0;j<100;j++);
|
112 | IdleI2C2();
|
113 |
|
114 | MasterWriteI2C2(v2);
|
115 | for(j=0;j<100;j++);
|
116 | IdleI2C2();
|
117 |
|
118 |
|
119 | StopI2C2();
|
120 | break;
|
121 |
|
122 | case 'A':
|
123 |
|
124 | //ADC - MODE
|
125 | if (AppBuffer[2]>=0x30 && AppBuffer[2]<=0x37){
|
126 | ADC_VAL.sel = (AppBuffer[2] - 0x30);
|
127 | }else{
|
128 | break;
|
129 | }
|
130 | //Full-Scale
|
131 | if (AppBuffer[3]=='F'){
|
132 | ADC_VAL.rng = 1;
|
133 | }else{
|
134 | ADC_VAL.rng = 0;
|
135 | }
|
136 | //Bipolar Unipolar
|
137 | if (AppBuffer[3]=='B'||AppBuffer[4]=='B'){
|
138 | ADC_VAL.bip =1;
|
139 | }else{
|
140 | ADC_VAL.bip =0;
|
141 | }
|
142 | //POWER MODE, Standby, FullDown or Working
|
143 | if (AppBuffer[3]=='S'||AppBuffer[4]=='S'||AppBuffer[5]=='S'){
|
144 | ADC_VAL.pd1 =0;
|
145 | ADC_VAL.pd0 =1;
|
146 | }else if(AppBuffer[3]=='D'||AppBuffer[4]=='D'||AppBuffer[5]=='D'){
|
147 | ADC_VAL.pd1 =1;
|
148 | ADC_VAL.pd0 =1;
|
149 | }else{
|
150 | ADC_VAL.pd1 =0;
|
151 | ADC_VAL.pd0 =0;
|
152 | }
|
153 | ADC_VAL.start=1;
|
154 | adcval =ADC_VAL.byte;
|
155 | //WRITE
|
156 | StartI2C2();
|
157 | IdleI2C2();
|
158 |
|
159 | while(I2C2CONbits.SEN );
|
160 | MasterWriteI2C2(0x50);
|
161 | IdleI2C2();
|
162 |
|
163 | while(I2C2STATbits.ACKSTAT);
|
164 | for(j=0;j<100;j++);
|
165 | IdleI2C2();
|
166 |
|
167 | MasterWriteI2C2(adcval);
|
168 | while(I2C2STATbits.ACKSTAT);
|
169 | for(j=0;j<100;j++);
|
170 | IdleI2C2();
|
171 | StopI2C2();
|
172 |
|
173 | for(j=0;j<100;j++);
|
174 | IdleI2C2();
|
175 | StartI2C2();
|
176 |
|
177 | //READ
|
178 | MasterWriteI2C2(0x51);
|
179 | for(j=0;j<100;j++);
|
180 | while(I2C2STATbits.ACKSTAT);
|
181 |
|
182 | DataBytes[0] = MasterReadI2C2(); // Read first data byte
|
183 |
|
184 | AckI2C2();
|
185 | DataBytes[1] = MasterReadI2C2(); // Read secound data byte
|
186 |
|
187 |
|
188 | StopI2C2();
|
189 | break;
|
190 |
|
191 | case 'I': TCPPutArray(MySocket, Info, 15);break;
|
192 | default: TCPPutArray(MySocket, Error_Command2, 11);
|
193 | }// END SWITCH CASSE
|
194 |
|
195 | }else{
|
196 | AppBuffer[0]== 0x00;
|
197 | TCPPutArray(MySocket, Error_Command, 16);
|
198 | }
|
199 | }
|
200 |
|
201 |
|
202 |
|
203 | break;
|
204 | }
|
205 | }
|