Official reference client implementation for Cumulocity SmartREST on u-blox C027.

Dependencies:   C027_Support C12832 LM75B MMA7660 MbedSmartRest mbed-rtos mbed

Fork of MbedSmartRestMain by Vincent Wochnik

Committer:
xinlei
Date:
Mon Apr 27 13:02:50 2015 +0000
Revision:
97:ea056f6be2e8
Parent:
96:5dfdc8568e9f
Child:
98:9f2de96941c4
MDMSerial now singleton

Who changed what in which revision?

UserRevisionLine numberNew contents of line
xinlei 72:c5709ae7b193 1 #include <stdio.h>
xinlei 72:c5709ae7b193 2
Cumulocity 41:804f6a0bda26 3 #include "mbed.h"
Cumulocity 41:804f6a0bda26 4 #include "rtos.h"
Cumulocity 41:804f6a0bda26 5 #include "MDM.h"
Cumulocity 47:89ae46d5c466 6 #include "GPS.h"
Cumulocity 41:804f6a0bda26 7 #include "DeviceInfo.h"
vwochnik 67:c360a2b2c948 8 #include "DeviceMemory.h"
Cumulocity 41:804f6a0bda26 9 #include "MbedAgent.h"
Cumulocity 47:89ae46d5c466 10 #include "GPSTracker.h"
vwochnik 68:0dc778a16d0d 11 #include "DeviceConfiguration.h"
xinlei 96:5dfdc8568e9f 12 #include "LCDDisplay.h"
xinlei 72:c5709ae7b193 13 #include "logging.h"
vwochnik 67:c360a2b2c948 14
vwochnik 52:8f1370084268 15 /**
vwochnik 52:8f1370084268 16 * SIM PIN. Null for no pin.
vwochnik 52:8f1370084268 17 */
vwochnik 52:8f1370084268 18 #define SIM_PIN NULL
vwochnik 52:8f1370084268 19
vwochnik 52:8f1370084268 20 /**
vwochnik 52:8f1370084268 21 * SIM GPRS login data. Leave commented out for automatic setting.
vwochnik 52:8f1370084268 22 */
vwochnik 52:8f1370084268 23 //#define SIM_APN ""
vwochnik 52:8f1370084268 24 //#define SIM_USER ""
vwochnik 52:8f1370084268 25 //#define SIM_PASS ""
xinlei 97:ea056f6be2e8 26 //MDMRtos<MDMSerial> *pMdm;
xinlei 97:ea056f6be2e8 27 MDMSerial* pMdm;
vwochnik 52:8f1370084268 28
xinlei 93:0acd11870c6a 29 unsigned short getMNCLen(const char *imsi)
xinlei 93:0acd11870c6a 30 {
xinlei 80:757c3ff7b92b 31 if (strncmp(imsi, "310", 3) != 0) // Non American ISMI
xinlei 80:757c3ff7b92b 32 return 2;
xinlei 80:757c3ff7b92b 33 else
xinlei 80:757c3ff7b92b 34 return 3;
xinlei 80:757c3ff7b92b 35 }
xinlei 80:757c3ff7b92b 36
xinlei 93:0acd11870c6a 37 void enableDebug()
xinlei 93:0acd11870c6a 38 {
xinlei 93:0acd11870c6a 39 setLevel(A_DEBUG);
xinlei 93:0acd11870c6a 40 if (pMdm)
xinlei 93:0acd11870c6a 41 pMdm->setDebug(3);
xinlei 93:0acd11870c6a 42 }
xinlei 93:0acd11870c6a 43
xinlei 93:0acd11870c6a 44 void disableDebug()
xinlei 93:0acd11870c6a 45 {
xinlei 93:0acd11870c6a 46 setLevel(A_NONE);
xinlei 93:0acd11870c6a 47 if (pMdm)
xinlei 93:0acd11870c6a 48 pMdm->setDebug(-1);
xinlei 93:0acd11870c6a 49 }
xinlei 93:0acd11870c6a 50
vwochnik 0:ed4d6fd405ea 51 int main()
vwochnik 0:ed4d6fd405ea 52 {
xinlei 94:61d44636f020 53 set_time(1256729737);
xinlei 94:61d44636f020 54 openRelay();
xinlei 93:0acd11870c6a 55 MDMRtos<MDMSerial> mdm;
xinlei 93:0acd11870c6a 56 pMdm = &mdm;
xinlei 93:0acd11870c6a 57 InterruptIn joystickUp(A2);
xinlei 93:0acd11870c6a 58 InterruptIn joystickDown(A3);
Cumulocity 41:804f6a0bda26 59 MDMParser::DevStatus devStatus;
Cumulocity 47:89ae46d5c466 60 GPSI2C gps;
xinlei 96:5dfdc8568e9f 61 LCDDisplay::inst().setLines("Mbed Agent V2.1rc2", getHost());
xinlei 76:b07effe83fb8 62 if (!mdm.init(SIM_PIN, &devStatus)) {
xinlei 96:5dfdc8568e9f 63 LCDDisplay::inst().setLines("Modem Init Failure", "No SIM card found", "Or SIM has PIN");
xinlei 88:b1de34154513 64 mdm.disconnect();
xinlei 88:b1de34154513 65 mdm.powerOff();
xinlei 88:b1de34154513 66 return 1;
xinlei 93:0acd11870c6a 67 } else if (!gps.init()) {
xinlei 96:5dfdc8568e9f 68 LCDDisplay::inst().setLines("GPS Init Failure");
xinlei 93:0acd11870c6a 69 mdm.disconnect();
xinlei 93:0acd11870c6a 70 mdm.powerOff();
xinlei 93:0acd11870c6a 71 return 2;
xinlei 88:b1de34154513 72 }
xinlei 93:0acd11870c6a 73 joystickUp.rise(&enableDebug);
xinlei 93:0acd11870c6a 74 joystickDown.rise(&disableDebug);
xinlei 93:0acd11870c6a 75
xinlei 97:ea056f6be2e8 76 DeviceMemory deviceMemory;
xinlei 93:0acd11870c6a 77 DigitalIn fireButton(D4);
xinlei 90:0525121f307e 78
xinlei 93:0acd11870c6a 79 if (fireButton) {
xinlei 96:5dfdc8568e9f 80 LCDDisplay::inst().setLines("Factory Reset");
xinlei 90:0525121f307e 81 if (deviceMemory.resetPlatformCredentials()) {
xinlei 96:5dfdc8568e9f 82 LCDDisplay::inst().setLines("Reset Success");
xinlei 93:0acd11870c6a 83 } else {
xinlei 96:5dfdc8568e9f 84 LCDDisplay::inst().setLines("Reset Failure");
xinlei 88:b1de34154513 85 }
xinlei 93:0acd11870c6a 86 mdm.disconnect();
xinlei 93:0acd11870c6a 87 mdm.powerOff();
xinlei 90:0525121f307e 88 Thread::wait(1000);
xinlei 90:0525121f307e 89 return 0;
xinlei 90:0525121f307e 90 }
xinlei 93:0acd11870c6a 91 aInfo("Main Thread: %p\r\n", Thread::gettid());
xinlei 96:5dfdc8568e9f 92 LCDDisplay::inst().setLines("Register Network...", "IMEI", devStatus.imei);
Cumulocity 41:804f6a0bda26 93 if (!mdm.registerNet()) {
xinlei 96:5dfdc8568e9f 94 LCDDisplay::inst().setLines("No Network Coverage");
xinlei 93:0acd11870c6a 95 mdm.disconnect();
xinlei 93:0acd11870c6a 96 mdm.powerOff();
xinlei 93:0acd11870c6a 97 return 3;
vwochnik 28:2004400abeec 98 }
vwochnik 28:2004400abeec 99
xinlei 96:5dfdc8568e9f 100 LCDDisplay::inst().setLines("Join Network");
vwochnik 52:8f1370084268 101 #ifdef SIM_APN
vwochnik 52:8f1370084268 102 if (mdm.join(SIM_APN, SIM_USER, SIM_PASS) == NOIP) {
vwochnik 55:a0f7295ed6b6 103 #else
vwochnik 55:a0f7295ed6b6 104 if (mdm.join() == NOIP) {
vwochnik 55:a0f7295ed6b6 105 #endif
xinlei 93:0acd11870c6a 106 char s[8] = "Unknown";
xinlei 80:757c3ff7b92b 107 const char *p = devStatus.imsi;
xinlei 80:757c3ff7b92b 108 if (p) {
xinlei 80:757c3ff7b92b 109 snprintf(s, sizeof(s), "%.*s-%.*s", 3, p, getMNCLen(p), p+3);
xinlei 80:757c3ff7b92b 110 }
xinlei 96:5dfdc8568e9f 111 LCDDisplay::inst().setLines("Wrong APN Settting", "MCC-MNC:", s);
xinlei 93:0acd11870c6a 112 mdm.disconnect();
xinlei 93:0acd11870c6a 113 mdm.powerOff();
xinlei 93:0acd11870c6a 114 return 4;
vwochnik 52:8f1370084268 115 }
xinlei 93:0acd11870c6a 116
vwochnik 52:8f1370084268 117 {
xinlei 97:ea056f6be2e8 118 DeviceInfo deviceInfo(devStatus);
xinlei 97:ea056f6be2e8 119 MbedAgent agent(gps, deviceInfo, deviceMemory);
xinlei 93:0acd11870c6a 120
xinlei 96:5dfdc8568e9f 121 LCDDisplay::inst().setLines("Agent Init");
vwochnik 52:8f1370084268 122 if (!agent.init()) {
xinlei 93:0acd11870c6a 123 mdm.disconnect();
xinlei 93:0acd11870c6a 124 mdm.powerOff();
xinlei 93:0acd11870c6a 125 return 5;
vwochnik 52:8f1370084268 126 }
xinlei 96:5dfdc8568e9f 127 LCDDisplay::inst().setLines("Agent Run");
xinlei 93:0acd11870c6a 128 int ret = 0;
xinlei 93:0acd11870c6a 129 for (uint8_t tries = 3; tries; --tries) {
xinlei 93:0acd11870c6a 130 ret = agent.run();
xinlei 96:5dfdc8568e9f 131 if (ret == 0) {
xinlei 96:5dfdc8568e9f 132 char status[27];
xinlei 96:5dfdc8568e9f 133 const char* user= getUsername();
xinlei 96:5dfdc8568e9f 134 int len = strchr(user, '/')-user+sizeof("Tenant: ");
xinlei 96:5dfdc8568e9f 135 len = len <= 27 ? len : 27;
xinlei 96:5dfdc8568e9f 136 snprintf(status, len, "Tenant: %s", user);
xinlei 96:5dfdc8568e9f 137 LCDDisplay::inst().setFirstLine(status);
vwochnik 52:8f1370084268 138 break;
xinlei 96:5dfdc8568e9f 139 }
xinlei 93:0acd11870c6a 140 }
Cumulocity 41:804f6a0bda26 141
xinlei 93:0acd11870c6a 142 switch (ret) {
xinlei 96:5dfdc8568e9f 143 case -1: LCDDisplay::inst().setLines("Bootstrap error"); break;
xinlei 96:5dfdc8568e9f 144 case -2: LCDDisplay::inst().setLines("Integrate failure"); break;
xinlei 96:5dfdc8568e9f 145 case -3: LCDDisplay::inst().setLines("Config sync failure"); break;
xinlei 93:0acd11870c6a 146 default: agent.loop();
Cumulocity 41:804f6a0bda26 147 }
xinlei 93:0acd11870c6a 148 mdm.disconnect();
xinlei 93:0acd11870c6a 149 mdm.powerOff();
xinlei 93:0acd11870c6a 150 return ret;
vwochnik 52:8f1370084268 151 }
vwochnik 4:363b4cc49445 152 }