src: https://github.com/sakuraio/SakuraIOArduino/tree/master/examples/FirmwareUpdate

Dependencies:   SakuraIO mbed

main.cpp

Committer:
sakurafan
Date:
2017-07-24
Revision:
0:ad4eb76f11a0

File content as of revision 0:ad4eb76f11a0:

#include "mbed.h"
#include "SakuraIO.h"

SakuraIO_I2C sakuraio(p28, p27); // sda, scl (mbed LPC1768)

DigitalOut myled(LED1);
Serial pc(USBTX, USBRX);

uint8_t updateFirmware () {
  uint8_t ret;
  char version[33] = {0};

  // Check module
  uint16_t productId = sakuraio.getProductID();
  switch(productId){
    case 0x0001:
      pc.printf("SCM-LTE-Beta\r\n");
      break;
    default:
      pc.printf("Please check connection\r\n");
      return 1;
  }

  wait(1);

  // Waiting for online
  pc.printf("Waiting for online\r\n");
  while (1) {
    pc.printf(".");
    wait(2);
    if((sakuraio.getConnectionStatus() & 0x80) != 0x00){
      break;
    }
  }
  pc.printf("\r\n");
  pc.printf("Online\r\n");

  pc.printf("Get current version\r\n");
  ret = sakuraio.getFirmwareVersion(version);
  if((ret = sakuraio.getFirmwareVersion(version)) != CMD_ERROR_NONE){
    pc.printf("Error code=%d\r\n", ret);
    return 1;
  }
  pc.printf("Current: %s\r\n", version);

  wait(1);

  // Request unlock
  pc.printf("Unlock\r\n");
  if((ret = sakuraio.unlock()) != CMD_ERROR_NONE){
    pc.printf("Error code=%d\r\n", ret);
    return 1;
  }

  wait(1);

  // Request firmware update
  pc.printf("Starting update\r\n");
  if((ret = sakuraio.updateFirmware()) != CMD_ERROR_NONE){
    pc.printf("Error code=%d\r\n", ret);
    return 1;
  }

  wait(1);

  // Check update status
  uint8_t errCode = 0x00;
  pc.printf("Waiting for update\r\n");
  while(1){

    wait(1);
    pc.printf(".");

    uint8_t updateStatus = sakuraio.getFirmwareUpdateStatus();
    if (updateStatus == 0xff || (updateStatus & 0x80) != 0x00) {
      continue;
    } else if (updateStatus == 0x00) {
      // Success
      break;
    } else {
      // Error
      errCode = updateStatus & 0x3f;
      break;
    }
  }

  pc.printf("\r\n");
  switch(errCode){
    case 0x00:
      return 0;
    case 0x01:
      pc.printf("Already updated\r\n");
      return 0;
    default:
      pc.printf("Error code=%d\r\n", errCode);
      break;
  }

  return 1;
}

int main () {

  pc.baud(115200);
  wait(3);
  if (updateFirmware() == 0) {
    pc.printf("Update successfull\r\n");
  } else {
    pc.printf("Update failure\r\n");
  }

  for (;;) {
    myled = !myled;
    wait(0.5);
  }
}