Sample program for communicating with Fujitsuu IoT Platform using HTTP

Dependencies:   AsciiFont GR-PEACH_video GraphicsFramework LCD_shield_config R_BSP USBHost_custom easy-connect-gr-peach mbed-http picojson BM1383GLV KX022 rohm-sensor-hal rohm-bh1745

Overview

This sample program shows how to send the cognitive data and sensing data gathered by Omron HVC-P2 and Rohm Sensor Shield respectively to IoT Platform managed by FUJITSU ( http://jp.fujitsu.com/solutions/cloud/k5/function/paas/iot-platform/ ).

Required Hardware

Application Setup

  1. Configure the connection type. For details, please refer to the following link:
    https://developer.mbed.org/teams/Renesas/code/GR-PEACH_IoT_Platform_HTTP_sample/wiki/Connection-Type
  2. Configure Ethernet settings. For details, please refer to the following link:
    https://developer.mbed.org/teams/Renesas/code/GR-PEACH_IoT_Platform_HTTP_sample/wiki/Ethernet-settings
  3. Set up the Access Code of resource where the gathered data would be stored. For details on Access Code, please refer to the following links:
    https://iot-docs.jp-east-1.paas.cloud.global.fujitsu.com/en/manual/userguide_en.pdf
    https://iot-docs.jp-east-1.paas.cloud.global.fujitsu.com/en/manual/apireference_en.pdf
    https://iot-docs.jp-east-1.paas.cloud.global.fujitsu.com/en/manual/portalmanual_en.pdf
  4. Set up URI for the resource where the gathered data would be stored. For details, please refer to the following link:
    https://iot-docs.jp-east-1.paas.cloud.global.fujitsu.com/en/manual/userguide_en.pdf
    https://iot-docs.jp-east-1.paas.cloud.global.fujitsu.com/en/manual/apireference_en.pdf

Building Example

  1. Import this sample program onto mbed Compiler
  2. Configure the program in accordance with the description of Application Setup above
  3. Compile the sample program
  4. Plug the Ethernet cable into GR-PEACH if you would like Ethernet mode
  5. Plug micro-USB cable into the OpenSDA port which lies on the next to the RESET button
  6. Copy the binary previously downloaded to your PC to GR-PEACH in order to flash this program. When the copy is successfully completed, the drive named MBED should be re-mounted automatically
  7. Press the RESET button on the board to run the sample application

Data Format sent to IoT Platform

In this sample program, the cognitive data and sensing data are serialized into the following JSON format using picojson (https://developer.mbed.org/users/mimil/code/picojson/):

  • Face detection data

{
    "RecordType": "HVC-P2(face)",
    "id": "<GR-PEACH ID>-<Sensor ID>",
    "Age": xxx,
    "FaceRectangle": {
        "Height": xxx,
        "Left": xxx,
        "Top": xxx,
        "Width": xxx
    },
    "Gender": xxx,
    "Scores": {
        "Anger": xxx,
        "Happiness": xxx,
        "Neutral": xxx,
        "Sadness": xxx,
        "Surprise": xxx
    }
}
  • Body detection data

{
    "RecodeType": "HVC-P2(body)",
    "id": "<GR-PEACH ID>-<Sensor ID>",
    "BodyRectangle": {
        "Height": xxx,
        "Left": xxx,
        "Top": xxx,
        "Width": xxx
    }
}
  • Accelerometer data

{
    "RecodeType": "Accelerometer",
    "id": "<GR-PEACH ID>-<Sensor ID>",
    "data": [ acceleratoin(x-direction), acceleration(y-direction), acceleration(z-direction), null, null, null ]
}

Note that data[0], data[1] and data[2] are filled with the acceleration data in x, y and z direction respectively, and the remaining elements are filled with null.

  • Atmosphere data

{
    "RecodeType": "Atmosphere",
    "id": "<GR-PEACH ID>-<Sensor ID>",
    "data": [ atmosphere data, null, null, null, null, null ]
}

Note that data[0] is filled with atmosphere data, and the remaining elements are filled with null.

  • Color sensor data

{
    "RecodeType": "Color",
    "id": "<GR-PEACH ID>-<Sensor ID>",
    "data": [ Red, Green, Blue, Alpha, null, null]
}

Note that data[0], data[1], data[2] and data[3] are filled with Red, Green, Blue and Alpha elements of color respectively, and the remaining elements are filled with null.

  • Temperature data

{
    "RecodeType": "Temperature",
    "id": "<GR-PEACH ID>-<Sensor ID>",
    "data": [ Temperature, null, null, null, null, null ]
}

Note that data[0] is filled with temperature data, the remaining elements are filled with null.

  • Geomagnetism

{
    "RecodeType": "Geomagnetism",
    "id": "<GR-PEACH ID>-<Sensor ID>",
    "data": [ geomagnetism(x-direction), geomagnetism(y-direction), geomagnetism(z-direction), null, null, null]
}

Note that data[0], data[1] and data[2] are filled with the geomagnetism data in x, y and z direction respectively, and the remaining elements are filled with null.

Committer:
Osamu Nakamura
Date:
Thu Apr 12 19:04:23 2018 +0900
Revision:
7:9ae73f85dc04
Parent:
6:ff12fc4d75f0
Update BM1422AGMV driver so that it can be compiled by ARMCC

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Osamu Nakamura 0:8373b6833bde 1 #include "mbed.h"
Osamu Nakamura 0:8373b6833bde 2 #include "picojson.h"
Osamu Nakamura 0:8373b6833bde 3 #include "select-demo.h"
Osamu Nakamura 0:8373b6833bde 4 #include "iot_platform.h"
Osamu Nakamura 0:8373b6833bde 5 #include <string>
Osamu Nakamura 0:8373b6833bde 6 #include <iostream>
Osamu Nakamura 0:8373b6833bde 7 #include <vector>
Osamu Nakamura 0:8373b6833bde 8 #include "BM1383GLV.h"
Osamu Nakamura 0:8373b6833bde 9 #include "KX022.h"
Osamu Nakamura 0:8373b6833bde 10 #include "BH1745NUC.h"
Osamu Nakamura 0:8373b6833bde 11 #include "bh1745_driver.h"
Osamu Nakamura 0:8373b6833bde 12 #include "I2CCommon.h"
Osamu Nakamura 6:ff12fc4d75f0 13 #include "BM1422AGMV.h"
Osamu Nakamura 0:8373b6833bde 14
Osamu Nakamura 0:8373b6833bde 15 #if DEMO == DEMO_HTTP
Osamu Nakamura 0:8373b6833bde 16 #include "easy-connect.h"
Osamu Nakamura 0:8373b6833bde 17 #include "http_request.h"
Osamu Nakamura 0:8373b6833bde 18 #include "NTPClient.h"
Osamu Nakamura 0:8373b6833bde 19 #include <time.h>
Osamu Nakamura 0:8373b6833bde 20
Osamu Nakamura 0:8373b6833bde 21 /* Detect result */
Osamu Nakamura 0:8373b6833bde 22 result_hvcp2_fd_t result_hvcp2_fd[DETECT_MAX];
Osamu Nakamura 0:8373b6833bde 23 result_hvcp2_bd_t result_hvcp2_bd[DETECT_MAX];
Osamu Nakamura 0:8373b6833bde 24 uint32_t result_hvcp2_bd_cnt;
Osamu Nakamura 0:8373b6833bde 25 uint32_t result_hvcp2_fd_cnt;
Osamu Nakamura 0:8373b6833bde 26
Osamu Nakamura 0:8373b6833bde 27 Timer http_resp_time; // response time
Osamu Nakamura 6:ff12fc4d75f0 28 uint16_t data[4]; // for color data
Osamu Nakamura 6:ff12fc4d75f0 29 float magne[3]; // for geomagnetism data
Osamu Nakamura 0:8373b6833bde 30
Osamu Nakamura 0:8373b6833bde 31 BM1383GLV sensor_BM(I2C_SDA, I2C_SCL); // Atmosphere
Osamu Nakamura 6:ff12fc4d75f0 32 KX022 *sensor_acc; // Accelerometer
Osamu Nakamura 6:ff12fc4d75f0 33 BM1422AGMV sensor_magne(I2C_SDA, I2C_SCL); // Geomagnetism
Osamu Nakamura 0:8373b6833bde 34
Osamu Nakamura 0:8373b6833bde 35 #define JST_OFFSET 9
Osamu Nakamura 0:8373b6833bde 36
Osamu Nakamura 2:a191fff7103b 37 #define ACCESS_CODE <Access CODE>
Osamu Nakamura 2:a191fff7103b 38 #error "You need to replace <Access CODE for your resource> with yours"
Osamu Nakamura 0:8373b6833bde 39
Osamu Nakamura 5:2a16f2a5bd02 40 std::string put_uri_base("<Base URI>/v1/<Tenant ID>/<Path-to-Resource>.json");
Osamu Nakamura 0:8373b6833bde 41 #error "You need to replace <Base URI>, <Tenant ID> and <Path-to-Resource> with yours"
Osamu Nakamura 0:8373b6833bde 42
Osamu Nakamura 0:8373b6833bde 43 std::string put_uri;
Osamu Nakamura 0:8373b6833bde 44
Osamu Nakamura 0:8373b6833bde 45 // json-object for camera
Osamu Nakamura 0:8373b6833bde 46 picojson::object o_bd[DETECT_MAX], o_fd[DETECT_MAX], o_fr[DETECT_MAX], o_scr[DETECT_MAX];
Osamu Nakamura 0:8373b6833bde 47 // json-object for sensor
Osamu Nakamura 6:ff12fc4d75f0 48 picojson::object o_acc, o_atmo, o_col, o_temp, o_magne;
Osamu Nakamura 0:8373b6833bde 49
Osamu Nakamura 0:8373b6833bde 50 picojson::array data_array_acc(6);
Osamu Nakamura 0:8373b6833bde 51 picojson::array data_array_atmo(6);
Osamu Nakamura 0:8373b6833bde 52 picojson::array data_array_col(6);
Osamu Nakamura 0:8373b6833bde 53 picojson::array data_array_temp(6);
Osamu Nakamura 6:ff12fc4d75f0 54 picojson::array data_array_magne(6);
Osamu Nakamura 0:8373b6833bde 55
Osamu Nakamura 0:8373b6833bde 56 // URI for GET request
Osamu Nakamura 0:8373b6833bde 57 std::string get_uri("<Base URI>/v1/<Tenant ID>/<Path-to-Resource>/_past.json");
Osamu Nakamura 0:8373b6833bde 58 #error "You need to replace <Base URI>, <Tenant ID> and <Path-to-Resource> with yours"
Osamu Nakamura 0:8373b6833bde 59
Osamu Nakamura 0:8373b6833bde 60 void dump_response(HttpResponse* res)
Osamu Nakamura 0:8373b6833bde 61 {
Osamu Nakamura 0:8373b6833bde 62 DEBUG_PRINT("Status: %d - %s\n", res->get_status_code(),
Osamu Nakamura 0:8373b6833bde 63 res->get_status_message().c_str());
Osamu Nakamura 0:8373b6833bde 64
Osamu Nakamura 0:8373b6833bde 65 DEBUG_PRINT("Headers:\n");
Osamu Nakamura 0:8373b6833bde 66 for (size_t ix = 0; ix < res->get_headers_length(); ix++) {
Osamu Nakamura 0:8373b6833bde 67 DEBUG_PRINT("\t%s: %s\n", res->get_headers_fields()[ix]->c_str(),
Osamu Nakamura 0:8373b6833bde 68 res->get_headers_values()[ix]->c_str());
Osamu Nakamura 0:8373b6833bde 69 }
Osamu Nakamura 0:8373b6833bde 70 DEBUG_PRINT("\nBody (%d bytes):\n\n%s\n", res->get_body_length(),
Osamu Nakamura 0:8373b6833bde 71 res->get_body_as_string().c_str());
Osamu Nakamura 0:8373b6833bde 72 }
Osamu Nakamura 0:8373b6833bde 73
Osamu Nakamura 2:a191fff7103b 74 std::string create_put_uri(std::string uri_base)
Osamu Nakamura 2:a191fff7103b 75 {
Osamu Nakamura 2:a191fff7103b 76 time_t ctTime;
Osamu Nakamura 2:a191fff7103b 77 struct tm *pnow;
Osamu Nakamura 2:a191fff7103b 78 char date_and_hour[50];
Osamu Nakamura 2:a191fff7103b 79 std::string uri;
Osamu Nakamura 2:a191fff7103b 80
Osamu Nakamura 2:a191fff7103b 81 ctTime = time(NULL);
Osamu Nakamura 2:a191fff7103b 82 pnow = localtime(&ctTime);
Osamu Nakamura 2:a191fff7103b 83 sprintf(date_and_hour, "?$date=%04d%02d%02dT%02d%02d%02d.000%%2B%02d00",
Osamu Nakamura 2:a191fff7103b 84 (pnow->tm_year + 1900), (pnow->tm_mon + 1), pnow->tm_mday,
Osamu Nakamura 2:a191fff7103b 85 (pnow->tm_hour + JST_OFFSET - pnow->tm_isdst), pnow->tm_min,
Osamu Nakamura 2:a191fff7103b 86 pnow->tm_sec, (JST_OFFSET - pnow->tm_isdst));
Osamu Nakamura 2:a191fff7103b 87
Osamu Nakamura 2:a191fff7103b 88 uri = uri_base + date_and_hour;
Osamu Nakamura 2:a191fff7103b 89
Osamu Nakamura 2:a191fff7103b 90 return(uri);
Osamu Nakamura 2:a191fff7103b 91 }
Osamu Nakamura 2:a191fff7103b 92
Osamu Nakamura 0:8373b6833bde 93 int iot_put(NetworkInterface *network, picojson::object o4)
Osamu Nakamura 0:8373b6833bde 94 {
Osamu Nakamura 0:8373b6833bde 95
Osamu Nakamura 2:a191fff7103b 96 #ifdef ENABLED_NTP
Osamu Nakamura 2:a191fff7103b 97 put_uri = create_put_uri(put_uri_base);
Osamu Nakamura 2:a191fff7103b 98 #else
Osamu Nakamura 2:a191fff7103b 99 put_uri = put_uri_base;
Osamu Nakamura 2:a191fff7103b 100 #endif // ENABLED_NTP
Osamu Nakamura 2:a191fff7103b 101
Osamu Nakamura 0:8373b6833bde 102 // PUT request to IoT Platform
Osamu Nakamura 0:8373b6833bde 103 HttpRequest* put_req = new HttpRequest(network, HTTP_PUT, put_uri.c_str());
Osamu Nakamura 3:0eaa47c59bb3 104 put_req->set_header("Authorization", ACCESS_CODE);
Osamu Nakamura 0:8373b6833bde 105
Osamu Nakamura 0:8373b6833bde 106 picojson::value v_all(o4);
Osamu Nakamura 0:8373b6833bde 107
Osamu Nakamura 0:8373b6833bde 108 std::string body = v_all.serialize();
Osamu Nakamura 0:8373b6833bde 109
Osamu Nakamura 0:8373b6833bde 110 HttpResponse* put_res = put_req->send(body.c_str(), body.length());
Osamu Nakamura 0:8373b6833bde 111
Osamu Nakamura 0:8373b6833bde 112 if (!put_res) {
Osamu Nakamura 0:8373b6833bde 113 DEBUG_PRINT("HttpRequest failed (error code %d)\n", put_req->get_error());
Osamu Nakamura 0:8373b6833bde 114 return 1;
Osamu Nakamura 0:8373b6833bde 115 }
Osamu Nakamura 0:8373b6833bde 116
Osamu Nakamura 0:8373b6833bde 117 delete put_req;
Osamu Nakamura 0:8373b6833bde 118 return 0;
Osamu Nakamura 0:8373b6833bde 119 }
Osamu Nakamura 0:8373b6833bde 120
Osamu Nakamura 0:8373b6833bde 121 int iot_get(NetworkInterface *network)
Osamu Nakamura 0:8373b6833bde 122 {
Osamu Nakamura 0:8373b6833bde 123 // Do GET request to IoT Platform
Osamu Nakamura 0:8373b6833bde 124 // By default the body is automatically parsed and stored in a buffer, this is memory heavy.
Osamu Nakamura 0:8373b6833bde 125 // To receive chunked response, pass in a callback as last parameter to the constructor.
Osamu Nakamura 0:8373b6833bde 126 HttpRequest* get_req = new HttpRequest(network, HTTP_GET, get_uri.c_str());
Osamu Nakamura 3:0eaa47c59bb3 127 get_req->set_header("Authorization", ACCESS_CODE);
Osamu Nakamura 0:8373b6833bde 128
Osamu Nakamura 0:8373b6833bde 129 HttpResponse* get_res = get_req->send();
Osamu Nakamura 0:8373b6833bde 130
Osamu Nakamura 0:8373b6833bde 131 if (!get_res) {
Osamu Nakamura 0:8373b6833bde 132 DEBUG_PRINT("HttpRequest failed (error code %d)\n", get_req->get_error());
Osamu Nakamura 0:8373b6833bde 133 return 1;
Osamu Nakamura 0:8373b6833bde 134 }
Osamu Nakamura 0:8373b6833bde 135
Osamu Nakamura 0:8373b6833bde 136 DEBUG_PRINT("\n----- HTTP GET response -----\n");
Osamu Nakamura 0:8373b6833bde 137
Osamu Nakamura 0:8373b6833bde 138 delete get_req;
Osamu Nakamura 0:8373b6833bde 139
Osamu Nakamura 0:8373b6833bde 140 return 0;
Osamu Nakamura 0:8373b6833bde 141 }
Osamu Nakamura 0:8373b6833bde 142 #endif // DEMO == DEMO_HTTP
Osamu Nakamura 0:8373b6833bde 143
Osamu Nakamura 0:8373b6833bde 144 void read_color(void)
Osamu Nakamura 0:8373b6833bde 145 {
Osamu Nakamura 0:8373b6833bde 146 bool error;
Osamu Nakamura 0:8373b6833bde 147 I2CCommonBegin();
Osamu Nakamura 0:8373b6833bde 148 bh1745_wait_until_found();
Osamu Nakamura 0:8373b6833bde 149 bh1745_initial_setup();
Osamu Nakamura 0:8373b6833bde 150 error = bh1745_read_data(&data[0]);
Osamu Nakamura 2:a191fff7103b 151 MBED_ASSERT(error==0);
Osamu Nakamura 0:8373b6833bde 152 }
Osamu Nakamura 0:8373b6833bde 153
Osamu Nakamura 6:ff12fc4d75f0 154 void get_geomagnetism_value(void)
Osamu Nakamura 6:ff12fc4d75f0 155 {
Osamu Nakamura 6:ff12fc4d75f0 156 sensor_magne.get_val(magne);
Osamu Nakamura 6:ff12fc4d75f0 157 }
Osamu Nakamura 6:ff12fc4d75f0 158
Osamu Nakamura 0:8373b6833bde 159 int send_sensor_info(NetworkInterface *network)
Osamu Nakamura 0:8373b6833bde 160 {
Osamu Nakamura 0:8373b6833bde 161
Osamu Nakamura 0:8373b6833bde 162 /* Type */
Osamu Nakamura 0:8373b6833bde 163 o_acc["RecordType"] = picojson::value((string)"Accelerometer");
Osamu Nakamura 0:8373b6833bde 164 o_atmo["RecordType"] = picojson::value((string)"Atmosphere");
Osamu Nakamura 0:8373b6833bde 165 o_col["RecordType"] = picojson::value((string)"Color");
Osamu Nakamura 0:8373b6833bde 166 o_temp["RecordType"] = picojson::value((string)"Temperature");
Osamu Nakamura 6:ff12fc4d75f0 167 o_magne["RecordType"] = picojson::value((string)"Geomagnetism");
Osamu Nakamura 0:8373b6833bde 168
Osamu Nakamura 0:8373b6833bde 169 /* ID */
Osamu Nakamura 0:8373b6833bde 170 o_acc["id"] = picojson::value((string)"0001-0001");
Osamu Nakamura 0:8373b6833bde 171 o_atmo["id"] = picojson::value((string)"0001-0002");
Osamu Nakamura 0:8373b6833bde 172 o_col["id"] = picojson::value((string)"0001-0003");
Osamu Nakamura 0:8373b6833bde 173 o_temp["id"] = picojson::value((string)"0001-0004");
Osamu Nakamura 6:ff12fc4d75f0 174 o_magne["id"] = picojson::value((string)"0001-0005");
Osamu Nakamura 0:8373b6833bde 175
Osamu Nakamura 0:8373b6833bde 176 /* Accelerometer data array */
Osamu Nakamura 6:ff12fc4d75f0 177 data_array_acc[0] = picojson::value((double)sensor_acc->getAccX());
Osamu Nakamura 6:ff12fc4d75f0 178 data_array_acc[1] = picojson::value((double)sensor_acc->getAccY());
Osamu Nakamura 6:ff12fc4d75f0 179 data_array_acc[2] = picojson::value((double)sensor_acc->getAccZ());
Osamu Nakamura 0:8373b6833bde 180
Osamu Nakamura 0:8373b6833bde 181 /* Atmosphere data array */
Osamu Nakamura 0:8373b6833bde 182 data_array_atmo[0] = picojson::value((double)sensor_BM.getPressure());
Osamu Nakamura 0:8373b6833bde 183
Osamu Nakamura 0:8373b6833bde 184 /* Color data array */
Osamu Nakamura 0:8373b6833bde 185 read_color();
Osamu Nakamura 0:8373b6833bde 186 for(int i = 0; i < 4; i++) {
Osamu Nakamura 0:8373b6833bde 187 data_array_col[i] = picojson::value(picojson::value((double)data[i]));
Osamu Nakamura 0:8373b6833bde 188 }
Osamu Nakamura 0:8373b6833bde 189
Osamu Nakamura 0:8373b6833bde 190 /* Temperature data array */
Osamu Nakamura 0:8373b6833bde 191 data_array_temp[0] = picojson::value((double)sensor_BM.getTemperature());
Osamu Nakamura 0:8373b6833bde 192
Osamu Nakamura 6:ff12fc4d75f0 193 /* Geomagnetism data array */
Osamu Nakamura 6:ff12fc4d75f0 194 get_geomagnetism_value();
Osamu Nakamura 6:ff12fc4d75f0 195 for(int i = 0; i < 3; i++) {
Osamu Nakamura 6:ff12fc4d75f0 196 data_array_magne[i] = picojson::value(picojson::value((double)magne[i]));
Osamu Nakamura 6:ff12fc4d75f0 197 }
Osamu Nakamura 6:ff12fc4d75f0 198
Osamu Nakamura 0:8373b6833bde 199 /* Combine data array with object. */
Osamu Nakamura 0:8373b6833bde 200 o_acc["data"] = picojson::value(data_array_acc);
Osamu Nakamura 0:8373b6833bde 201 o_atmo["data"] = picojson::value(data_array_atmo);
Osamu Nakamura 0:8373b6833bde 202 o_col["data"] = picojson::value(data_array_col);
Osamu Nakamura 0:8373b6833bde 203 o_temp["data"] = picojson::value(data_array_temp);
Osamu Nakamura 6:ff12fc4d75f0 204 o_magne["data"] = picojson::value(data_array_magne);
Osamu Nakamura 0:8373b6833bde 205
Osamu Nakamura 0:8373b6833bde 206 http_resp_time.reset();
Osamu Nakamura 0:8373b6833bde 207 http_resp_time.start();
Osamu Nakamura 0:8373b6833bde 208
Osamu Nakamura 0:8373b6833bde 209 /* send data */
Osamu Nakamura 0:8373b6833bde 210 iot_put(network, o_acc);
Osamu Nakamura 0:8373b6833bde 211 iot_put(network, o_atmo);
Osamu Nakamura 0:8373b6833bde 212 iot_put(network, o_col);
Osamu Nakamura 0:8373b6833bde 213 iot_put(network, o_temp);
Osamu Nakamura 6:ff12fc4d75f0 214 iot_put(network, o_magne);
Osamu Nakamura 0:8373b6833bde 215
Osamu Nakamura 0:8373b6833bde 216
Osamu Nakamura 0:8373b6833bde 217 DEBUG_PRINT("iot_put() Response time:%dms\n", http_resp_time.read_ms());
Osamu Nakamura 0:8373b6833bde 218
Osamu Nakamura 0:8373b6833bde 219 return 0;
Osamu Nakamura 0:8373b6833bde 220 }
Osamu Nakamura 0:8373b6833bde 221
Osamu Nakamura 0:8373b6833bde 222 int send_hvc_info(NetworkInterface *network)
Osamu Nakamura 0:8373b6833bde 223 {
Osamu Nakamura 0:8373b6833bde 224 /* No face detect */
Osamu Nakamura 0:8373b6833bde 225 if (result_hvcp2_fd_cnt == 0) {
Osamu Nakamura 2:a191fff7103b 226 /* Do nothing */
Osamu Nakamura 0:8373b6833bde 227 } else {
Osamu Nakamura 0:8373b6833bde 228 for (uint32_t i = 0; i < result_hvcp2_fd_cnt; i++) {
Osamu Nakamura 0:8373b6833bde 229 /* picojson-object clear */
Osamu Nakamura 0:8373b6833bde 230 o_fd[i].clear();
Osamu Nakamura 0:8373b6833bde 231 o_fr[i].clear();
Osamu Nakamura 0:8373b6833bde 232 o_scr[i].clear();
Osamu Nakamura 0:8373b6833bde 233 /* Type */
Osamu Nakamura 0:8373b6833bde 234 o_fd[i]["RecordType"] = picojson::value((string)"HVC-P2(face)");
Osamu Nakamura 6:ff12fc4d75f0 235 o_fd[i]["id"] = picojson::value((string) "0001-0006");
Osamu Nakamura 0:8373b6833bde 236 /* Age */
Osamu Nakamura 0:8373b6833bde 237 o_fd[i]["Age"] = picojson::value((double)result_hvcp2_fd[i].age.age);
Osamu Nakamura 0:8373b6833bde 238 /* Gender */
Osamu Nakamura 0:8373b6833bde 239 o_fd[i]["Gender"] = picojson::value((double)result_hvcp2_fd[i].gender.gender);
Osamu Nakamura 0:8373b6833bde 240 /* FaceRectangle */
Osamu Nakamura 0:8373b6833bde 241 o_fr[i]["Top"] = picojson::value((double)result_hvcp2_fd[i].face_rectangle.MinY);
Osamu Nakamura 0:8373b6833bde 242 o_fr[i]["Left"] = picojson::value((double)result_hvcp2_fd[i].face_rectangle.MinX);
Osamu Nakamura 0:8373b6833bde 243 o_fr[i]["Width"] = picojson::value((double)result_hvcp2_fd[i].face_rectangle.Width);
Osamu Nakamura 0:8373b6833bde 244 o_fr[i]["Height"] = picojson::value((double)result_hvcp2_fd[i].face_rectangle.Height);
Osamu Nakamura 0:8373b6833bde 245 /* Scores */
Osamu Nakamura 0:8373b6833bde 246 o_scr[i]["Neutral"] = picojson::value((double)result_hvcp2_fd[i].scores.score_neutral);
Osamu Nakamura 0:8373b6833bde 247 o_scr[i]["Anger"] = picojson::value((double)result_hvcp2_fd[i].scores.score_anger);
Osamu Nakamura 0:8373b6833bde 248 o_scr[i]["Happiness"] = picojson::value((double)result_hvcp2_fd[i].scores.score_happiness);
Osamu Nakamura 0:8373b6833bde 249 o_scr[i]["Surprise"] = picojson::value((double)result_hvcp2_fd[i].scores.score_surprise);
Osamu Nakamura 0:8373b6833bde 250 o_scr[i]["Sadness"] = picojson::value((double)result_hvcp2_fd[i].scores.score_sadness);
Osamu Nakamura 0:8373b6833bde 251 /* insert 2 structures */
Osamu Nakamura 0:8373b6833bde 252 o_fd[i]["FaceRectangle"] = picojson::value(o_fr[i]);
Osamu Nakamura 0:8373b6833bde 253 o_fd[i]["Scores"] = picojson::value(o_scr[i]);
Osamu Nakamura 0:8373b6833bde 254 }
Osamu Nakamura 0:8373b6833bde 255 }
Osamu Nakamura 0:8373b6833bde 256
Osamu Nakamura 0:8373b6833bde 257 /* No body detect */
Osamu Nakamura 0:8373b6833bde 258 if (result_hvcp2_bd_cnt == 0) {
Osamu Nakamura 2:a191fff7103b 259 /* Do nothing */
Osamu Nakamura 0:8373b6833bde 260 } else {
Osamu Nakamura 0:8373b6833bde 261 for (uint32_t i = 0; i < result_hvcp2_bd_cnt; i++) {
Osamu Nakamura 0:8373b6833bde 262 /* picojson-object clear */
Osamu Nakamura 0:8373b6833bde 263 o_bd[i].clear();
Osamu Nakamura 0:8373b6833bde 264 /* Type */
Osamu Nakamura 0:8373b6833bde 265 o_bd[i]["RecordType"] = picojson::value((string)"HVC-P2(body)");
Osamu Nakamura 6:ff12fc4d75f0 266 o_bd[i]["id"] = picojson::value((string)"0001-0007");
Osamu Nakamura 0:8373b6833bde 267 /* BodyRectangle */
Osamu Nakamura 0:8373b6833bde 268 o_bd[i]["Top"] = picojson::value((double)result_hvcp2_bd[i].body_rectangle.MinY);
Osamu Nakamura 0:8373b6833bde 269 o_bd[i]["Left"] = picojson::value((double)result_hvcp2_bd[i].body_rectangle.MinX);
Osamu Nakamura 0:8373b6833bde 270 o_bd[i]["Width"] = picojson::value((double)result_hvcp2_bd[i].body_rectangle.Width);
Osamu Nakamura 0:8373b6833bde 271 o_bd[i]["Height"] = picojson::value((double)result_hvcp2_bd[i].body_rectangle.Height);
Osamu Nakamura 0:8373b6833bde 272 }
Osamu Nakamura 0:8373b6833bde 273 }
Osamu Nakamura 0:8373b6833bde 274
Osamu Nakamura 0:8373b6833bde 275 DEBUG_PRINT("Face detect count : %d\n", result_hvcp2_fd_cnt);
Osamu Nakamura 0:8373b6833bde 276 DEBUG_PRINT("Body detect count : %d\n", result_hvcp2_bd_cnt);
Osamu Nakamura 0:8373b6833bde 277
Osamu Nakamura 0:8373b6833bde 278 http_resp_time.reset();
Osamu Nakamura 0:8373b6833bde 279 http_resp_time.start();
Osamu Nakamura 0:8373b6833bde 280
Osamu Nakamura 0:8373b6833bde 281 /* send data */
Osamu Nakamura 0:8373b6833bde 282 if (result_hvcp2_fd_cnt == 0) {
Osamu Nakamura 2:a191fff7103b 283 /* No need to send data */
Osamu Nakamura 0:8373b6833bde 284 } else {
Osamu Nakamura 0:8373b6833bde 285 for (uint32_t i = 0; i < result_hvcp2_fd_cnt; i++) {
Osamu Nakamura 0:8373b6833bde 286 iot_put(network, o_fd[i]);
Osamu Nakamura 0:8373b6833bde 287 }
Osamu Nakamura 0:8373b6833bde 288 }
Osamu Nakamura 0:8373b6833bde 289 if (result_hvcp2_bd_cnt == 0) {
Osamu Nakamura 2:a191fff7103b 290 /* No need to send data */
Osamu Nakamura 0:8373b6833bde 291 } else {
Osamu Nakamura 0:8373b6833bde 292 for (uint32_t i = 0; i < result_hvcp2_bd_cnt; i++) {
Osamu Nakamura 0:8373b6833bde 293 iot_put(network, o_bd[i]);
Osamu Nakamura 0:8373b6833bde 294 }
Osamu Nakamura 0:8373b6833bde 295 }
Osamu Nakamura 0:8373b6833bde 296 DEBUG_PRINT("iot_put() Response time:%dms\n", http_resp_time.read_ms());
Osamu Nakamura 0:8373b6833bde 297 return 0;
Osamu Nakamura 0:8373b6833bde 298 }
Osamu Nakamura 0:8373b6833bde 299
Osamu Nakamura 0:8373b6833bde 300 void iot_ready_task(void)
Osamu Nakamura 0:8373b6833bde 301 {
Osamu Nakamura 6:ff12fc4d75f0 302 KX022 acc(I2C_SDA, I2C_SCL);
Osamu Nakamura 6:ff12fc4d75f0 303 sensor_acc = &acc;
Osamu Nakamura 0:8373b6833bde 304
Osamu Nakamura 0:8373b6833bde 305 /* Initialize http */
Osamu Nakamura 0:8373b6833bde 306 NetworkInterface *network = easy_connect(true);
Osamu Nakamura 0:8373b6833bde 307 MBED_ASSERT(network);
Osamu Nakamura 0:8373b6833bde 308
Osamu Nakamura 2:a191fff7103b 309 #ifdef ENABLED_NTP
Osamu Nakamura 0:8373b6833bde 310 // Generate the string indicating the date and hour specified for PUT request
Osamu Nakamura 0:8373b6833bde 311 NTPClient ntp;
Osamu Nakamura 0:8373b6833bde 312 time_t ctTime;
Osamu Nakamura 0:8373b6833bde 313 struct tm *pnow;
Osamu Nakamura 0:8373b6833bde 314 NTPResult ret;
Osamu Nakamura 0:8373b6833bde 315
Osamu Nakamura 0:8373b6833bde 316 ret = ntp.setTime("ntp.nict.jp");
Osamu Nakamura 0:8373b6833bde 317 MBED_ASSERT( ret==0 );
Osamu Nakamura 0:8373b6833bde 318
Osamu Nakamura 0:8373b6833bde 319 ctTime = time(NULL);
Osamu Nakamura 2:a191fff7103b 320 #endif // Enabled_NTP
Osamu Nakamura 0:8373b6833bde 321
Osamu Nakamura 0:8373b6833bde 322 while (1) {
Osamu Nakamura 0:8373b6833bde 323
Osamu Nakamura 0:8373b6833bde 324 semaphore_wait_ret = iot_ready_semaphore.wait();
Osamu Nakamura 0:8373b6833bde 325 MBED_ASSERT(semaphore_wait_ret != -1);
Osamu Nakamura 0:8373b6833bde 326
Osamu Nakamura 0:8373b6833bde 327 #ifdef USE_HVC_P2
Osamu Nakamura 0:8373b6833bde 328 /* send hvc-p2 data */
Osamu Nakamura 0:8373b6833bde 329 http_resp_time.reset();
Osamu Nakamura 0:8373b6833bde 330 http_resp_time.start();
Osamu Nakamura 0:8373b6833bde 331 send_hvc_info(network);
Osamu Nakamura 0:8373b6833bde 332 DEBUG_PRINT("send_hvc_info() Response time:%dms\n",
Osamu Nakamura 0:8373b6833bde 333 http_resp_time.read_ms());
Osamu Nakamura 0:8373b6833bde 334 #endif // USE_HVC_P2
Osamu Nakamura 0:8373b6833bde 335
Osamu Nakamura 0:8373b6833bde 336 #ifdef USE_SENSOR_SHIELD
Osamu Nakamura 0:8373b6833bde 337 /* send sensor data */
Osamu Nakamura 0:8373b6833bde 338 http_resp_time.reset();
Osamu Nakamura 0:8373b6833bde 339 http_resp_time.start();
Osamu Nakamura 0:8373b6833bde 340 send_sensor_info(network);
Osamu Nakamura 0:8373b6833bde 341 DEBUG_PRINT("send_sensor_info() Response time:%dms\n",
Osamu Nakamura 0:8373b6833bde 342 http_resp_time.read_ms());
Osamu Nakamura 0:8373b6833bde 343 #endif // USE_SENSOR_SHIELD
Osamu Nakamura 0:8373b6833bde 344 iot_ready_semaphore.release();
Osamu Nakamura 0:8373b6833bde 345
Osamu Nakamura 0:8373b6833bde 346 Thread::wait(WAIT_TIME);
Osamu Nakamura 0:8373b6833bde 347 };
Osamu Nakamura 0:8373b6833bde 348 }