aboutsummaryrefslogtreecommitdiff
path: root/libraries/GSM/GSM3SoftSerial.h
blob: c35ef6848942252a76dbc38f7dc8ef453bdc149f (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
/*
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_SOFTSERIAL__
#define __GSM3_SOFTSERIAL__

// An adaptation of NewSoftSerial for Modem Shields
// Assumes directly that Serial is attached to Pins 2 and 3, not inverse
// We are implementing it because NewSoftSerial does not deal correctly with floods
// of data
#include "GSM3CircularBuffer.h"
#include <avr/pgmspace.h>

/*
#define _COMSTATUS_ANSWERRECEIVED_ 0x100
#define _COMSTATUS_SMSRECEIVED_ 0x80
#define _COMSTATUS_CALLRECEIVED_ 0x40

// PLEASE, when accessing the sockets use "for" and >> (bitwise operator)
#define _COMSTATUS_SOCKET6RECEIVED_ 0x20
#define _COMSTATUS_SOCKET5RECEIVED_ 0x10
#define _COMSTATUS_SOCKET4RECEIVED_ 0x08
#define _COMSTATUS_SOCKET3RECEIVED_ 0x04
#define _COMSTATUS_SOCKET2RECEIVED_ 0x02
#define _COMSTATUS_SOCKET1RECEIVED_ 0x01

#define __CALLTABLEMASK__ 0x3
*/

class GSM3SoftSerialMgr
{
	public:
	
		/** Manages soft serial message
			@param from			Initial byte
			@param to			Final byte
		 */
		virtual void manageMsg(byte from, byte to);
};

// This class manages software serial communications
// Changing it so it doesn't know about modems or whatever

class GSM3SoftSerial : public GSM3CircularBufferManager
{
	private:
	
		uint8_t _receiveBitMask;
		volatile uint8_t *_receivePortRegister;
		uint8_t _transmitBitMask;
		volatile uint8_t *_transmitPortRegister;
	  
		static GSM3SoftSerial* _activeObject;
		GSM3SoftSerialMgr* mgr;
	  
		uint16_t _rx_delay_centering;
		uint16_t _rx_delay_intrabit;
		uint16_t _rx_delay_stopbit;
		uint16_t _tx_delay;
		uint8_t _flags;
	  
		/** Write in tx_pin
			@param pin_state		Pin state
		 */
		void tx_pin_write(uint8_t pin_state);
		
		/** Set transmission
		 */
		void setTX();
		
		/** Set receiver
		 */
		void setRX();
		
		/** Receive
		 */
		void recv();
		
		/** Read from rx_pin
			@return receive bit mask
		 */
		uint8_t rx_pin_read();
		
		void setComsReceived();
		
		/** Write a character in serial connection, final action after escaping
			@param c			Character
			@return	1 if succesful, 0 if transmission delay = 0
		 */
		virtual size_t finalWrite(uint8_t);

		/** Decide, attending to escapes, if the received character should we
		    kept, forgotten, or changed
			@param c			Character, may be changed
			@return	1 if shall be kept, 0 if forgotten
		 */
		bool keepThisChar(uint8_t* c);
		  
		// Checks the buffer for well-known events. 
		//bool recognizeUnsolicitedEvent(byte oldTail);
	  
	  public:
	  
		/** Tuned delay in microcontroller
			@param delay		Time to delay
		 */
		static /*inline */void tunedDelay(uint16_t delay);
		
		GSM3CircularBuffer cb; // Circular buffer
		
		/** Register serial manager
			@param manager		Serial manager
		 */
		inline void registerMgr(GSM3SoftSerialMgr* manager){mgr=manager;};
		
		/** If there is spaceAvailable in the buffer, lets send a XON
		 */
		void spaceAvailable();
		
		/** Write a character in serial connection
			@param c			Character
			@return	1 if succesful, 0 if transmission delay = 0
		 */
		virtual size_t write(uint8_t);
		
		/** Constructor */
		GSM3SoftSerial();
		
		/** Establish serial connection
			@param speed		Baudrate
			@return
		 */
		int begin(long speed);
		
		/** Manage interruptions
		 */
		static inline void handle_interrupt();
		
		/** Close serial connection
		 */
		void close();
};

#endif