Detekce zvoneni, moznost zaveseni, moznost resetu modemu
This commit is contained in:
parent
c2d0707100
commit
972ec4d354
@ -90,6 +90,8 @@ void ThreadedGSM::exec()
|
|||||||
mJob = REQ_STARTUP;
|
mJob = REQ_STARTUP;
|
||||||
else if (mRequests & REQ_BATTERY)
|
else if (mRequests & REQ_BATTERY)
|
||||||
mJob = REQ_BATTERY;
|
mJob = REQ_BATTERY;
|
||||||
|
else if (mRequests & REQ_HANGUP)
|
||||||
|
mJob = REQ_HANGUP;
|
||||||
|
|
||||||
if (mJob) {
|
if (mJob) {
|
||||||
mState = 0;
|
mState = 0;
|
||||||
@ -111,6 +113,8 @@ void ThreadedGSM::exec()
|
|||||||
Outbox();
|
Outbox();
|
||||||
else if (mJob == REQ_BATTERY)
|
else if (mJob == REQ_BATTERY)
|
||||||
Battery();
|
Battery();
|
||||||
|
else if (mJob == REQ_HANGUP)
|
||||||
|
Hangup();
|
||||||
else
|
else
|
||||||
CheckRing();
|
CheckRing();
|
||||||
}
|
}
|
||||||
@ -335,6 +339,29 @@ void ThreadedGSM::Battery()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ThreadedGSM::Hangup()
|
||||||
|
{
|
||||||
|
int lastState = mState;
|
||||||
|
|
||||||
|
switch (mState) {
|
||||||
|
case HANGUP_REQ:
|
||||||
|
mDte.SendCommand(F("ATH\r"), THREADEDGSM_AT_TIMEOUT, "OK\r");
|
||||||
|
mState = HANGUP_CHK;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case HANGUP_CHK:
|
||||||
|
if (mDte.getResult() == DTE::EXPECT_RESULT) {
|
||||||
|
clearReq(REQ_HANGUP);
|
||||||
|
} else
|
||||||
|
clearReq(REQ_HANGUP);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (mState != lastState) {
|
||||||
|
DEBUG_PRINT(F("HANGUP_STATE: "));
|
||||||
|
DEBUG_PRINTLN(mState);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ThreadedGSM::clearReq(int req)
|
void ThreadedGSM::clearReq(int req)
|
||||||
{
|
{
|
||||||
mRequests &= ~(req);
|
mRequests &= ~(req);
|
||||||
@ -498,41 +525,75 @@ void ThreadedGSM::Outbox()
|
|||||||
|
|
||||||
void ThreadedGSM::CheckRing()
|
void ThreadedGSM::CheckRing()
|
||||||
{
|
{
|
||||||
int lastState = mRingState;
|
|
||||||
|
|
||||||
switch (mRingState) {
|
|
||||||
case RING_WAIT:
|
|
||||||
if (mDte.buffer()) {
|
if (mDte.buffer()) {
|
||||||
String & buffer = mDte.getBuffer();
|
String & buffer = mDte.getBuffer();
|
||||||
|
|
||||||
if (buffer.length() > 0) {
|
if (buffer.length() > 0) {
|
||||||
|
bool dump = true;
|
||||||
|
|
||||||
TRACE(TRACE_INFO, F("Gsm: %s"), buffer.c_str());
|
if (buffer.startsWith(F("+CLIP: \""))) {
|
||||||
|
// CLIP (RING) detected
|
||||||
|
if (mConfiguration.ring) {
|
||||||
|
int index = 8;
|
||||||
|
int endindex;
|
||||||
|
|
||||||
|
endindex = buffer.indexOf(F("\""), index);
|
||||||
|
if (endindex >= 0) {
|
||||||
|
String num = buffer.substring(index, endindex);
|
||||||
|
|
||||||
|
mConfiguration.ring(*this, num);
|
||||||
|
dump = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (buffer.startsWith(F("NO CARRIER"))) {
|
||||||
|
// end of call detected
|
||||||
|
if (mConfiguration.ring) {
|
||||||
|
String num = F("end");
|
||||||
|
|
||||||
|
mConfiguration.ring(*this, num);
|
||||||
|
dump = false;
|
||||||
|
}
|
||||||
|
} else if (buffer.startsWith(F("+CMTI: \"SM\""))) {
|
||||||
|
// SMS receive detected
|
||||||
|
if (mConfiguration.incoming) {
|
||||||
|
mRequests |= (REQ_INBOX);
|
||||||
|
dump = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (dump) {
|
||||||
|
TRACE(TRACE_DEBUG, F("Gsm: %s"), buffer.c_str());
|
||||||
|
}
|
||||||
mDte.clearBuffer();
|
mDte.clearBuffer();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
|
|
||||||
case RING_CHK:
|
|
||||||
if (mConfiguration.ring != nullptr) {
|
|
||||||
String s = "Ring";
|
|
||||||
mConfiguration.ring(*this, s);
|
|
||||||
}
|
|
||||||
mRingState = RING_WAIT;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (mRingState != lastState) {
|
|
||||||
DEBUG_PRINT(F("RING_STATE: "));
|
|
||||||
DEBUG_PRINTLN(mRingState);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ThreadedGSM::startupDone()
|
void ThreadedGSM::startupDone()
|
||||||
{
|
{
|
||||||
mRequests |= ((REQ_CLOCK) | (REQ_SIG) | (REQ_BATTERY));
|
if (mConfiguration.clock)
|
||||||
|
mRequests |= (REQ_CLOCK);
|
||||||
|
if (mConfiguration.battery)
|
||||||
|
mRequests |= (REQ_BATTERY);
|
||||||
|
if (mConfiguration.signal)
|
||||||
|
mRequests |= (REQ_SIG);
|
||||||
|
if (mConfiguration.incoming)
|
||||||
|
mRequests |= (REQ_INBOX);
|
||||||
clearReq(REQ_STARTUP);
|
clearReq(REQ_STARTUP);
|
||||||
for (unsigned long & i : tickSync)
|
for (unsigned long & i : tickSync)
|
||||||
i = millis();
|
i = millis();
|
||||||
if (mConfiguration.ready != nullptr)
|
if (mConfiguration.ready != nullptr)
|
||||||
mConfiguration.ready(*this);
|
mConfiguration.ready(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ThreadedGSM::hangup()
|
||||||
|
{
|
||||||
|
|
||||||
|
mRequests |= (REQ_HANGUP);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ThreadedGSM::restartModem()
|
||||||
|
{
|
||||||
|
|
||||||
|
mRequests |= (REQ_STARTUP);
|
||||||
|
}
|
||||||
|
@ -140,6 +140,11 @@ class ThreadedGSM : public Executable
|
|||||||
SEND_CHK_OK
|
SEND_CHK_OK
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum StateHangup {
|
||||||
|
HANGUP_REQ,
|
||||||
|
HANGUP_CHK
|
||||||
|
};
|
||||||
|
|
||||||
enum StatesCheckRing {
|
enum StatesCheckRing {
|
||||||
RING_WAIT,
|
RING_WAIT,
|
||||||
RING_CHK,
|
RING_CHK,
|
||||||
@ -152,8 +157,8 @@ class ThreadedGSM : public Executable
|
|||||||
int Index; // Index of read message
|
int Index; // Index of read message
|
||||||
} Message{};
|
} Message{};
|
||||||
|
|
||||||
SMSInfo mSMSi; // Inbox SMS (incoming)
|
SMSInfo mSMSi{}; // Inbox SMS (incoming)
|
||||||
SMSInfo mSMSo; // Outbox SMS (outgoing)
|
SMSInfo mSMSo{}; // Outbox SMS (outgoing)
|
||||||
|
|
||||||
Stream & mStream;
|
Stream & mStream;
|
||||||
DTE mDte;
|
DTE mDte;
|
||||||
@ -172,6 +177,7 @@ class ThreadedGSM : public Executable
|
|||||||
REQ_OUTBOX = 8,
|
REQ_OUTBOX = 8,
|
||||||
REQ_STARTUP = 16,
|
REQ_STARTUP = 16,
|
||||||
REQ_BATTERY = 32,
|
REQ_BATTERY = 32,
|
||||||
|
REQ_HANGUP = 64,
|
||||||
};
|
};
|
||||||
int mRequests = 0;
|
int mRequests = 0;
|
||||||
int mState = 0;
|
int mState = 0;
|
||||||
@ -200,6 +206,10 @@ class ThreadedGSM : public Executable
|
|||||||
|
|
||||||
void sendSMS(String & Number, const char * Text);
|
void sendSMS(String & Number, const char * Text);
|
||||||
|
|
||||||
|
void hangup();
|
||||||
|
|
||||||
|
void restartModem();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void startupDone();
|
void startupDone();
|
||||||
|
|
||||||
@ -219,5 +229,7 @@ class ThreadedGSM : public Executable
|
|||||||
|
|
||||||
void Outbox();
|
void Outbox();
|
||||||
|
|
||||||
|
void Hangup();
|
||||||
|
|
||||||
void CheckRing();
|
void CheckRing();
|
||||||
}; // ThreadedGSM
|
}; // ThreadedGSM
|
||||||
|
Loading…
Reference in New Issue
Block a user