embedded_systems
Loading...
Searching...
No Matches
TCP_HA.c File Reference

: TCP connectie naar Home Assistant More...

#include <stdio.h>
#include <string.h>
#include "tcp.h"
#include "main.h"
#include "lwip.h"
#include "TCP_HA.h"
#include "display.h"

Go to the source code of this file.

Data Structures

struct  PCB_HA_argument
 Bevat informatie over de entity. More...
 

Functions

static PCB_HA_argumentprvHaMakePcbArgument ()
 Alloceert memory voor PCB_HA_argument.
 
static void prvHaFreePcbArgument (PCB_HA_argument *pcb_argument)
 Geef memory vrij PCB_HA_argument.
 
static void prvHaErrorHandelingRebootSystem (void)
 Reset MCU.
 
static void prvHaErrorHandelingRoutingError (void)
 Error handling van de Routing error.
 
err_t errHaRecieve (void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
 errHaRecieve functie TCP.
 
err_t errHaConnected (void *arg, struct tcp_pcb *tpcb, err_t err)
 errHaConnected functie (callback van de LwIP_stack)
 
err_t errHaSendPacket (struct tcp_pcb *tpcb)
 errHaSendPacket Verstuurd een TCP pakket naar de server.
 
void vHaError (void *arg, err_t err)
 error callback functie van de LwIP_stack
 
void vHaErrorHandling (err_t err)
 Error handling van de TCP errors.
 
void vHaWaitOnLink (err_t err)
 Wacht op link.
 
err_t errHaSend (char entity[], char action[], uint16_t usButton)
 Stuur boodschap naar server.
 

Variables

uint8_t globalReceive
 Globale variabele voor communicatie tussen twee aparte functies.
 
struct netif gnetif
 

Detailed Description

: TCP connectie naar Home Assistant

Definition in file TCP_HA.c.

Function Documentation

◆ errHaConnected()

err_t errHaConnected ( void * arg,
struct tcp_pcb * tpcb,
err_t err )

errHaConnected functie (callback van de LwIP_stack)

Callbackfunctie van de LwIp_stack, gaat intern de functie oproepen om een tcp packet te gaan verzenden

Parameters
*argAdditional argument to pass to the callback function
*tpcbThe connection pcb which received data
*pThe received data (or NULL when the connection has been closed!)
errerror code
Returns
ERR_OK

Definition at line 166 of file TCP_HA.c.

166 {
167 printf("/************************ Begin ****************************/\n");
168 printf("Verbinden is gelukt\n"); //\n belangrijk !!!!
169 errHaSendPacket(tpcb);
170 return ERR_OK;
171}
err_t errHaSendPacket(struct tcp_pcb *tpcb)
errHaSendPacket Verstuurd een TCP pakket naar de server.
Definition TCP_HA.c:189

References errHaSendPacket().

◆ errHaRecieve()

err_t errHaRecieve ( void * arg,
struct tcp_pcb * tpcb,
struct pbuf * p,
err_t err )

errHaRecieve functie TCP.

Ontvangt de data van de server,de data bevat de status van de gevraagde entity. De data wordt verwerkt op basis van de button dat in de PCB_argument staat. Is de ontvangen data bestemd voor button 1 dan wordt de kleur aangepast op basis van de ontvangen data

Parameters
*argAdditional argument to pass to the callback function
*tpcbThe connection pcb which received data
*pThe received data (or NULL when the connection has been closed!)
errerror code
Returns
err Stuurt ERR_OK als de functie is uitgevoerd

<

<

Definition at line 98 of file TCP_HA.c.

98 {
99
100 PCB_HA_argument *PCB_argument = tpcb->callback_arg;
101 static uint8_t cReadNextFrame = 0;
102
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}
static void prvHaFreePcbArgument(PCB_HA_argument *)
Geef memory vrij PCB_HA_argument.
Definition TCP_HA.c:467
uint8_t globalReceive
Globale variabele voor communicatie tussen twee aparte functies.
Definition main.c:67
void vDisplayBgButtonState(uint8_t usButtonId, char cState[])
Verandert de achtergrond van de knop op basis van de status.
Definition display.c:291
Bevat informatie over de entity.
Definition TCP_HA.c:34
uint16_t usButton
usButton
Definition TCP_HA.c:59

References globalReceive, prvHaFreePcbArgument(), PCB_HA_argument::usButton, and vDisplayBgButtonState().

◆ errHaSend()

err_t errHaSend ( char entity[],
char action[],
uint16_t usButton )

Stuur boodschap naar server.

Initaliseerd de tcp connectie en stelt de callback functies in

Parameters
entity[]de entity naam
action[]gevraagde actie voor de entity
usButtonbutton nummer
Returns
err Err code

Definition at line 389 of file TCP_HA.c.

389 {
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}
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
void vHaErrorHandling(err_t err)
Error handling van de TCP errors.
Definition TCP_HA.c:260
static PCB_HA_argument * prvHaMakePcbArgument(void)
Alloceert memory voor PCB_HA_argument.
Definition TCP_HA.c:453
char action[10]
action
Definition TCP_HA.c:51
char entity[30]
entity naam.
Definition TCP_HA.c:42

References PCB_HA_argument::action, PCB_HA_argument::entity, errHaConnected(), errHaRecieve(), prvHaMakePcbArgument(), PCB_HA_argument::usButton, vHaError(), and vHaErrorHandling().

◆ errHaSendPacket()

err_t errHaSendPacket ( struct tcp_pcb * tpcb)

errHaSendPacket Verstuurd een TCP pakket naar de server.

Verstuurd een TCP pakket naar de server met hierin het GET request. Het GET-request bevat de actie dat moet worden ondernomen samen met de gevraagde entity.

Parameters
*tpcbPCB
Returns
ERR_OK bij goede verzending and ERR_xx in functie van de error
Note
vb code voor de GET request gehaald van https://stackoverflow.com/questions/26192758/how-can-i-send-a-simple-http-request-with-a-lwip-stack

Definition at line 189 of file TCP_HA.c.

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}

References PCB_HA_argument::action, PCB_HA_argument::entity, and vHaErrorHandling().

◆ prvHaErrorHandelingRebootSystem()

static void prvHaErrorHandelingRebootSystem ( void )
static

Reset MCU.

Schrijft boodschap "restart pending" op het scherm idem op UART Reset de MCU

Definition at line 314 of file TCP_HA.c.

314 {
315 HAL_Delay(5000);
316 vDisplayError("Restart Pending");
317 printf("Restart Pending");
318 HAL_Delay(2000);
319 NVIC_SystemReset();
320}
void vDisplayError(char message[])
Display error op het scherm.
Definition display.c:176

References vDisplayError().

◆ prvHaErrorHandelingRoutingError()

static void prvHaErrorHandelingRoutingError ( void )
static

Error handling van de Routing error.

Gaat wachten op de link Bij terug aanwezigheid van de link wordt de button states opnieuw opgevraagd

Definition at line 330 of file TCP_HA.c.

330 {
331 vHaWaitOnLink(ERR_RTE);
334}
void vHaWaitOnLink(err_t err)
Wacht op link.
Definition TCP_HA.c:347
void vDisplaySetUpButtonStates(void)
Vraagt de status op van iedere knop.
Definition display.c:203
void vDisplayMainScreen(void)
Display het hoofd scherm met de UI.
Definition display.c:147

References vDisplayMainScreen(), vDisplaySetUpButtonStates(), and vHaWaitOnLink().

◆ prvHaFreePcbArgument()

static void prvHaFreePcbArgument ( PCB_HA_argument * pcb_argument)
static

Geef memory vrij PCB_HA_argument.

Geef memory vrij PCB_HA_argument

@argument PCB_HA_argument *

Definition at line 467 of file TCP_HA.c.

467 {
468 free(pcb_argument);
469}

◆ prvHaMakePcbArgument()

static PCB_HA_argument * prvHaMakePcbArgument ( void )
static

Alloceert memory voor PCB_HA_argument.

Alloceert memory voor het PCB_HA_argument

Returns
PCB_HA_argument *
Note
!!!!! Controleer op eventuel NULL pointer !!!!!
Kan een NULL pointer bevatten! Behandel dit op een correcte manier

Definition at line 453 of file TCP_HA.c.

453 {
454 return (PCB_HA_argument *) malloc(sizeof(PCB_HA_argument));
455}

◆ vHaError()

void vHaError ( void * arg,
err_t err )

error callback functie van de LwIP_stack

De error callback functie wordt opgroepen als het aanmaken van een tpcb niet lukt wegens te weinig geheugen

Parameters
*argAdditional argument to pass to the callback function
errerror code
Note
callback van error functie, wordt niet altijd gecalled??

Definition at line 241 of file TCP_HA.c.

241 {
242 printf("TCP_ha :: vHaError callback function\n");
243 printf("%d",err);
244 vHaErrorHandling(err);
245}

References vHaErrorHandling().

◆ vHaErrorHandling()

void vHaErrorHandling ( err_t err)

Error handling van de TCP errors.

Voor al de errors wordt de MCU gereset behalve bij de ERR_RTE, Bij de ERR_RTE wordt er gewacht op de link

Bij iedere error wordt er een UART message geprint samen met een gepaste boodschap op het scherm

Parameters
errError code

Definition at line 260 of file TCP_HA.c.

260 {
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}
static void prvHaErrorHandelingRebootSystem(void)
Reset MCU.
Definition TCP_HA.c:314
static void prvHaErrorHandelingRoutingError(void)
Error handling van de Routing error.
Definition TCP_HA.c:330

References prvHaErrorHandelingRebootSystem(), prvHaErrorHandelingRoutingError(), and vDisplayError().

◆ vHaWaitOnLink()

void vHaWaitOnLink ( err_t err)

Wacht op link.

Gaat wachten op de ethernet link

Parameters
errError code
Returns

Definition at line 347 of file TCP_HA.c.

347 {
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}
struct netif gnetif
void vDisplayMessage(char message[])
Display message op het scherm.
Definition display.c:162

References gnetif, vDisplayError(), and vDisplayMessage().

Variable Documentation

◆ globalReceive

uint8_t globalReceive
extern

Globale variabele voor communicatie tussen twee aparte functies.

Definition at line 67 of file main.c.

◆ gnetif

struct netif gnetif
extern