Demo application for using the AT&T IoT Starter Kit Powered by AWS.

Dependencies:   SDFileSystem

Fork of ATT_AWS_IoT_demo by Anthony Phillips

IoT Starter Kit Powered by AWS Demo

This program demonstrates the AT&T IoT Starter Kit sending data directly into AWS IoT. It's explained and used in the Getting Started with the IoT Starter Kit Powered by AWS on starterkit.att.com.

What's required

  • AT&T IoT LTE Add-on (also known as the Cellular Shield)
  • NXP K64F - for programming
  • microSD card - used to store your AWS security credentials
  • AWS account
  • Python, locally installed

If you don't already have an IoT Starter Kit, you can purchase a kit here. The IoT Starter Kit Powered by AWS includes the LTE cellular shield, K64F, and a microSD card.

WNCInterface/WNCInterface.cpp

Committer:
rfinn
Date:
2017-02-07
Revision:
27:2f486c766854
Parent:
23:b9ff83dc965f

File content as of revision 27:2f486c766854:

/* =====================================================================
   Copyright © 2016, Avnet (R)

   Contributors:
     * James M Flynn, www.em.avnet.com 
 
   Licensed under the Apache License, Version 2.0 (the "License"); 
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, 
   software distributed under the License is distributed on an 
   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 
   either express or implied. See the License for the specific 
   language governing permissions and limitations under the License.

    @file          WNCInterface.cpp
    @version       1.0
    @date          Sept 2016
    @author        James Flynn

======================================================================== */


#ifndef __MODULE__
#define __MODULE__ "WNCInterface.cpp"
#endif

#include "WNCInterface.h"

/////////////////////////////////////////////////////
// NXP GPIO Pins that are used to initialize the WNC Shield
/////////////////////////////////////////////////////
DigitalOut  mdm_uart2_rx_boot_mode_sel(PTC17);  // on powerup, 0 = boot mode, 1 = normal boot
DigitalOut  mdm_power_on(PTB9);                 // 0 = turn modem on, 1 = turn modem off (should be held high for >5 seconds to cycle modem)
DigitalOut  mdm_wakeup_in(PTC2);                // 0 = let modem sleep, 1 = keep modem awake -- Note: pulled high on shield
DigitalOut  mdm_reset(PTC12);                   // active high
DigitalOut  shield_3v3_1v8_sig_trans_ena(PTC4); // 0 = disabled (all signals high impedence, 1 = translation active
DigitalOut  mdm_uart1_cts(PTD0);

char * _fatal_err_loc;                          //GLOBAL::holds any error location info
MODSERIAL * _dbgout;
Mutex _WNCLock;

using namespace WncControllerK64F_fk;       // namespace for the controller class use

// Define pin associations for the controller class to use be careful to 
//  keep the order of the pins in the initialization list.
WncGpioPinListK64F wncPinList = { 
    &mdm_uart2_rx_boot_mode_sel,
    &mdm_power_on,
    &mdm_wakeup_in,
    &mdm_reset,
    &shield_3v3_1v8_sig_trans_ena,
    &mdm_uart1_cts
};

static MODSERIAL mdmUart(PTD3,PTD2,256,4096);       //UART for WNC Module

WncControllerK64F *WNCInterface::_pwnc;
WncIpStats WNCInterface::myNetStats;
string WNCInterface::mac;
    
WNCInterface::WNCInterface() {
    _dbgout = NULL;
}

void WNCInterface::doDebug( int v ) {
    //basic debug = 0x01
    //more debug  = 0x02
    //all debug   = 0x03
    M_LOCK;
    _pwnc->enableDebug( (v&1), (v&2) );
    M_ULOCK;
}
    
//
// Power-up the WNC module.  The caller can optionally configure.
// Inputs:
//    apn - Caller can specify an APN. If none is provided will use "m2m.com.attz"
//   debug- specify the amount of debug the WNC controller should output:
//          1 - Basic Debug output
//          2 - Verbose Debug output
//          3 - Full Debug output
// Returns: 0 if unable to initialize the WNC module
//         -1 if successfully initialized
//
int WNCInterface::init(const char* apn, MODSERIAL * debug) {
    int ret = 0;
    
    M_LOCK;
    if( debug ) {
        _dbgout = debug;
        _pwnc = new WncControllerK64F_fk::WncControllerK64F::WncControllerK64F(&wncPinList, &mdmUart, debug);
#if WNC_DEBUG == 1
    _pwnc->enableDebug(1,1);
#endif
        }
    else
        _pwnc = new WncControllerK64F_fk::WncControllerK64F::WncControllerK64F(&wncPinList, &mdmUart, NULL);

    if( apn==NULL )
        apn = APN_DEFAULT;

    ret =  ( _pwnc->powerWncOn(apn,40) )? 2:0;
    ret |= ( _pwnc->setApnName(apn) )? 1:0;
    ret |= ( _pwnc->getWncNetworkingStats(&myNetStats) )? 4:0;
    M_ULOCK;
    
    return ret;
}

//
// check to see if we are connected to the internet or not. The 
// connection is supposed to happen during init.  If we are
// connected to the internet return 0 otherwise return -1
//
int WNCInterface::connect(void) {
    return ( _pwnc->getWncStatus() == WNC_GOOD )? 0 : -1;
}

//
// ok, the user wants to disconnect.  At present, this isn't possible
// with the WNC, so just fake it and say we did...
//
int WNCInterface::disconnect() {
    return 0;
}

//
// update the networking stats and return the IP Address
//
char * WNCInterface::getIPAddress() {
    M_LOCK;
    if ( _pwnc->getWncNetworkingStats(&myNetStats) ) {
        CHK_WNCFE(( WNCInterface::_pwnc->getWncStatus() == FATAL_FLAG ), null);
        M_ULOCK;
        return &myNetStats.ip[0];
    }
    M_ULOCK;
    return NULL;
}

//
// update the networking stats and return the Gateway Address
//
char * WNCInterface::getGateway() {
    M_LOCK;
    if ( _pwnc->getWncNetworkingStats(&myNetStats) ) {
        CHK_WNCFE(( WNCInterface::_pwnc->getWncStatus() == FATAL_FLAG ), null);
        M_ULOCK;
        return &WNCInterface::myNetStats.gateway[0];
    }
    M_ULOCK;
    return NULL;
}

//
// update the networking stats and return the Network Mask
//
char * WNCInterface::getNetworkMask() {
    M_LOCK;
    if ( _pwnc->getWncNetworkingStats(&myNetStats) ) {
        CHK_WNCFE(( WNCInterface::_pwnc->getWncStatus() == FATAL_FLAG ), null);
        M_ULOCK;    
        return &WNCInterface::myNetStats.mask[0];
    }
    M_ULOCK;    
    return NULL;
}

//
// return a pesudo-MAC address created from the ICCID
//
char* WNCInterface::getMACAddress( void ) {
    string str;
    
    M_LOCK;
    if( _pwnc->getICCID(&str) ) {
        CHK_WNCFE(( WNCInterface::_pwnc->getWncStatus() == FATAL_FLAG ), null);
        mac = str.substr(3,20);
        mac[2]=mac[5]=mac[8]=mac[11]=mac[14]=':';
        M_ULOCK;
        return (char*)mac.c_str();
    }
    M_ULOCK;
    return NULL;
}

//
// return the ICCID
//
void WNCInterface::getICCID(string *str) {
    _pwnc->getICCID(str);
}