Detekce zvoneni, moznost zaveseni, moznost resetu modemu

This commit is contained in:
Pavel Brychta 2023-09-04 17:20:24 +02:00
parent c2d0707100
commit 972ec4d354
2 changed files with 96 additions and 23 deletions

View File

@ -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) { if (mDte.buffer()) {
case RING_WAIT: String & buffer = mDte.getBuffer();
if (mDte.buffer()) {
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: \""))) {
mDte.clearBuffer(); // 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;
} }
} }
break; if (dump) {
TRACE(TRACE_DEBUG, F("Gsm: %s"), buffer.c_str());
case RING_CHK:
if (mConfiguration.ring != nullptr) {
String s = "Ring";
mConfiguration.ring(*this, s);
} }
mRingState = RING_WAIT; mDte.clearBuffer();
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);
}

View File

@ -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