WIP: pridani ring indikace (zatim nefunkcni)
This commit is contained in:
		
							
								
								
									
										119
									
								
								src/DTE.h
									
									
									
									
									
								
							
							
						
						
									
										119
									
								
								src/DTE.h
									
									
									
									
									
								
							@@ -5,24 +5,22 @@
 | 
			
		||||
* Author: Neta Yahav
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef __DTE_H__
 | 
			
		||||
#define __DTE_H__
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <Arduino.h>
 | 
			
		||||
 | 
			
		||||
class DTE
 | 
			
		||||
{
 | 
			
		||||
//variables
 | 
			
		||||
public:
 | 
			
		||||
	enum CommandResult
 | 
			
		||||
	{
 | 
			
		||||
		EXPECT_BUSY,
 | 
			
		||||
		EXPECT_TIMEOUT,
 | 
			
		||||
		EXPECT_DELAY,
 | 
			
		||||
		EXPECT_RESULT
 | 
			
		||||
		EXPECT_RESULT,
 | 
			
		||||
        EXPECT_RING
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
private:
 | 
			
		||||
	String buffer;
 | 
			
		||||
	Stream& stream;
 | 
			
		||||
@@ -33,33 +31,32 @@ private:
 | 
			
		||||
	unsigned long tick;
 | 
			
		||||
	unsigned int match;
 | 
			
		||||
	CommandResult result;
 | 
			
		||||
//functions
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
	DTE(Stream& stream, unsigned int size) : stream(stream), bufferSize(size), result(EXPECT_RESULT) { buffer.reserve(size); }
 | 
			
		||||
	DTE(Stream& stream, unsigned int size)
 | 
			
		||||
        : stream(stream)
 | 
			
		||||
        , bufferSize(size)
 | 
			
		||||
        , result(EXPECT_RESULT) {
 | 
			
		||||
            buffer.reserve(size);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
	~DTE() {};
 | 
			
		||||
	void SendCommand(const char* command, unsigned long timeout, const char* response1, const char* response2 = 0, const char* response3 = 0)
 | 
			
		||||
	{
 | 
			
		||||
 | 
			
		||||
	void SendCommand(const char* command, unsigned long timeout, const char* response1, const char* response2 = 0, const char* response3 = 0) {
 | 
			
		||||
		match = 0;
 | 
			
		||||
		result = EXPECT_BUSY;
 | 
			
		||||
		response[0] = response1;
 | 
			
		||||
		response[1] = response2;
 | 
			
		||||
		response[2] = response3;
 | 
			
		||||
		this->timeout = timeout;
 | 
			
		||||
		// clear rx buffer
 | 
			
		||||
		while (stream.available())
 | 
			
		||||
		{
 | 
			
		||||
			stream.read();
 | 
			
		||||
		}
 | 
			
		||||
		// send command
 | 
			
		||||
        flush();
 | 
			
		||||
		stream.print(command);
 | 
			
		||||
		buffer = "";
 | 
			
		||||
		tick = millis();
 | 
			
		||||
		proccess();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void SendCommand(const __FlashStringHelper* command, unsigned long timeout, const char* response1, const char* response2 = 0, const char* response3 = 0)
 | 
			
		||||
	{
 | 
			
		||||
//		char cmd[32];
 | 
			
		||||
	void SendCommand(const __FlashStringHelper* command, unsigned long timeout, const char* response1, const char* response2 = 0, const char* response3 = 0) {
 | 
			
		||||
 | 
			
		||||
		match = 0;
 | 
			
		||||
		result = EXPECT_BUSY;
 | 
			
		||||
@@ -68,81 +65,97 @@ public:
 | 
			
		||||
		response[2] = response3;
 | 
			
		||||
		this->timeout = timeout;
 | 
			
		||||
		// clear rx buffer
 | 
			
		||||
		while (stream.available())
 | 
			
		||||
		{
 | 
			
		||||
			stream.read();
 | 
			
		||||
		}
 | 
			
		||||
        flush();
 | 
			
		||||
		// send command
 | 
			
		||||
//		strcpy_P(cmd, command);
 | 
			
		||||
		stream.print((const __FlashStringHelper *)command);
 | 
			
		||||
//		stream.print(cmd);
 | 
			
		||||
		buffer = "";
 | 
			
		||||
		tick = millis();
 | 
			
		||||
		proccess();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void Delay(unsigned long delay)
 | 
			
		||||
	{
 | 
			
		||||
	void Delay(unsigned long delay) {
 | 
			
		||||
		timeout = delay;
 | 
			
		||||
		result = EXPECT_DELAY;
 | 
			
		||||
		tick = millis();
 | 
			
		||||
		proccess();
 | 
			
		||||
	}
 | 
			
		||||
	bool getIsBusy()
 | 
			
		||||
	{
 | 
			
		||||
 | 
			
		||||
	bool getIsBusy(void) {
 | 
			
		||||
		proccess();
 | 
			
		||||
		return (result == EXPECT_BUSY) || (result == EXPECT_DELAY);
 | 
			
		||||
	}
 | 
			
		||||
	CommandResult getResult() { return result ; }
 | 
			
		||||
	unsigned int getMatch() { return match; }
 | 
			
		||||
	String& getBuffer() { return buffer; }
 | 
			
		||||
protected:
 | 
			
		||||
 | 
			
		||||
	CommandResult getResult(void) {
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	unsigned int getMatch(void) {
 | 
			
		||||
        return match;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	String& getBuffer(void) {
 | 
			
		||||
        return buffer;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
	void proccess()
 | 
			
		||||
	{
 | 
			
		||||
		if(result == EXPECT_DELAY)
 | 
			
		||||
		{
 | 
			
		||||
 | 
			
		||||
    void flush(void) {
 | 
			
		||||
        // clear rx buffer
 | 
			
		||||
        while (stream.available()) {
 | 
			
		||||
            stream.read();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	void proccess(void) {
 | 
			
		||||
		if (result == EXPECT_DELAY) {
 | 
			
		||||
			if(millis() - tick >= timeout)
 | 
			
		||||
				result = EXPECT_RESULT;
 | 
			
		||||
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if(result != EXPECT_BUSY) return;
 | 
			
		||||
		if (result != EXPECT_BUSY) {
 | 
			
		||||
            if (stream.available()) {
 | 
			
		||||
                char c;
 | 
			
		||||
 | 
			
		||||
                c = stream.read();
 | 
			
		||||
                buffer += c;
 | 
			
		||||
                if (buffer.length() > 4) {
 | 
			
		||||
                    if (buffer.endsWith(F("RING\n"))) {
 | 
			
		||||
                        result = EXPECT_RING;
 | 
			
		||||
                    }
 | 
			
		||||
                    buffer.remove(0);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
		char c;
 | 
			
		||||
		unsigned long now = millis();
 | 
			
		||||
 | 
			
		||||
		while(millis() - tick < timeout)
 | 
			
		||||
		{
 | 
			
		||||
			while(stream.available() && (buffer.length() < (bufferSize)))
 | 
			
		||||
			{
 | 
			
		||||
		while (millis() - tick < timeout) {
 | 
			
		||||
			while (stream.available() && (buffer.length() < bufferSize)) {
 | 
			
		||||
				c = stream.read();
 | 
			
		||||
				buffer += c;
 | 
			
		||||
				if(buffer.endsWith(response[0]))
 | 
			
		||||
				{
 | 
			
		||||
				if (buffer.endsWith(response[0])) {
 | 
			
		||||
					match = 0;
 | 
			
		||||
					result = EXPECT_RESULT;
 | 
			
		||||
					return;
 | 
			
		||||
				}else if(response[1].length() != 0)
 | 
			
		||||
				{
 | 
			
		||||
					if(buffer.endsWith(response[1]))
 | 
			
		||||
					{
 | 
			
		||||
				} else if (response[1].length() != 0) {
 | 
			
		||||
					if (buffer.endsWith(response[1])) {
 | 
			
		||||
						match = 1;
 | 
			
		||||
						result = EXPECT_RESULT;
 | 
			
		||||
						return;
 | 
			
		||||
					}
 | 
			
		||||
				}else if(response[2].length() != 0)
 | 
			
		||||
				{
 | 
			
		||||
					if(buffer.endsWith(response[2]))
 | 
			
		||||
					{
 | 
			
		||||
				} else if (response[2].length() != 0) {
 | 
			
		||||
					if (buffer.endsWith(response[2])) {
 | 
			
		||||
						match = 2;
 | 
			
		||||
						result = EXPECT_RESULT;
 | 
			
		||||
						return;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if(millis() - now > 5)
 | 
			
		||||
			if (millis() - now > 5)
 | 
			
		||||
				return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@@ -150,5 +163,3 @@ private:
 | 
			
		||||
		result = EXPECT_TIMEOUT;
 | 
			
		||||
	}
 | 
			
		||||
}; //DTE
 | 
			
		||||
 | 
			
		||||
#endif //__DTE_H__
 | 
			
		||||
 
 | 
			
		||||
@@ -5,9 +5,7 @@
 | 
			
		||||
* Author: Neta Yahav
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifndef __THREADEDGSM_H__
 | 
			
		||||
#define __THREADEDGSM_H__
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <Arduino.h>
 | 
			
		||||
#include "DTE.h"
 | 
			
		||||
@@ -20,26 +18,26 @@
 | 
			
		||||
 | 
			
		||||
// Use custom values or default ones
 | 
			
		||||
#ifndef THREADEDGSM_DTE_BUFFER_SIZE
 | 
			
		||||
#define THREADEDGSM_DTE_BUFFER_SIZE THREADEDGSM_DEF_DTE_BUF_SIZ
 | 
			
		||||
# define THREADEDGSM_DTE_BUFFER_SIZE THREADEDGSM_DEF_DTE_BUF_SIZ
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef THREADEDGSM_AT_TIMEOUT
 | 
			
		||||
#define THREADEDGSM_AT_TIMEOUT THREADEDGSM_DEF_AT_TIMEOUT
 | 
			
		||||
# define THREADEDGSM_AT_TIMEOUT THREADEDGSM_DEF_AT_TIMEOUT
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef THREADEDGSM_STARTUP_DELAY
 | 
			
		||||
#define THREADEDGSM_STARTUP_DELAY THREADEDGSM_DEF_STA_PON
 | 
			
		||||
# define THREADEDGSM_STARTUP_DELAY THREADEDGSM_DEF_STA_PON
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef THREADEDGSM_STARTUP_POWER_OFF_DELAY
 | 
			
		||||
#define THREADEDGSM_STARTUP_POWER_OFF_DELAY THREADEDGSM_DEF_STA_POF
 | 
			
		||||
# define THREADEDGSM_STARTUP_POWER_OFF_DELAY THREADEDGSM_DEF_STA_POF
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define THREADEDGSM_INTERVAL_COUNT       4
 | 
			
		||||
 | 
			
		||||
#ifdef THREADEDGSM_DEBUG
 | 
			
		||||
	#define DEBUG_PRINT(x)  THREADEDGSM_DEBUG.print (x)
 | 
			
		||||
	#define DEBUG_PRINTLN(x)  THREADEDGSM_DEBUG.println (x)
 | 
			
		||||
# define DEBUG_PRINT(x)  THREADEDGSM_DEBUG.print (x)
 | 
			
		||||
# define DEBUG_PRINTLN(x)  THREADEDGSM_DEBUG.println (x)
 | 
			
		||||
#else
 | 
			
		||||
	#define DEBUG_PRINT(x)
 | 
			
		||||
	#define DEBUG_PRINTLN(x)
 | 
			
		||||
# define DEBUG_PRINT(x)
 | 
			
		||||
# define DEBUG_PRINTLN(x)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
class ThreadedGSM
 | 
			
		||||
@@ -96,6 +94,7 @@ public:
 | 
			
		||||
    typedef void (*ThreadedGSMCallbackIncomingSMS)(ThreadedGSM&, SMSInfo&);
 | 
			
		||||
    typedef void (*ThreadedGSMCallbackBool)(ThreadedGSM&, bool);
 | 
			
		||||
    typedef void (*ThreadedGSMCallback)(ThreadedGSM&);
 | 
			
		||||
    typedef void (*ThreadedGSMCallbackRing)(ThreadedGSM&, String&);
 | 
			
		||||
    struct conf
 | 
			
		||||
    {
 | 
			
		||||
        ThreadedGSMCallbackSignal signal;
 | 
			
		||||
@@ -105,6 +104,7 @@ public:
 | 
			
		||||
        ThreadedGSMCallback outgoing;
 | 
			
		||||
        ThreadedGSMCallbackBool power;
 | 
			
		||||
        ThreadedGSMCallbackBattery battery;
 | 
			
		||||
        ThreadedGSMCallbackRing ring;
 | 
			
		||||
    };
 | 
			
		||||
protected:
 | 
			
		||||
private:
 | 
			
		||||
@@ -159,12 +159,18 @@ private:
 | 
			
		||||
        SEND_CHK_OK
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    enum StatesCheckRing
 | 
			
		||||
    {
 | 
			
		||||
        RING_WAIT,
 | 
			
		||||
        RING_CHK,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    unsigned long tick;
 | 
			
		||||
 | 
			
		||||
    struct
 | 
			
		||||
    {
 | 
			
		||||
        int Index; // Index of readed message
 | 
			
		||||
	}Message;
 | 
			
		||||
    } Message;
 | 
			
		||||
 | 
			
		||||
    SMSInfo SMSi; // Inbox SMS (incoming)
 | 
			
		||||
    SMSInfo SMSo; // Outbox SMS (outgoing)
 | 
			
		||||
@@ -176,7 +182,8 @@ private:
 | 
			
		||||
    unsigned long Intervals[THREADEDGSM_INTERVAL_COUNT];
 | 
			
		||||
 | 
			
		||||
    // callbacks
 | 
			
		||||
	conf configuration = {NULL, NULL, NULL, NULL, NULL, NULL, NULL};
 | 
			
		||||
//    conf configuration = {nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr};
 | 
			
		||||
    conf configuration{0};
 | 
			
		||||
 | 
			
		||||
    enum ReqTypes
 | 
			
		||||
    {
 | 
			
		||||
@@ -190,11 +197,15 @@ private:
 | 
			
		||||
    int requests;
 | 
			
		||||
    int state;
 | 
			
		||||
    int job;
 | 
			
		||||
    int ringState;
 | 
			
		||||
//functions
 | 
			
		||||
public:
 | 
			
		||||
	ThreadedGSM(Stream& stream) : stream(stream), dte(stream, THREADEDGSM_DTE_BUFFER_SIZE)
 | 
			
		||||
    ThreadedGSM(Stream& stream)
 | 
			
		||||
        : stream(stream)
 | 
			
		||||
        , dte(stream, THREADEDGSM_DTE_BUFFER_SIZE)
 | 
			
		||||
        , ringState(RING_WAIT)
 | 
			
		||||
    {
 | 
			
		||||
		for(int i=0;i<THREADEDGSM_INTERVAL_COUNT;i++)
 | 
			
		||||
        for (int i = 0; i < THREADEDGSM_INTERVAL_COUNT; i++)
 | 
			
		||||
            Intervals[i] = 0;
 | 
			
		||||
 | 
			
		||||
        job = state = requests = 0;
 | 
			
		||||
@@ -202,52 +213,49 @@ public:
 | 
			
		||||
        //SMSi.Text.reserve(150);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	~ThreadedGSM(){};
 | 
			
		||||
    ~ThreadedGSM() {};
 | 
			
		||||
 | 
			
		||||
	void nextJob()
 | 
			
		||||
	{
 | 
			
		||||
    void nextJob(void) {
 | 
			
		||||
        job = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	void setHandlers(conf config)
 | 
			
		||||
	{
 | 
			
		||||
    void setHandlers(conf config) {
 | 
			
		||||
 | 
			
		||||
        this->configuration = config;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	void setInterval(IntervalSourceE source, unsigned long interval)
 | 
			
		||||
	{
 | 
			
		||||
    void setInterval(IntervalSourceE source, unsigned long interval) {
 | 
			
		||||
        Intervals[source] = interval;
 | 
			
		||||
        tickSync[source] = millis();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Initialization
 | 
			
		||||
	void begin()
 | 
			
		||||
	{
 | 
			
		||||
    void begin(void) {
 | 
			
		||||
        requests = (REQ_STARTUP);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Call this function for executing thread
 | 
			
		||||
	void loop()
 | 
			
		||||
	{
 | 
			
		||||
		if(dte.getIsBusy()) return;
 | 
			
		||||
    void loop(void) {
 | 
			
		||||
        if (dte.getIsBusy())
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        // intervals
 | 
			
		||||
		for(int i=0;i<THREADEDGSM_INTERVAL_COUNT;i++)
 | 
			
		||||
		{
 | 
			
		||||
			if(Intervals[i])
 | 
			
		||||
			{
 | 
			
		||||
				if(millis() - tickSync[i] >= Intervals[i])
 | 
			
		||||
				{
 | 
			
		||||
        for (int i = 0; i < THREADEDGSM_INTERVAL_COUNT; i++) {
 | 
			
		||||
            if (Intervals[i]) {
 | 
			
		||||
                if (millis() - tickSync[i] >= Intervals[i]) {
 | 
			
		||||
                    switch (i) {
 | 
			
		||||
                    case INTERVAL_CLOCK:
 | 
			
		||||
                        requests |= REQ_CLOCK;
 | 
			
		||||
                        break;
 | 
			
		||||
 | 
			
		||||
                    case INTERVAL_INBOX:
 | 
			
		||||
                        requests |= REQ_INBOX;
 | 
			
		||||
                        break;
 | 
			
		||||
 | 
			
		||||
                    case INTERVAL_SIGNAL:
 | 
			
		||||
                        requests |= REQ_SIG;
 | 
			
		||||
                        break;
 | 
			
		||||
 | 
			
		||||
                    case INTERVAL_BATTERY:
 | 
			
		||||
                        requests |= REQ_BATTERY;
 | 
			
		||||
                        break;
 | 
			
		||||
@@ -257,24 +265,22 @@ public:
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
		if(job == 0)
 | 
			
		||||
		{
 | 
			
		||||
        if (job == 0) {
 | 
			
		||||
            // no assigned job, assign it
 | 
			
		||||
			if(requests & REQ_CLOCK)
 | 
			
		||||
            if (requests & REQ_CLOCK)
 | 
			
		||||
                job = REQ_CLOCK;
 | 
			
		||||
			else if(requests & REQ_SIG)
 | 
			
		||||
            else if (requests & REQ_SIG)
 | 
			
		||||
                job = REQ_SIG;
 | 
			
		||||
			else if(requests & REQ_INBOX)
 | 
			
		||||
            else if (requests & REQ_INBOX)
 | 
			
		||||
                job = REQ_INBOX;
 | 
			
		||||
			else if(requests & REQ_OUTBOX)
 | 
			
		||||
            else if (requests & REQ_OUTBOX)
 | 
			
		||||
                job = REQ_OUTBOX;
 | 
			
		||||
			else if(requests & REQ_STARTUP)
 | 
			
		||||
            else if (requests & REQ_STARTUP)
 | 
			
		||||
                job = REQ_STARTUP;
 | 
			
		||||
			else if(requests & REQ_BATTERY)
 | 
			
		||||
            else if (requests & REQ_BATTERY)
 | 
			
		||||
                job = REQ_BATTERY;
 | 
			
		||||
 | 
			
		||||
			if(job)
 | 
			
		||||
			{
 | 
			
		||||
            if (job) {
 | 
			
		||||
                state = 0;
 | 
			
		||||
                DEBUG_PRINT(F("Job ID: "));
 | 
			
		||||
                DEBUG_PRINTLN(job);
 | 
			
		||||
@@ -282,231 +288,213 @@ public:
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // execute current job
 | 
			
		||||
		if(job == REQ_STARTUP)
 | 
			
		||||
        if (job == REQ_STARTUP)
 | 
			
		||||
            Startup();
 | 
			
		||||
		else if(job == REQ_CLOCK)
 | 
			
		||||
        else if (job == REQ_CLOCK)
 | 
			
		||||
            Clock();
 | 
			
		||||
		else if(job == REQ_SIG)
 | 
			
		||||
        else if (job == REQ_SIG)
 | 
			
		||||
            Signal();
 | 
			
		||||
		else if(job == REQ_INBOX)
 | 
			
		||||
        else if (job == REQ_INBOX)
 | 
			
		||||
            Inbox();
 | 
			
		||||
		else if(job == REQ_OUTBOX)
 | 
			
		||||
        else if (job == REQ_OUTBOX)
 | 
			
		||||
            Outbox();
 | 
			
		||||
		else if(job == REQ_BATTERY)
 | 
			
		||||
        else if (job == REQ_BATTERY)
 | 
			
		||||
            Battery();
 | 
			
		||||
        else CheckRing();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Requests
 | 
			
		||||
	void sendSMS(String& Number, String& Text)
 | 
			
		||||
	{
 | 
			
		||||
    void sendSMS(String& Number, String& Text) {
 | 
			
		||||
        requests |= (REQ_OUTBOX);
 | 
			
		||||
        SMSo.Number = Number;
 | 
			
		||||
        SMSo.Text = Text;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void sendSMS(String& Number, char *Text)
 | 
			
		||||
    {
 | 
			
		||||
        requests |= (REQ_OUTBOX);
 | 
			
		||||
        SMSo.Number = Number;
 | 
			
		||||
        SMSo.Text = Text;
 | 
			
		||||
    void sendSMS(String& Number, char *Text) {
 | 
			
		||||
        String t = Text;
 | 
			
		||||
 | 
			
		||||
        sendSMS(Number, t);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    // States
 | 
			
		||||
	void Startup()
 | 
			
		||||
	{
 | 
			
		||||
    void Startup(void) {
 | 
			
		||||
        int lastState = state;
 | 
			
		||||
		switch(state)
 | 
			
		||||
		{
 | 
			
		||||
        switch (state) {
 | 
			
		||||
        case STARTUP_POWER_OFF:
 | 
			
		||||
				if(this->configuration.power != NULL)
 | 
			
		||||
            if (this->configuration.power != NULL)
 | 
			
		||||
                this->configuration.power(*this, false);
 | 
			
		||||
            tick = millis();
 | 
			
		||||
            state = STARTUP_POWER_OFF_DELAY;
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        case STARTUP_POWER_OFF_DELAY:
 | 
			
		||||
				if(millis() - tick >= THREADEDGSM_STARTUP_POWER_OFF_DELAY)
 | 
			
		||||
            if (millis() - tick >= THREADEDGSM_STARTUP_POWER_OFF_DELAY)
 | 
			
		||||
                state = STARTUP_POWER_ON;
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        case STARTUP_POWER_ON:
 | 
			
		||||
				if(this->configuration.power != NULL)
 | 
			
		||||
            if (this->configuration.power != NULL)
 | 
			
		||||
                this->configuration.power(*this, true);
 | 
			
		||||
            // begin delay
 | 
			
		||||
            tick = millis();
 | 
			
		||||
            state = STARTUP_DELAY;
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        case STARTUP_DELAY:
 | 
			
		||||
				if(millis() - tick >= THREADEDGSM_STARTUP_DELAY)
 | 
			
		||||
				{
 | 
			
		||||
            if (millis() - tick >= THREADEDGSM_STARTUP_DELAY) {
 | 
			
		||||
                dte.SendCommand(F("AT\r"), THREADEDGSM_AT_TIMEOUT, "OK\r");
 | 
			
		||||
                state = STARTUP_ENTER_AT;
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        case STARTUP_ENTER_AT:
 | 
			
		||||
				if(dte.getResult() ==  DTE::EXPECT_RESULT)
 | 
			
		||||
				{
 | 
			
		||||
            if (dte.getResult() ==  DTE::EXPECT_RESULT) {
 | 
			
		||||
                dte.SendCommand(F("AT+CPIN?\r"), 10000, "OK\r");
 | 
			
		||||
                state = STARTUP_CHK_CPIN;
 | 
			
		||||
				}
 | 
			
		||||
				else
 | 
			
		||||
				{
 | 
			
		||||
            } else {
 | 
			
		||||
                state = STARTUP_POWER_OFF;
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        case STARTUP_CHK_CPIN:
 | 
			
		||||
				if(dte.getResult() == DTE::EXPECT_RESULT)
 | 
			
		||||
				{
 | 
			
		||||
					if(dte.getBuffer().indexOf(F("+CPIN: READY")) != -1)
 | 
			
		||||
					{
 | 
			
		||||
            if (dte.getResult() == DTE::EXPECT_RESULT) {
 | 
			
		||||
                if (dte.getBuffer().indexOf(F("+CPIN: READY")) != -1) {
 | 
			
		||||
                    dte.SendCommand(F("AT+CREG?\r"), THREADEDGSM_AT_TIMEOUT, "OK\r");
 | 
			
		||||
                    state = STARTUP_CHK_CREG;
 | 
			
		||||
					}else
 | 
			
		||||
					{
 | 
			
		||||
                } else {
 | 
			
		||||
                    state = STARTUP_POWER_OFF;
 | 
			
		||||
                }
 | 
			
		||||
				}else
 | 
			
		||||
            } else
 | 
			
		||||
                state = STARTUP_POWER_OFF;
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        case STARTUP_CHK_CREG:
 | 
			
		||||
				if(dte.getResult() == DTE::EXPECT_RESULT)
 | 
			
		||||
				{
 | 
			
		||||
					if((dte.getBuffer().indexOf(F(",1")) >= 0) || (dte.getBuffer().indexOf(F(",5")) >= 0))
 | 
			
		||||
					{
 | 
			
		||||
            if (dte.getResult() == DTE::EXPECT_RESULT) {
 | 
			
		||||
                if ((dte.getBuffer().indexOf(F(",1")) >= 0) || (dte.getBuffer().indexOf(F(",5")) >= 0)) {
 | 
			
		||||
                    dte.SendCommand(F("AT+CLTS=1\r"), THREADEDGSM_AT_TIMEOUT, "OK\r");
 | 
			
		||||
                    state = STARTUP_CHK_CLTS;
 | 
			
		||||
					}else
 | 
			
		||||
                } else
 | 
			
		||||
                    state = STARTUP_POWER_OFF;
 | 
			
		||||
				}else
 | 
			
		||||
            } else
 | 
			
		||||
                state = STARTUP_POWER_OFF;
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        case STARTUP_CHK_CLTS:
 | 
			
		||||
				if(dte.getResult() == DTE::EXPECT_RESULT)
 | 
			
		||||
				{
 | 
			
		||||
            if (dte.getResult() == DTE::EXPECT_RESULT) {
 | 
			
		||||
                dte.SendCommand(F("AT+CENG=3\r"), THREADEDGSM_AT_TIMEOUT, "OK\r");
 | 
			
		||||
                state = STARTUP_CHK_CENG;
 | 
			
		||||
				}else
 | 
			
		||||
            } else
 | 
			
		||||
                state = STARTUP_POWER_OFF;
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        case STARTUP_CHK_CENG:
 | 
			
		||||
				if(dte.getResult() == DTE::EXPECT_RESULT)
 | 
			
		||||
				{
 | 
			
		||||
					requests |= ((REQ_CLOCK)|(REQ_SIG)|(REQ_BATTERY));
 | 
			
		||||
            if (dte.getResult() == DTE::EXPECT_RESULT) {
 | 
			
		||||
                requests |= ((REQ_CLOCK) | (REQ_SIG) | (REQ_BATTERY));
 | 
			
		||||
                clearReq(REQ_STARTUP);
 | 
			
		||||
					for(int i=0;i<THREADEDGSM_INTERVAL_COUNT;i++)
 | 
			
		||||
                for (int i = 0; i < THREADEDGSM_INTERVAL_COUNT; i++)
 | 
			
		||||
                    tickSync[i] = millis();
 | 
			
		||||
					if(this->configuration.ready != NULL)
 | 
			
		||||
                if (this->configuration.ready != NULL)
 | 
			
		||||
                    this->configuration.ready(*this);
 | 
			
		||||
				}else
 | 
			
		||||
            } else
 | 
			
		||||
                state = STARTUP_POWER_OFF;
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
		if(state != lastState)
 | 
			
		||||
		{
 | 
			
		||||
        if (state != lastState) {
 | 
			
		||||
            DEBUG_PRINT(F("STARTUP_STATE: "));
 | 
			
		||||
            DEBUG_PRINTLN(state);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Threads
 | 
			
		||||
	void Clock()
 | 
			
		||||
	{
 | 
			
		||||
    void Clock(void) {
 | 
			
		||||
        String clockTime;
 | 
			
		||||
        int lastState = state;
 | 
			
		||||
		switch(state)
 | 
			
		||||
		{
 | 
			
		||||
        switch (state) {
 | 
			
		||||
        case CLOCK_REQ:
 | 
			
		||||
            dte.SendCommand(F("AT+CCLK?\r"), THREADEDGSM_AT_TIMEOUT, "OK\r");
 | 
			
		||||
            state = CLOCK_VERIFY;
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        case CLOCK_VERIFY:
 | 
			
		||||
            int index = dte.getBuffer().indexOf(F("+CCLK: "));
 | 
			
		||||
				if(index >= 0)
 | 
			
		||||
				{
 | 
			
		||||
            if (index >= 0) {
 | 
			
		||||
                // parse clock
 | 
			
		||||
					index+=8;
 | 
			
		||||
                index += 8;
 | 
			
		||||
                int endindex;
 | 
			
		||||
                endindex = dte.getBuffer().indexOf(F("+"), index);
 | 
			
		||||
					if(endindex >= 0)
 | 
			
		||||
                if (endindex >= 0)
 | 
			
		||||
                    clockTime = dte.getBuffer().substring(index, endindex);
 | 
			
		||||
					else
 | 
			
		||||
					{
 | 
			
		||||
                else {
 | 
			
		||||
                    endindex = dte.getBuffer().indexOf(F("-"), index);
 | 
			
		||||
						if(endindex >= 0)
 | 
			
		||||
                    if (endindex >= 0)
 | 
			
		||||
                        clockTime = dte.getBuffer().substring(index, endindex);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
					if(endindex >= 0)
 | 
			
		||||
					{
 | 
			
		||||
                if (endindex >= 0) {
 | 
			
		||||
                    NetworkTime ClockTime;
 | 
			
		||||
						ClockTime.year = 2000+clockTime.substring(0,2).toInt();
 | 
			
		||||
						ClockTime.month = clockTime.substring(3,5).toInt();
 | 
			
		||||
						ClockTime.day = clockTime.substring(6,8).toInt();
 | 
			
		||||
						ClockTime.hour = clockTime.substring(9,11).toInt();
 | 
			
		||||
						ClockTime.minute = clockTime.substring(12,14).toInt();
 | 
			
		||||
						ClockTime.second = clockTime.substring(15,17).toInt();
 | 
			
		||||
						if(this->configuration.clock != NULL)
 | 
			
		||||
                    ClockTime.year = 2000 + clockTime.substring(0, 2).toInt();
 | 
			
		||||
                    ClockTime.month = clockTime.substring(3, 5).toInt();
 | 
			
		||||
                    ClockTime.day = clockTime.substring(6, 8).toInt();
 | 
			
		||||
                    ClockTime.hour = clockTime.substring(9, 11).toInt();
 | 
			
		||||
                    ClockTime.minute = clockTime.substring(12, 14).toInt();
 | 
			
		||||
                    ClockTime.second = clockTime.substring(15, 17).toInt();
 | 
			
		||||
                    if (this->configuration.clock != NULL)
 | 
			
		||||
                        this->configuration.clock(*this, ClockTime);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            clearReq(REQ_CLOCK);
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
		if(state != lastState)
 | 
			
		||||
		{
 | 
			
		||||
        if (state != lastState) {
 | 
			
		||||
            DEBUG_PRINT(F("CLOCK_STATE: "));
 | 
			
		||||
            DEBUG_PRINTLN(state);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	void Signal()
 | 
			
		||||
	{
 | 
			
		||||
    void Signal(void) {
 | 
			
		||||
        int lastState = state;
 | 
			
		||||
		switch(state)
 | 
			
		||||
		{
 | 
			
		||||
        switch (state) {
 | 
			
		||||
        case SIGNAL_REQ:
 | 
			
		||||
            dte.SendCommand(F("AT+CSQ\r"), THREADEDGSM_AT_TIMEOUT, "OK\r");
 | 
			
		||||
            state = SIGNAL_VERIFY;
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        case SIGNAL_VERIFY:
 | 
			
		||||
            int index = dte.getBuffer().indexOf(F("+CSQ: "));
 | 
			
		||||
				if(index >= 0)
 | 
			
		||||
				{
 | 
			
		||||
            if (index >= 0) {
 | 
			
		||||
                // parse signal
 | 
			
		||||
					index+=6;
 | 
			
		||||
                index += 6;
 | 
			
		||||
                SignalLevel GsmSignal;
 | 
			
		||||
					GsmSignal.Value = dte.getBuffer().substring(index,index+2).toInt();
 | 
			
		||||
					GsmSignal.Dbm = dte.getBuffer().substring(index+3,index+5).toInt();
 | 
			
		||||
					if(GsmSignal.Value != 0)
 | 
			
		||||
					{
 | 
			
		||||
						if(this->configuration.signal != NULL)
 | 
			
		||||
                GsmSignal.Value = dte.getBuffer().substring(index, index + 2).toInt();
 | 
			
		||||
                GsmSignal.Dbm = dte.getBuffer().substring(index + 3, index + 5).toInt();
 | 
			
		||||
                if (GsmSignal.Value != 0) {
 | 
			
		||||
                    if (this->configuration.signal != NULL)
 | 
			
		||||
                        this->configuration.signal(*this, GsmSignal);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            clearReq(REQ_SIG);
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
		if(state != lastState)
 | 
			
		||||
		{
 | 
			
		||||
        if (state != lastState) {
 | 
			
		||||
            DEBUG_PRINT(F("SIGNAL_STATE: "));
 | 
			
		||||
            DEBUG_PRINTLN(state);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	void Battery()
 | 
			
		||||
	{
 | 
			
		||||
    void Battery(void) {
 | 
			
		||||
        int lastState = state;
 | 
			
		||||
		switch(state)
 | 
			
		||||
		{
 | 
			
		||||
        switch (state) {
 | 
			
		||||
        case BATTERY_REQ:
 | 
			
		||||
            dte.SendCommand(F("AT+CBC\r"), THREADEDGSM_AT_TIMEOUT, "OK\r");
 | 
			
		||||
            state = BATTERY_VERIFY;
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        case BATTERY_VERIFY:
 | 
			
		||||
            int index = dte.getBuffer().indexOf(F("+CBC:"));
 | 
			
		||||
				if(index >= 0)
 | 
			
		||||
				{
 | 
			
		||||
            if (index >= 0) {
 | 
			
		||||
                BatteryInfo BattInfo;
 | 
			
		||||
                // parse battery level
 | 
			
		||||
                String buffer = dte.getBuffer().substring(index);
 | 
			
		||||
@@ -515,48 +503,44 @@ private:
 | 
			
		||||
                BattInfo.Percent = buffer2.substring(0, buffer2.indexOf(F(","))).toInt(); // converts the result to interger
 | 
			
		||||
                buffer2 = buffer.substring(buffer.indexOf(F(",")) + 1);
 | 
			
		||||
                BattInfo.Voltage = buffer2.substring(0, buffer2.indexOf(F("\r"))).toInt(); // converts the result to interger
 | 
			
		||||
					if(this->configuration.battery != NULL)
 | 
			
		||||
                if (this->configuration.battery != NULL)
 | 
			
		||||
                    this->configuration.battery(*this, BattInfo);
 | 
			
		||||
            }
 | 
			
		||||
            clearReq(REQ_BATTERY);
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
		if(state != lastState)
 | 
			
		||||
		{
 | 
			
		||||
        if (state != lastState) {
 | 
			
		||||
            DEBUG_PRINT(F("BATTERY_STATE: "));
 | 
			
		||||
            DEBUG_PRINTLN(state);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	void clearReq(int req)
 | 
			
		||||
	{
 | 
			
		||||
    void clearReq(int req) {
 | 
			
		||||
        requests &= ~(req);
 | 
			
		||||
        nextJob();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	void Inbox()
 | 
			
		||||
	{
 | 
			
		||||
    void Inbox(void) {
 | 
			
		||||
        String CMD;
 | 
			
		||||
        int lastState = state;
 | 
			
		||||
		switch(state)
 | 
			
		||||
		{
 | 
			
		||||
        switch (state) {
 | 
			
		||||
        case READ_REQ:
 | 
			
		||||
            SMSi.Text = "";
 | 
			
		||||
            SMSi.Number = "";
 | 
			
		||||
            dte.SendCommand(F("AT+CMGF=0\r"), THREADEDGSM_AT_TIMEOUT, "OK\r"); // SMS Message format set as PDU
 | 
			
		||||
            state = READ_CHK_CMGF;
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        case READ_CHK_CMGF:
 | 
			
		||||
				if(dte.getResult() == DTE::EXPECT_RESULT)
 | 
			
		||||
				{
 | 
			
		||||
            if (dte.getResult() == DTE::EXPECT_RESULT) {
 | 
			
		||||
                dte.SendCommand(F("AT+CPMS=\"SM\"\r"), THREADEDGSM_AT_TIMEOUT, "OK\r"); // SIM Message storage
 | 
			
		||||
                state = READ_CHK_CPMS;
 | 
			
		||||
            }
 | 
			
		||||
            else clearReq(REQ_INBOX);
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        case READ_CHK_CPMS:
 | 
			
		||||
				if(dte.getResult() == DTE::EXPECT_RESULT)
 | 
			
		||||
				{
 | 
			
		||||
            if (dte.getResult() == DTE::EXPECT_RESULT) {
 | 
			
		||||
                CMD = F("AT+CMGL="); // Read all SMS messages
 | 
			
		||||
                CMD += (int) READ_TYPE_ALL;
 | 
			
		||||
                CMD += "\r";
 | 
			
		||||
@@ -565,22 +549,20 @@ private:
 | 
			
		||||
            }
 | 
			
		||||
            else clearReq(REQ_INBOX);
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        case READ_CHK_CMGL:
 | 
			
		||||
				if(dte.getResult() == DTE::EXPECT_RESULT)
 | 
			
		||||
				{
 | 
			
		||||
            if (dte.getResult() == DTE::EXPECT_RESULT) {
 | 
			
		||||
                //fetch index
 | 
			
		||||
                int indexStart = dte.getBuffer().indexOf(F("+CMGL: "));
 | 
			
		||||
					if (indexStart >= 0)
 | 
			
		||||
					{
 | 
			
		||||
                if (indexStart >= 0) {
 | 
			
		||||
                    Message.Index = dte.getBuffer().substring(indexStart + 7, dte.getBuffer().indexOf(F(","))).toInt();
 | 
			
		||||
						if(Message.Index != 0)
 | 
			
		||||
						{
 | 
			
		||||
                    if (Message.Index != 0) {
 | 
			
		||||
                        dte.Delay(2000);
 | 
			
		||||
                        state = READ_DELAY_CLEAR_BUFF;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
				if(state != READ_DELAY_CLEAR_BUFF)
 | 
			
		||||
            if (state != READ_DELAY_CLEAR_BUFF)
 | 
			
		||||
                clearReq(REQ_INBOX);
 | 
			
		||||
 | 
			
		||||
            break;
 | 
			
		||||
@@ -591,34 +573,29 @@ private:
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        case READ_TEXT_CMGR:
 | 
			
		||||
				if (dte.getResult() == DTE::EXPECT_RESULT)
 | 
			
		||||
				{
 | 
			
		||||
            if (dte.getResult() == DTE::EXPECT_RESULT) {
 | 
			
		||||
                CMD = F("AT+CMGR="); // Read the SMS message
 | 
			
		||||
                CMD += Message.Index;
 | 
			
		||||
                CMD += "\r";
 | 
			
		||||
                dte.SendCommand(CMD.c_str(), THREADEDGSM_AT_TIMEOUT, "OK\r");
 | 
			
		||||
                state = READ_CHK_CMGR;
 | 
			
		||||
				}else
 | 
			
		||||
            } else
 | 
			
		||||
                clearReq(REQ_INBOX);
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        case READ_CHK_CMGR:
 | 
			
		||||
				if(dte.getResult() == DTE::EXPECT_RESULT)
 | 
			
		||||
				{
 | 
			
		||||
            if (dte.getResult() == DTE::EXPECT_RESULT) {
 | 
			
		||||
                int indexStart = dte.getBuffer().indexOf(F("+CMGR: "));
 | 
			
		||||
					if(indexStart >= 0)
 | 
			
		||||
					{
 | 
			
		||||
                if (indexStart >= 0) {
 | 
			
		||||
                    int indexStartPDU = dte.getBuffer().indexOf(F("\r\n"), indexStart);
 | 
			
		||||
						if (indexStartPDU >= 0)
 | 
			
		||||
						{
 | 
			
		||||
							indexStartPDU+=2;
 | 
			
		||||
                    if (indexStartPDU >= 0) {
 | 
			
		||||
                        indexStartPDU += 2;
 | 
			
		||||
                        int indexEndPDU = dte.getBuffer().indexOf(F("\r"), indexStartPDU);
 | 
			
		||||
							if(indexEndPDU >= 0)
 | 
			
		||||
                        if (indexEndPDU >= 0)
 | 
			
		||||
                            SMSi.Text = dte.getBuffer().substring(indexStartPDU, indexEndPDU);
 | 
			
		||||
                    }
 | 
			
		||||
                    indexStartPDU = dte.getBuffer().indexOf(F(",\""), indexStart);
 | 
			
		||||
						if (indexStartPDU >= 0)
 | 
			
		||||
						{
 | 
			
		||||
                    if (indexStartPDU >= 0) {
 | 
			
		||||
                        indexStartPDU += 2;
 | 
			
		||||
                        int indexEndPDU = dte.getBuffer().indexOf(F("\","), indexStartPDU);
 | 
			
		||||
                        if (indexEndPDU >= 0)
 | 
			
		||||
@@ -630,42 +607,38 @@ private:
 | 
			
		||||
                CMD += "\r";
 | 
			
		||||
                dte.SendCommand(CMD.c_str(), THREADEDGSM_AT_TIMEOUT, "OK\r");
 | 
			
		||||
                state = READ_CHK_CMGD;
 | 
			
		||||
				}else
 | 
			
		||||
            } else
 | 
			
		||||
                clearReq(REQ_INBOX);
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        case READ_CHK_CMGD:
 | 
			
		||||
            //if( (dte.getResult() == DTE::EXPECT_RESULT) && (SMS.InboxMsgContents != ""))
 | 
			
		||||
				if(dte.getResult() == DTE::EXPECT_RESULT)
 | 
			
		||||
				{
 | 
			
		||||
					if(this->configuration.incoming != NULL)
 | 
			
		||||
            if (dte.getResult() == DTE::EXPECT_RESULT) {
 | 
			
		||||
                if (this->configuration.incoming != NULL)
 | 
			
		||||
                    this->configuration.incoming(*this, SMSi);
 | 
			
		||||
            }
 | 
			
		||||
            clearReq(REQ_INBOX);
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
		if(state != lastState)
 | 
			
		||||
		{
 | 
			
		||||
        if (state != lastState) {
 | 
			
		||||
            DEBUG_PRINT(F("INBOX_STATE: "));
 | 
			
		||||
            DEBUG_PRINTLN(state);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	void Outbox()
 | 
			
		||||
	{
 | 
			
		||||
    void Outbox(void) {
 | 
			
		||||
        String CMD;
 | 
			
		||||
 | 
			
		||||
        //CMD.reserve(200);
 | 
			
		||||
        int lastState = state;
 | 
			
		||||
		switch(state)
 | 
			
		||||
		{
 | 
			
		||||
        switch (state) {
 | 
			
		||||
        case SEND_REQ:
 | 
			
		||||
            dte.SendCommand(F("AT+CMGF=1\r"), THREADEDGSM_AT_TIMEOUT, "OK\r"); // SMS Text mode
 | 
			
		||||
            state = SEND_CHK_CMGF;
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        case SEND_CHK_CMGF:
 | 
			
		||||
				if(dte.getResult() == DTE::EXPECT_RESULT)
 | 
			
		||||
				{
 | 
			
		||||
            if (dte.getResult() == DTE::EXPECT_RESULT) {
 | 
			
		||||
                CMD = F("AT+CMGS=\"");
 | 
			
		||||
                CMD += SMSo.Number;
 | 
			
		||||
                CMD += "\"\r";
 | 
			
		||||
@@ -674,30 +647,43 @@ private:
 | 
			
		||||
            }
 | 
			
		||||
            else clearReq(REQ_OUTBOX);
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        case SEND_CHK_RDY:
 | 
			
		||||
				if(dte.getResult() == DTE::EXPECT_RESULT)
 | 
			
		||||
				{
 | 
			
		||||
            if (dte.getResult() == DTE::EXPECT_RESULT) {
 | 
			
		||||
                CMD = SMSo.Text;
 | 
			
		||||
                CMD += (char)26;
 | 
			
		||||
                dte.SendCommand(CMD.c_str(), 10000, "OK\r");
 | 
			
		||||
                state = SEND_CHK_OK;
 | 
			
		||||
				}else clearReq(REQ_OUTBOX);
 | 
			
		||||
            } else clearReq(REQ_OUTBOX);
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        case SEND_CHK_OK:
 | 
			
		||||
				if(dte.getResult() == DTE::EXPECT_RESULT)
 | 
			
		||||
				{
 | 
			
		||||
					if(this->configuration.outgoing != NULL)
 | 
			
		||||
            if (dte.getResult() == DTE::EXPECT_RESULT) {
 | 
			
		||||
                if (this->configuration.outgoing != NULL)
 | 
			
		||||
                    this->configuration.outgoing(*this);
 | 
			
		||||
            }
 | 
			
		||||
            clearReq(REQ_OUTBOX);
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
		if(state != lastState)
 | 
			
		||||
		{
 | 
			
		||||
        if (state != lastState) {
 | 
			
		||||
            DEBUG_PRINT(F("OUTBOX_STATE: "));
 | 
			
		||||
            DEBUG_PRINTLN(state);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}; //ThreadedGSM
 | 
			
		||||
 | 
			
		||||
#endif //__THREADEDGSM_H__
 | 
			
		||||
    void CheckRing(void) {
 | 
			
		||||
        int lastState = ringState;
 | 
			
		||||
        switch (ringState) {
 | 
			
		||||
            case RING_WAIT:
 | 
			
		||||
                if (dte.getResult() == DTE::EXPECT_RING) {
 | 
			
		||||
 | 
			
		||||
                    ringState = RING_CHK;
 | 
			
		||||
                }
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        if (ringState != lastState) {
 | 
			
		||||
            DEBUG_PRINT(F("RING_STATE: "));
 | 
			
		||||
            DEBUG_PRINTLN(ringState);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}; //ThreadedGSM
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user