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:
Fri Jul 07 14:59:29 2017 +0900
Revision:
0:8373b6833bde
Child:
2:a191fff7103b
Initial commit

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