aboutsummaryrefslogtreecommitdiff
path: root/src/src.ino
blob: c6f9566ba98647e3fe465235a4d766ebf966594e (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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include <Adafruit_FONA.h>
#include <Adafruit_GPS.h>
#include <SoftwareSerial.h>

// Pin for actiaving LifeLarm
#define activateLarm 5

// Pins on PCB that connect to Sim
#define FONA_RX  9
#define FONA_TX  8
#define FONA_RST 4
#define FONA_RI  7

// this is a large buffer for replies
char replybuffer[255];

// Phone number we send emergency text to
char callerIDbuffer[32];

// Slot in which the phone number is stored
int slot = 0;

SoftwareSerial fonaSS = SoftwareSerial(FONA_TX, FONA_RX);
SoftwareSerial *fonaSerial = &fonaSS;

Adafruit_FONA fona = Adafruit_FONA(FONA_RST);

uint8_t readline(char *buff, uint8_t maxbuff, uint16_t timeout = 0);

void setup()
{
	while (!Serial) ;

	Serial.begin(115200);
	Serial.println(F("LifeLarm turning on!"));
	Serial.println(F("Initializing....(May take 3 seconds)"));

	// make it slow so its easy to read!
	fonaSerial->begin(4800);
	if (!fona.begin(*fonaSerial)) {
		Serial.println(F("Couldn't find FONA"));
		while (1) ;
	}
	// Set button to active low
	pinMode(activateLarm, INPUT_PULLUP);
	attachInterrupt(digitalPinToInterrupt(activateLarm), sendHelp, CHANGE);

	Serial.println("LifeLarm Ready");

	// Loop trough slots untill we find the number

	for (int k = 0; k < 10; k++) {
		if (!fona.getSMSSender(slot, callerIDbuffer, 31)) {
			Serial.print(F("Found number in slot:"));
			Serial.println(slot);
			Serial.print(F("Emergency number set to: "));
			Serial.println(callerIDbuffer);
			k = 99;	// exit for loop by going out of bounds
		} else {
			Serial.print(F
				     ("Could not find emergency number in slot:"));
			Serial.println(slot);
		}
	}

}

char fonaInBuffer[64];		//for notifications from the FONA

void loop()
{

	char *bufPtr = fonaInBuffer;	//handy buffer pointer

	if (fona.available())	//any data available from the FONA?
	{
		int charCount = 0;
		int newSlot = 0;

		//Read the notification into fonaInBuffer
		do {
			*bufPtr = fona.read();
			Serial.write(*bufPtr);
			delay(1);
		} while ((*bufPtr++ != '\n') && (fona.available())
			 && (++charCount < (sizeof(fonaInBuffer) - 1)));

		//Add a terminal NULL to the notification string
		*bufPtr = 0;

		//  Scan the notification string for an SMS received notification.
		//  If it's an SMS message, we'll get the slot number in 'slot'
		if (1 == sscanf(fonaInBuffer, "+CMTI: \"SM\",%d", &newSlot)) {
			Serial.print("New slot: ");
			Serial.println(slot);

			// Retrieve SMS sender address/phone number.
			if (!fona.getSMSSender(newSlot, callerIDbuffer, 31)) {
				Serial.println
				    ("Didn't find SMS message in slot!");
			}
			Serial.print(F("Retreived number: "));
			Serial.println(callerIDbuffer);
			Serial.print(F("Stored in slot: "));
			Serial.println(newSlot);

			//Send back an automatic response
			Serial.println("Sending confirmation...");
			if (!fona.sendSMS(callerIDbuffer,
					  "Your phone number has been set as the emergency number!"))
			{
				Serial.println(F("Failed to send!"));
			} else {
				Serial.println(F("Sent!"));
			}

			//  delete the previous slot
			//   otherwise, we will fill up all the slots
			//   and then we won't be able to receive SMS anymore
			if (fona.deleteSMS(slot)) {
				Serial.println(F("OK!"));
			} else {
				Serial.println(F("Couldn't delete"));
			}
			// set current slot to new message
			slot = newSlot;
		}
	}
}

void sendHelp()
{
	Serial.println("Sending text...");
	if (!fona.sendSMS(callerIDbuffer,
			  "HELP! ... --- ... I will be sending my location to you!"))
	{
		Serial.println(F("Failed to send!"));
	} else {
		Serial.println(F("Sent!"));
	}
}