modem.ino (3439B) download
1#include "include/config.h"
2#include "include/modem.h"
3
4
5void sara_modem::init() {
6 pinMode(modemPowerPin, OUTPUT); // Put voltage on the nb-iot module
7 pinMode(modemVoltagePin, OUTPUT); // Switch module voltage
8 pinMode(modemEnablePin, OUTPUT); // Set state to active
9
10 digitalWrite(modemPowerPin, HIGH);
11 digitalWrite(modemVoltagePin, LOW);
12 digitalWrite(modemEnablePin, HIGH);
13 modemSerial.begin(modemBaud);
14
15 while (!modemSerial)
16 ;
17
18 // -*- module initialization -*-
19 // usbSerial.print(prefixInfo "waiting for module to start up");
20 for (;;) {
21 // usbSerial.print('.');
22 modemSerial.write("AT\r\n");
23 delay(1000);
24 if (modemSerial.available())
25 break;
26 }
27
28 while (modemSerial.available()) // clear cache
29 modemSerial.read();
30 // usbSerial.println();
31}
32
33sara_modem::command_status sara_modem::send(const char* request, char* response, command_flags flags) {
34 char line[lineBuffer];
35 size_t lineLen;
36 char buf;
37
38 bool silent = flags & COMMAND_SILENT,
39 block = flags & COMMAND_BLOCK,
40 ignore = flags & COMMAND_IGNORE,
41 event_handle = flags & COMMAND_EVENT;
42
43 if (response)
44 response[0] = '\0';
45
46 unsigned long start = millis(),
47 now;
48
49 modemSerial.write(request);
50 modemSerial.write("\r\n");
51 modemSerial.flush();
52
53 if (blockDebug && block && !silent) {
54 // usbSerial.print(prefixDebug "command '");
55 // usbSerial.print(request);
56 // usbSerial.println("' is blocking");
57 }
58
59 for (;;) {
60 lineLen = 0;
61 for (;;) {
62 while (!modemSerial.available()) {
63 now = millis();
64 if (ignore && now - start > ignoreDelay * 1000) {
65 if (commandDebug && !silent) {
66 // usbSerial.print(prefixDebug "command '");
67 // usbSerial.print(request);
68 // usbSerial.println("' succeed (ignoring response)");
69 }
70 return COMMAND_TIMEOUT;
71 } else if (!ignore && !block && now - start > commandTimeout * 1000) {
72 if (commandDebug && !silent) {
73 // usbSerial.print(prefixWarn "command '");
74 // usbSerial.print(request);
75 // usbSerial.println("' timed out");
76 }
77 return COMMAND_TIMEOUT;
78 }
79 }
80 buf = modemSerial.read();
81 if (buf == '\r')
82 continue;
83 if (buf == '\n')
84 break;
85 line[lineLen++] = buf;
86 }
87 line[lineLen] = '\0';
88
89 if (String(line) == "OK") {
90 if (commandDebug && !silent) {
91 // usbSerial.print(prefixDebug "command '");
92 // usbSerial.print(request);
93 // usbSerial.println("' succeed");
94 }
95 return COMMAND_OK;
96 } else if (strstr(line, "ERROR")) {
97 if (commandDebug && !silent) {
98 // usbSerial.print(prefixError "command '");
99 // usbSerial.print(request);
100 // usbSerial.println("' failed");
101 }
102 return COMMAND_ERROR;
103 } else if (event_handle && line[0] == '+') {
104 if (eventDebug && !silent) {
105 // usbSerial.print(prefixEvent "event '");
106 // usbSerial.print(line);
107 // usbSerial.println(" caused'");
108 }
109 } else if (line[0] != '\0' && strcmp(request, line)) {
110 if (lineDebug && !silent) {
111 // usbSerial.print(prefixLine);
112 // usbSerial.print(request);
113 // usbSerial.print(" -> '");
114 // usbSerial.print(line);
115 // usbSerial.println("'");
116 }
117
118 if (response) {
119 if (response[0] != '\0') // check if not empty string
120 strcat(response, "\n");
121 strcat(response, line);
122 }
123 }
124 }
125 delay(commandDelay * 1000); // wait 0.1 sec
126}
127
128sara_modem::command_status sara_modem::send(const char* request, command_flags flags) {
129 return send(request, NULL, flags);
130}