Skip to content

Commit b5e1ec9

Browse files
Rocketctfacchinm
authored andcommitted
CMUX library
1 parent b83af6a commit b5e1ec9

File tree

13 files changed

+1768
-149
lines changed

13 files changed

+1768
-149
lines changed

cores/arduino/mbed/connectivity/drivers/cellular/GEMALTO/CINTERION/GEMALTO_CINTERION_CellularStack.h

+10
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,16 @@ class GEMALTO_CINTERION_CellularStack : public AT_CellularStack {
3434
*/
3535
nsapi_error_t socket_stack_init();
3636

37+
void lock();
38+
void unlock();
39+
void beginGNSS(mbed::Callback<void(char*)> gnss_cb);
40+
void enableCmux();
41+
void endGNSS();
42+
int startGNSS();
43+
void stopGNSS();
44+
void PSMEnable();
45+
void PSMDisable();
46+
3747
protected:
3848

3949
virtual nsapi_error_t socket_close_impl(int sock_id);

libraries/GPS/library.properties

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
name=GSM
2+
version=1.0
3+
author=Arduino
4+
maintainer=Arduino <info@arduino.cc>
5+
sentence=GSM wrapper
6+
paragraph=
7+
category=Other
8+
url=http://www.arduino.cc/en/Reference/GSM
9+
architectures=mbed,ArduinoCore-mbed,mbed_portenta

libraries/GPS/src/GPS.cpp

+209
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,209 @@
1+
#include "GPS.h"
2+
3+
#include "mbed.h"
4+
5+
arduino::GPSClass::GPSClass()
6+
{
7+
}
8+
9+
arduino::GPSClass::~GPSClass()
10+
{
11+
}
12+
13+
void arduino::GPSClass::begin(unsigned long baudrate, uint16_t config)
14+
{
15+
auto cmux = arduino::CMUXClass::get_default_instance();
16+
17+
auto serial = cmux->get_serial(1);
18+
_serial = (arduino::PTYSerial *)serial;
19+
nextSerialPort++;
20+
21+
_serial->write("ATE0\r\n", sizeof("ATE0\r\n"));
22+
readAndDrop();
23+
24+
// burn any incoming message on gps rx buffer
25+
readAndDrop();
26+
27+
do
28+
{
29+
_serial->write("AT^SPIO=0\r\n", sizeof("AT^SPIO=0\r\n"));
30+
readAndDrop();
31+
32+
_serial->write("AT^SPIO=1\r\n", sizeof("AT^SPIO=1\r\n"));
33+
readAndDrop();
34+
35+
_serial->write("AT^SCPIN=1,7,1,0\r\n", sizeof("AT^SCPIN=1,7,1,0\r\n"));
36+
readAndDrop();
37+
38+
_serial->write("AT^SSIO=7,1\r\n", sizeof("AT^SSIO=7,1\r\n"));
39+
readAndDrop();
40+
_serial->write("AT^SGIO=7\r\n", sizeof("AT^SGIO=7\r\n"));
41+
} while (!checkGNSSEngine("^SGIO: 1"));
42+
43+
_serial->write("AT^SGPSC=Engine/StartMode,0\r\n", sizeof("AT^SGPSC=Engine/StartMode,0\r\n"));
44+
checkGNSSEngine("^SGPSC: \"Engine/StartMode\",\"0\"");
45+
46+
while (!_engine)
47+
{
48+
_serial->write("AT^SGPSC=Engine,3\r\n", sizeof("AT^SGPSC=Engine,3\r\n"));
49+
_engine = checkGNSSEngine("^SGPSC: \"Engine\",\"3\"");
50+
}
51+
52+
_serial->write("AT^SGPSC=Nmea/Urc,on\r\n", sizeof("AT^SGPSC=Nmea/Urc,on\r\n"));
53+
readAndDrop();
54+
}
55+
56+
int arduino::GPSClass::available(void)
57+
{
58+
return _serial->available();
59+
}
60+
61+
void arduino::GPSClass::readAndPrint()
62+
{
63+
char buf[256];
64+
int dataRead = 0;
65+
while((dataRead = available()) <= 0);
66+
67+
String tmp = "";
68+
while((dataRead =_serial->read(buf, 1)) > 0){
69+
tmp += String(buf);
70+
}
71+
Serial.println(tmp);
72+
}
73+
74+
bool arduino::GPSClass::checkGNSSEngine(const char *prefix)
75+
{
76+
char buf[256];
77+
int dataRead = 0;
78+
while((dataRead = available()) <= 0);
79+
80+
String tmp = "";
81+
while((dataRead =_serial->read(buf, 1)) > 0){
82+
tmp += String(buf);
83+
}
84+
85+
int offset = 0;
86+
// check the buffer in serch of prefix
87+
while (sizeof(tmp) - offset > sizeof(prefix))
88+
{
89+
if (tmp.substring(offset).startsWith(String(prefix)))
90+
{
91+
// read all the remaining data if available
92+
_serial->read(buf, sizeof(buf));
93+
return true;
94+
}
95+
offset++;
96+
}
97+
return false;
98+
}
99+
100+
void arduino::GPSClass::readAndDrop()
101+
{
102+
char buf[256];
103+
int dataRead = 0;
104+
while((dataRead = available()) <= 0);
105+
106+
String tmp = "";
107+
while((dataRead =_serial->read(buf, 1)) > 0);
108+
}
109+
110+
void arduino::GPSClass::begin(unsigned long baudrate)
111+
{ // alligne with other begin
112+
auto cmux = arduino::CMUXClass::get_default_instance();
113+
114+
auto serial = cmux->get_serial(1);
115+
_serial = (arduino::PTYSerial *)serial;
116+
nextSerialPort++;
117+
118+
_serial->write("ATE0\r\n", sizeof("ATE0\r\n"));
119+
readAndDrop();
120+
121+
_serial->write("AT^SGPSC=Engine/StartMode,0\r\n", sizeof("AT^SGPSC=Engine/StartMode,0\r\n"));
122+
readAndDrop();
123+
124+
_serial->write("AT^SPIO=1\r\n", sizeof("AT^SPIO=1\r\n"));
125+
readAndDrop();
126+
127+
_serial->write("AT^SCPIN=1,7,1,0\r\n", sizeof("AT^SCPIN=1,7,1,0\r\n"));
128+
readAndDrop();
129+
130+
_serial->write("AT^SSIO=7,1\r\n", sizeof("AT^SSIO=7,1\r\n"));
131+
readAndDrop();
132+
133+
_serial->write("AT^SGPSC=Engine,3\r\n", sizeof("AT^SGPSC=Engine,3\r\n")); //
134+
checkGNSSEngine("^SGPSC: \"Engine\",\"3\"");
135+
_engine = true;
136+
137+
if (_engine)
138+
{
139+
_serial->write("AT^SGPSC=Nmea/Urc,on\r\n", sizeof("AT^SGPSC=Nmea/Urc,on\r\n"));
140+
readAndDrop();
141+
}
142+
}
143+
144+
int arduino::GPSClass::peek(void)
145+
{
146+
return read();
147+
}
148+
149+
int arduino::GPSClass::read(void)
150+
{
151+
char c;
152+
_serial->read(&c,1);
153+
return c;
154+
}
155+
156+
void arduino::GPSClass::flush(void)
157+
{
158+
}
159+
160+
size_t arduino::GPSClass::write(char *buffer)
161+
{
162+
size_t sz = sizeof(buffer);
163+
return _serial->write(buffer, sz);
164+
}
165+
166+
size_t arduino::GPSClass::write(char *buffer, size_t sz)
167+
{
168+
size_t data_write = 0;
169+
_serial->write(buffer, sz);
170+
return data_write;
171+
}
172+
173+
size_t arduino::GPSClass::write(uint8_t c)
174+
{
175+
return _serial->write((char *)&c, 1);
176+
}
177+
178+
void arduino::GPSClass::end()
179+
{
180+
181+
_serial->write("AT^SGPSC=Nmea/Urc,off\r\n", sizeof("AT^SGPSC=Nmea/Urc,off\r\n"));
182+
readAndDrop();
183+
184+
while (_engine)
185+
{
186+
_serial->write("AT^SGPSC=Engine,0\r\n", sizeof("AT^SGPSC=Engine,0\r\n"));
187+
_engine = !checkGNSSEngine("^SGPSC: \"Engine\",\"0\"");
188+
}
189+
190+
_serial->write("^SSIO=7,0\r\n", sizeof("^SSIO=7,0\r\n"));
191+
readAndDrop(); // sgio in modo da verificare l effettivo spegnimento
192+
}
193+
194+
arduino::GPSClass::operator bool()
195+
{
196+
_serial->write("AT^SGPSC?\r\n", sizeof("AT^SGPSC?\r\n"));
197+
return checkGNSSEngine("\"Engine\",\"3\"");
198+
}
199+
200+
static Stream *trace_stream = nullptr;
201+
static void arduino_print(const char *c)
202+
{
203+
if (trace_stream)
204+
{
205+
trace_stream->println(c);
206+
}
207+
}
208+
209+
arduino::GPSClass GPS;

libraries/GPS/src/GPS.h

+64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/*
2+
GSM.h - Library for GSM on mbed platforms.
3+
Copyright (c) 2011-2021 Arduino LLC. All right reserved.
4+
This library is free software; you can redistribute it and/or
5+
modify it under the terms of the GNU Lesser General Public
6+
License as published by the Free Software Foundation; either
7+
version 2.1 of the License, or (at your option) any later version.
8+
This library is distributed in the hope that it will be useful,
9+
but WITHOUT ANY WARRANTY; without even the implied warranty of
10+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11+
Lesser General Public License for more details.
12+
You should have received a copy of the GNU Lesser General Public
13+
License along with this library; if not, write to the Free Software
14+
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
15+
*/
16+
17+
#ifndef GPS_h
18+
#define GPS_h
19+
20+
#include "api/HardwareSerial.h"
21+
#include "Arduino.h"
22+
#include "CMUXClass.h"
23+
#include "PTYSerial.h"
24+
#include "GSM.h"
25+
26+
namespace arduino {
27+
28+
typedef void* (*voidPrtFuncPtr)(void);
29+
30+
class GPSClass : public HardwareSerial {
31+
public:
32+
33+
GPSClass();
34+
~GPSClass();
35+
36+
void begin(unsigned long baudrate);
37+
void begin(unsigned long baudrate = 115200UL, uint16_t config = 0);
38+
void end(void);
39+
int available(void);
40+
int peek(void);
41+
int read(void);
42+
void flush(void);
43+
size_t write(uint8_t);
44+
size_t write(char * buffer);
45+
size_t write(char * buffer, size_t sz);
46+
operator bool();
47+
48+
protected:
49+
bool checkGNSSEngine(const char * prefix);
50+
void readAndPrint();
51+
void readAndDrop();
52+
53+
mbed::CircularBuffer<char, 1500U> * _rxbuf;
54+
events::EventQueue _queue;
55+
private:
56+
PTYSerial * _serial;
57+
bool _engine = false;
58+
};
59+
60+
}
61+
62+
extern GPSClass GPS;
63+
64+
#endif
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#include <GPS.h>
12
#include <GSM.h>
23

34
REDIRECT_STDOUT_TO(Serial);
@@ -8,27 +9,24 @@ char apn[] = SECRET_APN;
89
char username[] = SECRET_USERNAME;
910
char pass[] = SECRET_PASSWORD;
1011

11-
void mycallback(char * output);
12-
1312
void setup() {
1413
Serial.begin(115200);
1514
while (!Serial) {}
1615
//GSM.debug(Serial);
1716
Serial.println("\nStarting connection to server...");
1817
GSM.begin(pin, apn, username, pass, CATNB);
19-
Serial.println("\nStarting connection ...");
20-
2118
Serial.println("\nEnable GNSS Engine...");
22-
GSM.beginGNSS(mycallback);
23-
GSM.startGNSS();
19+
// GPS.begin() start and eanble the GNSS engine
20+
GPS.begin();
21+
Serial.println("\nGNSS Engine enabled...");
2422
}
2523

2624
void loop() {
27-
// GSM.startGNSS();
28-
// delay(10000);
29-
// GSM.stopGNSS();
30-
}
31-
void mycallback(char * output)
32-
{
33-
Serial.println(output);
34-
}
25+
//GPS.begin();
26+
if(GPS.available()){
27+
Serial.print((char) GPS.read());
28+
delay(1);
29+
}
30+
// GPS.end() stop and disable the GNSS engine
31+
// GPS.end();
32+
}

0 commit comments

Comments
 (0)