/*****************************************************/
/*          ENTER your network parameters            */
var APN = "";
var USERNAME = "";
var PASSWORD = "";
var HTML_PAGE = "http://www.pur3.co.uk/hello.txt";
/******************************************************/


/******************************************************
 * Demo on BRISK L496
 * + C2C board
 *
 * Demo :
 *  Power on the modem
 *  Drive the modem
 *  Connect to cellular network for packet domain
 *  Download a HTML page
 *
 * Usage:
 * Load the code to espruino, then, start modem
 *  > QuectelStart() (or QuectelStart(true) for debug)
 * When you get an IP address, get html page
 *  > GetHtmlPage()
  ******************************************************/


var gprs;

function SimSelect() {
  // SELECTING SIM (external slot)
  digitalWrite("A2",0);    //IO18, SIM select 0
  digitalWrite("C8",0);    //IO18
  digitalWrite("G10",0);   //IO18

  digitalWrite("A7",0);    //I08, SIM select 1
  digitalWrite("D10",0);   //IO8

  // SELECTING SIM (embedded SIM)
  //digitalWrite("A2",1);    //IO18, SIM select 0
  //digitalWrite("C8",1);    //IO18
  //digitalWrite("G10",1);   //IO18

  //digitalWrite("A7",0);    //I08, SIM select 1
  //digitalWrite("D10",0);   //IO8
}

function QuectelStart(debug_quectel, debug_at) {
  // input parameters init
  debug_quectel = debug_quectel || false;
  debug_at = debug_at || false;

  // HW pins (RTS, CTS) setup
  pinMode(D11, "input", true);
  pinMode(D12, "output", true);

  // UART set-up
  // with flow control setup, receive only, managed by SW, MCU side, espruino level
  Serial3.setup(115200, { rx: D9, tx : D8, cts: D12 });

  SimSelect();
  // Connect to modem 
  console.log("Connecting to NW with Quectel UGxx module ... this may take few minutes");
  resetOptions = {
   rst: "A8",
   pwrkey: "A6",
   rst_active_level: 1,
   pwrkey_active_level: 0,
  };
  gprs = require('QUECTEL').connect(Serial3, resetOptions, function(err) {
    console.log("connectCB entered...");
    if (err) throw err;
    whoAmI();
  });
  // Move debug parameters to true to get Quectel/AT debug logs
  gprs.debug(debug_quectel, debug_at);

  // Activate HW flow control (CTS, RTS) at the modem initialization
  gprs.initflowctrl(true);
}

/* Modem info (model, version) */
function whoAmI(){
  if (gprs.at.isBusy()){
    console.log("at module still busy...waiting for 10sec...");
    setTimeout(function cb(){console.log("let's go ahead..."); whoAmI();}, 10000);
  } else {
    // modem info
    gprs.at.cmd("ATI\r\n", 30000, function cb2(d2) {
      if (d2===undefined) {console.log("...timeout...");return;}
      if (d2==='+CME ERROR: 4') {/* dust */return;}
      if (d2==='OK') {console.log(d2);return;}
      else {console.log("Modem: \n" + d2); return cb2;}
    });
    setTimeout(doConnect,30000);
  }
}

/* Trigger PDP context activation (can be required to set the APN the first time you use the Emnify SIM card) */
function doConnect() {
  gprs.connect(APN, USERNAME, PASSWORD, function(err) {
    console.log("gprs.connectCB entered...");
    if (err) throw err;
    onConnected();
  });
}

/* This will launch a quick check of the cellular environment and modem status */
function onConnected (){ 
  gprs.getIP(function(err, ip) {
    if (err) throw err;
    console.log('IP:' + ip);
    GetHtmlPage();
  });
}

function GetHtmlPage(html_page){
  if (html_page) {
    HTML_PAGE = html_page;
  }
  console.log("==> GetHtmlPage");
  require("http").get(HTML_PAGE, function(res) {
    var contents = "";

    console.log("Response: ",res);

    res.on('data', function(d) {
      //console.log("--->"+d);
      contents += d;
    });

    res.on('close', function(d) {
    console.log("Connection closed");
    console.log("full page content ---> "+contents);
    });

  }).on('error', function(e) {
    console.log(E.getErrorFlags());
    console.log("ERROR", e);
  });
}

setTimeout(QuectelStart, 100);
