Skip to content

Commit

Permalink
Added GSM shield library (AVR)
Browse files Browse the repository at this point in the history
  • Loading branch information
cmaglie committed Mar 11, 2013
1 parent ebc3501 commit 3ea0903
Show file tree
Hide file tree
Showing 85 changed files with 11,948 additions and 0 deletions.
1 change: 1 addition & 0 deletions build/shared/revisions.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
* Fixed memory leak when calling Ethernet.begin() multiple times.
* Fixed SD example listfiles.ino
* Fixed a lot of Esplora examples
* Added GSM library

[environment]

Expand Down
68 changes: 68 additions & 0 deletions libraries/GSM3/GSM.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
/*
This file is part of the GSM3 communications library for Arduino
-- Multi-transport communications platform
-- Fully asynchronous
-- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1
-- Voice calls
-- SMS
-- TCP/IP connections
-- HTTP basic clients
This library has been developed by Telefónica Digital - PDI -
- Physical Internet Lab, as part as its collaboration with
Arduino and the Open Hardware Community.
September-December 2012
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
The latest version of this library can always be found at
https://github.com/BlueVia/Official-Arduino
*/
#ifndef _GSM3SIMPLIFIERFILE_
#define _GSM3SIMPLIFIERFILE_

// This file simplifies the use of the GSM3 library
// First we include everything.

#include <GSM3CircularBuffer.h>
#include <GSM3MobileCellManagement.h>
#include <GSM3MobileClientService.h>
#include <GSM3MobileNetworkRegistry.h>
#include <GSM3MobileServerService.h>
#include <GSM3ShieldV1AccessProvider.h>
#include <GSM3ShieldV1BandManagement.h>
#include <GSM3ShieldV1ClientProvider.h>
#include <GSM3ShieldV1DataNetworkProvider.h>
#include <GSM3ShieldV1ModemVerification.h>
#include <GSM3ShieldV1PinManagement.h>
#include <GSM3ShieldV1ScanNetworks.h>
#include <GSM3SMSService.h>
#include <GSM3VoiceCallService.h>

#define GSM GSM3ShieldV1AccessProvider
#define GPRS GSM3ShieldV1DataNetworkProvider
#define GSMClient GSM3MobileClientService
#define GSMServer GSM3MobileServerService
#define GSMVoiceCall GSM3VoiceCallService
#define GSM_SMS GSM3SMSService

#define GSMPIN GSM3ShieldV1PinManagement
#define GSMModem GSM3ShieldV1ModemVerification
#define GSMCell GSM3CellManagement
#define GSMBand GSM3ShieldV1BandManagement
#define GSMScanner GSM3ShieldV1ScanNetworks

#endif
319 changes: 319 additions & 0 deletions libraries/GSM3/GSM3CircularBuffer.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,319 @@
/*
This file is part of the GSM3 communications library for Arduino
-- Multi-transport communications platform
-- Fully asynchronous
-- Includes code for the Arduino-Telefonica GSM/GPRS Shield V1
-- Voice calls
-- SMS
-- TCP/IP connections
-- HTTP basic clients
This library has been developed by Telefónica Digital - PDI -
- Physical Internet Lab, as part as its collaboration with
Arduino and the Open Hardware Community.
September-December 2012
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
The latest version of this library can always be found at
https://github.com/BlueVia/Official-Arduino
*/
#include "GSM3CircularBuffer.h"
#include <HardwareSerial.h>

GSM3CircularBuffer::GSM3CircularBuffer(GSM3CircularBufferManager* mgr)
{
head=0;
tail=0;
cbm=mgr;
}

int GSM3CircularBuffer::write(char c)
{
byte aux=(tail+1)& __BUFFERMASK__;
if(aux!=head)
{
theBuffer[tail]=c;
// Lets put an extra zero at the end, so we can
// read chains as we like.
// This is not exactly perfect, we are always 1+ behind the head
theBuffer[aux]=0;
tail=aux;
return 1;
}
return 0;
}

char GSM3CircularBuffer::read()
{
char res;
if(head!=tail)
{
res=theBuffer[head];
head=(head+1)& __BUFFERMASK__;
//if(cbm)
// cbm->spaceAvailable();
return res;
}
else
{
return 0;
}
}

char GSM3CircularBuffer::peek(int increment)
{
char res;
byte num_aux;

if (tail>head) num_aux = tail-head;
else num_aux = 128 - head + tail;

if(increment < num_aux)
{
res=theBuffer[head];
return res;
}
else
{
return 0;
}
}

void GSM3CircularBufferManager::spaceAvailable(){return;};

void GSM3CircularBuffer::flush()
{
head=tail;
}

char* GSM3CircularBuffer::nextString()
{
while(head!=tail)
{
head=(head+1) & __BUFFERMASK__;
if(theBuffer[head]==0)
{
head=(head+1) & __BUFFERMASK__;
return (char*)theBuffer+head;
}
}
return 0;
}


bool GSM3CircularBuffer::locate(const char* reference)
{

return locate(reference, head, tail, 0, 0);
}

bool GSM3CircularBuffer::chopUntil(const char* reference, bool movetotheend, bool usehead)
{
byte from, to;

if(locate(reference, head, tail, &from, &to))
{
if(usehead)
{
if(movetotheend)
head=(to+1) & __BUFFERMASK__;
else
head=from;
}
else
{
if(movetotheend)
tail=(to+1) & __BUFFERMASK__;
else
tail=from;
}
return true;
}
else
{
return false;
}
}

bool GSM3CircularBuffer::locate(const char* reference, byte thishead, byte thistail, byte* from, byte* to)
{
int refcursor=0;
bool into=false;
byte b2, binit;
bool possible=1;

if(reference[0]==0)
return true;

for(byte b1=thishead; b1!=thistail;b1=(b1+1)& __BUFFERMASK__)
{
possible = 1;
b2 = b1;
while (possible&&(b2!=thistail))
{
if(theBuffer[b2]==reference[refcursor])
{
if(!into)
binit=b2;
into=true;
refcursor++;
if(reference[refcursor]==0)
{
if(from)
*from=binit;
if(to)
*to=b2;
return true;
}
}
else if (into==true)
{
possible = 0;
into=false;
refcursor=0;
}
b2=(b2+1)& __BUFFERMASK__;
}
}
return false;
}

bool GSM3CircularBuffer::extractSubstring(const char* from, const char* to, char* buffer, int bufsize)
{
byte t1;
byte h2;
byte b;
int i;

//DEBUG
//Serial.println("Beginning extractSubstring");
//Serial.print("head,tail=");Serial.print(int(head));Serial.print(",");Serial.println(int(tail));

if(!locate(from, head, tail, 0, &t1))
return false;

//DEBUG
//Serial.println("Located chain from.");

t1++; //To point the next.
if(!locate(to, t1, tail, &h2, 0))
return false;

//DEBUG
//Serial.println("Located chain to.");
/*Serial.print("t1=");Serial.println(int(t1));
Serial.print("h2=");Serial.println(int(h2));*/


for(i=0,b=t1;i<bufsize, b!=((h2) & __BUFFERMASK__); i++, b=(b+1)& __BUFFERMASK__)
buffer[i]=theBuffer[b];
buffer[i]=0;

//DEBUG
//Serial.println("");
//Serial.println("Finishing extractSubstring");

return true;
}

int GSM3CircularBuffer::readInt()
{
int res=0;
byte c;
bool anyfound=false;
bool negative=false;
for(byte b=head + 1; b!=tail; b=(b+1)& __BUFFERMASK__)
{
c=theBuffer[b];
if((c==' ' )&&(!anyfound))
{
} else if((c=='-' )&&(!anyfound))
{
negative=true;
anyfound=true; // Don't admit blanks after -
} else if((c>='0')&&(c<='9'))
{
anyfound=true;
res=(res*10)+(int)c-48;
}
else
{
if(negative)
res=(-1)*res;
return res;
}
}
if(negative)
res=(-1)*res;
return res;
}

void GSM3CircularBuffer::debugBuffer()
{
byte h1=head;
byte t1=tail;
Serial.println();
Serial.print(h1);
Serial.print(" ");
Serial.print(t1);
Serial.print('>');
for(byte b=h1; b!=t1; b=(b+1)& __BUFFERMASK__)
printCharDebug(theBuffer[b]);
Serial.println();
}

void GSM3CircularBuffer::printCharDebug(uint8_t c)
{
if((c>31)&&(c<127))
Serial.print((char)c);
else
{
Serial.print('%');
Serial.print(c);
Serial.print('%');
}
}

bool GSM3CircularBuffer::retrieveBuffer(char* buffer, int bufsize, int& SizeWritten)
{
byte b;
int i;

/*for(i=0,b=head;i<bufsize, b!=tail; i++, b=(b+1)& __BUFFERMASK__)
{
buffer[i]=theBuffer[b];
}
buffer[i]=0;
SizeWritten = i;*/
b=head;
for(i=0;i<bufsize; i++)
{
if (b!=tail)
{
buffer[i]=theBuffer[b];
buffer[i+1]=0;
b=(b+1)& __BUFFERMASK__;
SizeWritten = i + 1;
}
}


return true;
}



Loading

0 comments on commit 3ea0903

Please sign in to comment.