aboutsummaryrefslogtreecommitdiff
path: root/libraries/GSM/GSM3ShieldV1ModemCore.h
blob: f9efce7286bdb8035fcf65e217002f6161ebf931 (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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
/*
This file is part of the GSM3 communications library for Arduino
-- Multi-transport communications platform
-- Fully asynchronous
-- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1
-- Voice calls
-- SMS
-- TCP/IP connections
-- HTTP basic clients

This library has been developed by Telef�nica Digital - PDI -
- Physical Internet Lab, as part as its collaboration with
Arduino and the Open Hardware Community. 

September-December 2012

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

The latest version of this library can always be found at
https://github.com/BlueVia/Official-Arduino
*/

#ifndef __GSM3_SHIELDV1MODEMCORE__
#define __GSM3_SHIELDV1MODEMCORE__

#include <GSM3SoftSerial.h>
#include <GSM3ShieldV1BaseProvider.h>
#include <GSM3MobileAccessProvider.h>
#include <Print.h>

#define UMPROVIDERS 3

class GSM3ShieldV1ModemCore : public GSM3SoftSerialMgr, public Print
{
	private:
		
		// Phone number, used when calling, sending SMS and reading calling numbers
		// Also PIN in modem configuration
		// Also APN
		// Also remote server
		char* phoneNumber;	
		
		// Working port. Port used in the ongoing command, while opening a server
		// Also for IP address length
		int port;

		// 0 = ongoing
		// 1 = OK
		// 2 = Error. Incorrect state
		// 3 = Unexpected modem message
		// 4 = OK but not available data. 
		uint8_t commandError;

		// Counts the steps by the command
		uint8_t commandCounter;
		
		// Presently ongoing command
		GSM3_commandType_e ongoingCommand;
		
		// Enable/disable debug
		bool _debug;
		byte _dataInBufferFrom;
		byte _dataInBufferTo;
		
		// This is the modem (known) status
		GSM3_NetworkStatus_t _status;
		
		GSM3ShieldV1BaseProvider* UMProvider[UMPROVIDERS];
		GSM3ShieldV1BaseProvider* activeProvider;
		
		// Private function for anage message
		void manageMsgNow(byte from, byte to);
		
		unsigned long milliseconds;

	public:
	
		/** Constructor */
		GSM3ShieldV1ModemCore();
		
		GSM3SoftSerial gss; // Direct access to modem
		
		/** Get phone number
			@return phone number
		 */
		char *getPhoneNumber(){return phoneNumber;};
		
		/** Establish a new phone number
			@param n			Phone number
		 */
		void setPhoneNumber(char *n){phoneNumber=n;};

		/** Get port used
			@return port
		 */
		int getPort(){return port;};
		
		/** Establish a new port for use
			@param p			Port
		 */
		void setPort(int p){port=p;};

		/** Get command error
			@return command error
		 */
		uint8_t getCommandError(){return commandError;};
		
		/** Establish a command error
			@param n			Command error
		 */
		void setCommandError(uint8_t n){commandError=n;};
		
		/** Get command counter
			@return command counter
		 */
		uint8_t getCommandCounter(){return commandCounter;};
		
		/** Set command counter
			@param c			Initial value
		 */
		void setCommandCounter(uint8_t c){commandCounter=c;};

		/** Get ongoing command
			@return command
		 */
		GSM3_commandType_e getOngoingCommand(){return ongoingCommand;};
		
		/** Set ongoing command
			@param c			 New ongoing command
		 */
		void setOngoingCommand(GSM3_commandType_e c){ongoingCommand=c;};
		
		/** Open command
			@param activeProvider	Active provider
			@param c				Command for open
		 */
		void openCommand(GSM3ShieldV1BaseProvider* activeProvider, GSM3_commandType_e c);
		
		/** Close command
			@param code			Close code
		 */
		void closeCommand(int code);

		// These functions allow writing to the SoftwareSerial
		// If debug is set, dump to the console
		
		/** Write a character in serial
			@param c			Character
			@return size
		 */
		size_t write(uint8_t c);
		
		/** Write PGM
			@param str			Buffer for write
			@param CR			Carriadge return adding automatically
			@return size
		 */
		virtual size_t writePGM(PROGMEM prog_char str[], bool CR=true);
		
		/** Establish debug mode
			@param db			Boolean that indicates debug on or off
		 */
		void setDebug(bool db){_debug=db;};
		
		/** Generic response parser
			@param rsp			Returns true if expected response exists
			@param string		Substring expected in response
			@param string2		Second substring expected in response
			@return true if parsed correctly
		 */		
		bool genericParse_rsp(bool& rsp, char* string=0, char* string2=0);
		
		/** Generates a generic AT command request from PROGMEM prog_char buffer
			@param str			Buffer with AT command
			@param addCR		Carriadge return adding automatically
		 */
		void genericCommand_rq(PROGMEM prog_char str[], bool addCR=true);

		/** Generates a generic AT command request from a simple char buffer
			@param str			Buffer with AT command
			@param addCR		Carriadge return adding automatically
		 */
		void genericCommand_rqc(const char* str, bool addCR=true);		
		
		/** Generates a generic AT command request from characters buffer
			@param str			Buffer with AT command
			@param addCR		Carriadge return adding automatically
		 */
		void genericCommand_rq(const char* str, bool addCR=true);		
		
		/** Returns the circular buffer
			@return circular buffer
		 */
		inline GSM3CircularBuffer& theBuffer(){return gss.cb;};

		/** Establish a new network status
			@param status		Network status
		 */
		inline void setStatus(GSM3_NetworkStatus_t status) { _status = status; };
		
		/** Returns actual network status
			@return network status
		 */
		inline GSM3_NetworkStatus_t getStatus() { return _status; };
		
		/** Register provider as willing to receive unsolicited messages
			@param provider	Pointer to provider able to receive unsolicited messages
		*/
		void registerUMProvider(GSM3ShieldV1BaseProvider* provider);		
	
		/** unegister provider as willing to receive unsolicited messages
			@param provider	Pointer to provider able to receive unsolicited messages
		*/
		void unRegisterUMProvider(GSM3ShieldV1BaseProvider* provider);		

		
		/** Register a provider as "dialoguing" talking in facto with the modem
			@param provider	Pointer to provider receiving responses
		*/
		void registerActiveProvider(GSM3ShieldV1BaseProvider* provider){activeProvider=provider;};
		
		/** Needed to manage the SoftSerial. Receives the call when received data
			If _debugging, no code is called
		@param from Starting byte to read
		@param to Last byte to read
		*/
		void manageMsg(byte from, byte to);
		
		/** If _debugging, this call is assumed to be made out of interrupts
			Prints incoming info and calls manageMsgNow
		*/
		void manageReceivedData();

		/** Chronometer. Measure milliseconds from last call
			@return milliseconds from las time function was called
		*/		
		unsigned long takeMilliseconds();
		
		/** Delay for interrupts
			@param milliseconds		Delay time in milliseconds
		 */
		void delayInsideInterrupt(unsigned long milliseconds);

};

extern GSM3ShieldV1ModemCore theGSM3ShieldV1ModemCore;

#endif