aboutsummaryrefslogtreecommitdiff
path: root/GEOLOC/app/anchor/app.c
blob: 4ff2c6e6d81193838f20c76fb9ee1981640919be (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <stdio.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <sys/types.h>
#include <string.h>
#include "app.h"
#include "../frame.h"
#include <pthread.h>
#include "../../lib/gps.h"
#include "socket/com.h"
#include "records.h"

//extern struct NMEA_GGA NmeaGgaFrame;
pthread_mutex_t mutex_NmeaGgaFrame; // Mutex for thread that use MASTER_IP

void runApp(Config config){
	// Hello msg
	printf("\n|Starting gateway application|\n\n");

	// Start GW communication
	startGWCom();

	// Ensure we are in standby mode and apply configuration
	config.mode=MODE_STDBY;
	applyMode(config);
	applyConfig(config);

	config.mode=MODE_RX;
	applyMode(config);

	pthread_t frameHandlerThread;

	printf("Wait for packet...\n");                                                                                                         
	while(1){                                                                                                                                 
		if(digitalRead(0x7)==1){                                                                                                          
			// Build parameters
			Frame frame=pullFrame();
			int rssi=fetchRSSI();
			void *param;
			param=malloc(sizeof(Frame)+sizeof(int));
			*((Frame *)param)=frame;
			*((int *)(param+sizeof(Frame)))=rssi;
			// Run thread
			pthread_create(&frameHandlerThread, NULL, handleMessage, param);
			config.mode=MODE_STDBY;                                                                                                   
			applyMode(config);                                                                                                        
			config.mode=MODE_RX;
			applyMode(config);
		}                                                                                                                                 
	} 
	pthread_join(frameHandlerThread,NULL);

}

void *handleMessage(void *args){
	// Fetch parameters
	Frame frame=*((Frame *)args);
	int rssi=*((int *)(args+sizeof(Frame)));

	// Print informations
	printf("Packet receive !!!\n\n");                                                                                         
	printf("Frame info :\nId : %d\nStamp : %d\nData 1-6 : %d %d %d %d %d %d\nRSSI : %d\n\n",
			frame.id, frame.stamp,
			frame.data[0],frame.data[1],frame.data[2],frame.data[3],frame.data[4],frame.data[5],
			rssi);

	GWFrame masterFrame;
	masterFrame.slaveID=ANCHOR_ID;

	pthread_mutex_lock(& mutex_NmeaGgaFrame);
	masterFrame.ggaFrame=getNMEA_GGAFrame();
	pthread_mutex_unlock(& mutex_NmeaGgaFrame);

	masterFrame.frame=frame;
	masterFrame.rssi=rssi;

	if(!IS_MASTER){
		sendDataToMaster(masterFrame);
	}
	else{
		saveFrame(masterFrame);
	}
}