embedded_systems
Loading...
Searching...
No Matches
TCP_HA.c
Go to the documentation of this file.
1
7//Library Include
8#include <stdio.h>
9#include <string.h>
10
11//User Include
12#include "tcp.h"
13#include "main.h"
14#include "lwip.h"
15#include "TCP_HA.h"
16#include "display.h"
17
18
19
20/*static err_t errHaRecieve(void *, struct tcp_pcb ,struct pbuf, err_t);
21static err_t errHaConnected (void *, struct tcp_pcb *, err_t );*/
22
23
24//File scope variabele
25
34typedef struct {
42 char entity[30];
43
51 char action[10];
52
59 uint16_t usButton;
60
62
67extern uint8_t globalReceive;
68
72extern struct netif gnetif;
73
74//Onder de typedef staan anders probelemen met compiler dat type niet bestaat
75//Static function prototype
78static void prvHaErrorHandelingRebootSystem(void);
79static void prvHaErrorHandelingRoutingError(void);
80
81
98err_t errHaRecieve(void *arg, struct tcp_pcb *tpcb,struct pbuf *p, err_t err){
99
100 PCB_HA_argument *PCB_argument = tpcb->callback_arg;
101 static uint8_t cReadNextFrame = 0;
103 //er is data beschikbaar
104 if(err == ERR_OK && p!=NULL){
105
106 //Print de pbuf
107 printf("Number of pbufs %d\n", pbuf_clen(p));
108 printf("Contents of pbuf %.*s\n",p->len,(char *)p->payload);
109 printf("Length of pbuf %d\n", p->len);
110 //printf("total lent of pbuf %d\n", p->tot_len);
111
112 //vorige frame moet payload hebben \r\n\r\n en houdig frame heeft deze niet
113 if(strstr(p->payload,"\r\n\r\n") != NULL){
114 cReadNextFrame = 1;
115 }
116 else{
117 if(cReadNextFrame == 1){
118 cReadNextFrame = 0;
119 char state[10];
120 strcpy(state, (char*) p->payload); //lees de state in
121 printf("Payload: %s\n", state); //print de paylaad van de pbuf
122 vDisplayBgButtonState(PCB_argument->usButton,state); //verwerk de data(PCB_argument->usButton,state); //verwerk de data
123 }
124 }
125
126 //Ack de ontvangen data en geeft de pbuf terug vrij
127 tcp_recved(tpcb,p->len);
128 pbuf_free(p);
129 }
130
131 //connectie gesloten door server
132 if(err == ERR_OK && p == NULL){
133
134 printf("Connectie gesloten\n");
135 printf("/************************ End ****************************/\n");
136
137 globalReceive = 1;
138
139 cReadNextFrame = 0;
140 //verwijder de tpcb en de PCB_HA wegens dat de connectie is gesloten
141 prvHaFreePcbArgument(PCB_argument);
142 tcp_sent(tpcb, NULL);
143 tcp_recv(tpcb,NULL);
144 tcp_close(tpcb);
145 }
146
147 return ERR_OK;
148}
149
150
166err_t errHaConnected (void *arg, struct tcp_pcb *tpcb, err_t err){
167 printf("/************************ Begin ****************************/\n");
168 printf("Verbinden is gelukt\n"); //\n belangrijk !!!!
169 errHaSendPacket(tpcb);
170 return ERR_OK;
171}
172
173
174
189err_t errHaSendPacket(struct tcp_pcb *tpcb)
190{
191 PCB_HA_argument *pArguments = tpcb->callback_arg;
192 printf("args: %s\n",pArguments->action);
193
194 char url[200] = "GET /ha?entity=";
195 strcat(url,pArguments->entity);
196 if(strcmp(pArguments->action,"") != 0){
197 strcat(url,"&action=");
198 strcat(url,pArguments->action);
199 }
200 strcat(url," HTTP/1.0\r\nHost: 192.168.0.10:5000\r\n\r\n ");
201
202 printf("url: %s", url);
203
204 err_t error;
205 /* push to buffer */
206 error = tcp_write(tpcb, url, strlen(url), TCP_WRITE_FLAG_COPY);
207
208 // Error bij het schrijven naar de buffer
209 if (error) {
210 printf("ERROR: Code: %d (errHaSendPacket :: tcp_write)\n", error);
211 vHaErrorHandling(error); //Behandel de fout
212 return error;
213 }
214
215 /* now send */
216 error = tcp_output(tpcb);
217
218 //Error bij het verzenden?
219 if (error) {
220 printf("ERROR: Code: %d (errHaSendPacket :: tcp_output)\n", error);
221 vHaErrorHandling(error); //Behandel de fout
222 return error;
223 }
224
225 return ERR_OK;
226}
227
228
241void vHaError(void *arg, err_t err){
242 printf("TCP_ha :: vHaError callback function\n");
243 printf("%d",err);
244 vHaErrorHandling(err);
245}
246
247
260void vHaErrorHandling(err_t err){
261 printf("ERROR: Code: %d in function %pS\n",err,__builtin_return_address(0));
262 switch (err){
263 case ERR_MEM:
264 vDisplayError("Out of memory error.");
265 printf("Out of memory error");
267 break;
268 case ERR_BUF:
269 vDisplayError("Buffer error.");
270 printf("Buffer");
272 break;
273 case ERR_TIMEOUT:
274 vDisplayError("Timeout.");
275 printf("Timeout");
277 break;
278 case ERR_RTE:
279 vDisplayError("Routing problem.");
280 printf("Routing problem.");
281 HAL_Delay(2000); //message anders niet zichtbaar
283 break;
284 case ERR_INPROGRESS:
285 vDisplayError("Operation in progress.");
286 printf("Operation in progress.");
288 break;
289 case ERR_VAL:
290 vDisplayError("Illegal value.");
291 printf("Illegal value.");
293 break;
294 case ERR_CONN:
295 vDisplayError("Not connected.");
296 printf("Not connected.");
298 break;
299 default:
301 break;
302 }
303
304}
305
306
315 HAL_Delay(5000);
316 vDisplayError("Restart Pending");
317 printf("Restart Pending");
318 HAL_Delay(2000);
319 NVIC_SystemReset();
320}
321
322
335
336
347void vHaWaitOnLink(err_t err){
348
349 //wait on interface
350 printf("Waiting on interface\n");
351 while(!netif_is_up(&gnetif)){
352 MX_LWIP_Process();
353 if(err == ERR_OK){
354 vDisplayMessage("Waiting on interface");
355 }
356 else{
357 vDisplayError("Waiting on interface");
358 }
359 }
360
361 //wait on link (deze werkt :) ), gaat wachten op connectie
362 printf("Waiting on link\n");
363 while(!netif_is_link_up(&gnetif)){
364 MX_LWIP_Process();
365 if(err == ERR_OK){
366 vDisplayMessage("Waiting on link");
367 }
368 else{
369 vDisplayError("Waiting on link");
370 }
371
372 }
373}
374
375
389err_t errHaSend(char entity[], char action[], uint16_t usButton){
390 struct tcp_pcb *pConnectie;
391
392 PCB_HA_argument *PCB_argument;
393
394 //PCB_argument maken
395 PCB_argument = prvHaMakePcbArgument();
396
397 //PCB_argument is niet aangemaakt
398 if(PCB_argument == NULL){
399 vHaErrorHandling(ERR_MEM);
400 return ERR_MEM;
401 }
402 else{
403 //Niet direct nodig, ga door met rest van programma
404 }
405
406 //Schrijf de data in de PCB_argument struct
407 strcpy(PCB_argument->entity,entity);
408 strcpy(PCB_argument->action,action );
409 PCB_argument->usButton = usButton;
410
411 //Maak een nieuwe tcp_pcb
412 pConnectie = tcp_new();
413
414 //Geef de PCB_argument mee aan de pcb
415 tcp_arg(pConnectie, PCB_argument);
416
417 //stel het IP van de server in
418 ip_addr_t serverIP;
419 IP_ADDR4(&serverIP,192,168,0,10);
420
421 // Error callback
422 err_t error;
423 tcp_err(pConnectie,vHaError);
424
425 //Maak een nieuwe TCP connectie
426 error = tcp_connect(pConnectie,&serverIP, 5000, errHaConnected);
427 if(error){
428 printf("ERROR: Code %d (errHaSend :: tcp_connect)\n",error);
429 vHaErrorHandling(error);
430 return error;
431 }
432
433 //Callback functie instellen voor recieve
434 tcp_recv(pConnectie,errHaRecieve);
435
436 return ERR_OK;
437}
438
439
454 return (PCB_HA_argument *) malloc(sizeof(PCB_HA_argument));
455}
456
457
467static void prvHaFreePcbArgument(PCB_HA_argument * pcb_argument){
468 free(pcb_argument);
469}
err_t errHaSendPacket(struct tcp_pcb *tpcb)
errHaSendPacket Verstuurd een TCP pakket naar de server.
Definition TCP_HA.c:189
static void prvHaFreePcbArgument(PCB_HA_argument *)
Geef memory vrij PCB_HA_argument.
Definition TCP_HA.c:467
void vHaError(void *arg, err_t err)
error callback functie van de LwIP_stack
Definition TCP_HA.c:241
err_t errHaConnected(void *arg, struct tcp_pcb *tpcb, err_t err)
errHaConnected functie (callback van de LwIP_stack)
Definition TCP_HA.c:166
err_t errHaRecieve(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
errHaRecieve functie TCP.
Definition TCP_HA.c:98
err_t errHaSend(char entity[], char action[], uint16_t usButton)
Stuur boodschap naar server.
Definition TCP_HA.c:389
void vHaWaitOnLink(err_t err)
Wacht op link.
Definition TCP_HA.c:347
void vHaErrorHandling(err_t err)
Error handling van de TCP errors.
Definition TCP_HA.c:260
uint8_t globalReceive
Globale variabele voor communicatie tussen twee aparte functies.
Definition main.c:67
static void prvHaErrorHandelingRebootSystem(void)
Reset MCU.
Definition TCP_HA.c:314
struct netif gnetif
static PCB_HA_argument * prvHaMakePcbArgument(void)
Alloceert memory voor PCB_HA_argument.
Definition TCP_HA.c:453
static void prvHaErrorHandelingRoutingError(void)
Error handling van de Routing error.
Definition TCP_HA.c:330
void vDisplayError(char message[])
Display error op het scherm.
Definition display.c:176
void vDisplaySetUpButtonStates(void)
Vraagt de status op van iedere knop.
Definition display.c:203
void vDisplayMessage(char message[])
Display message op het scherm.
Definition display.c:162
void vDisplayBgButtonState(uint8_t usButtonId, char cState[])
Verandert de achtergrond van de knop op basis van de status.
Definition display.c:291
void vDisplayMainScreen(void)
Display het hoofd scherm met de UI.
Definition display.c:147
Bevat informatie over de entity.
Definition TCP_HA.c:34
char action[10]
action
Definition TCP_HA.c:51
char entity[30]
entity naam.
Definition TCP_HA.c:42
uint16_t usButton
usButton
Definition TCP_HA.c:59