Taking photo using GR-LYCHEE through Pelion Device Management.

This firmware project works for GR-LYCHEE and GR-PEACH.

Steps to build this firmware with Mbed CLI

Import project

$ mbed import http://os.mbed.com/users/coisme/code/Pelion-GR-LYCHEE-camera-firmware/

Setting

  • Ethernet (GR-PEACH only)
    • Change the file name mbed_app.RZ_A1H_Ethernet.json to mbed_app.json
  • Wi-Fi
    • Change the Wi-Fi setting in mbed_app.json, i.e. nsapi.default-wifi-ssid and nsapi.default-wifi-password

If you haven't set your Pelion API key, run the following command.

$ mbed config -G CLOUD_SDK_API_KEY <API_KEY>

Setting for Pelion Device Management

$ mbed dm init -d "example.com" --model-name "PELION_DEMO" -q --force

Compile

For GR-LYCHEE:

$ mbed compile -t GCC_ARM -m GR_LYCHEE

For GR-PEACH:

$ mbed compile -t GCC_ARM -m RZ_A1H

Write the created .bin file to your GR-LYCHEE/PEACH.

That's it! :-)

LED Status Indicator

LEDs next to UB0 show the status of your GR-LYCHEE/PEACH.

LED#GR-LYCHEEGR-PEACHStatusDescription
LED1greenredNormalTurned on after the device is registered to Pelion Device Management successfully.
LED2yellowgreenErrorTurned on when the network initialization failed. Check your Wi-Fi setting.
LED3orangeblueErrorTurned on when the Pelion Device Management Client initialization failed. Check your SD card.
LED4redredErrorTurned on when the network is disconnected. Check your Wi-Fi network status.

Clear device identity

If you want to clear the device's identity, connect to the device via serial terminal. Then input r command. The device flushes the identity storage, then reboot.

Known Issues

  • client_error(6) -> Client in reconnection mode NetworkError appears when connecting to network, but eventually connection will be established.
  • Warning message "MBEDTLS_TEST_NULL_ENTROPY has been enabled. This configuration is not secure and is not suitable for production use" appears when compiling the project for GR-PEACH. This can be ignored in development stage.

Files at this revision

API Documentation at this revision

Comitter:
Osamu Koizumi
Date:
Wed Apr 10 12:46:02 2019 +0900
Parent:
13:bc31cb1602de
Child:
15:09a192353257
Commit message:
Use LEDs as error indicator.

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
diff -r bc31cb1602de -r 0480150782c8 main.cpp
--- a/main.cpp	Wed Apr 10 11:20:54 2019 +0900
+++ b/main.cpp	Wed Apr 10 12:46:02 2019 +0900
@@ -42,6 +42,9 @@
 DisplayBase Display;
 JPEG_Converter Jcu;
 
+const int LED_ON = 1;
+const int LED_OFF = 0;
+
 // An event queue is a very useful structure to debounce information between contexts (e.g. ISR and normal threads)
 // This is great because things such as network operations are illegal in ISR, so updating a resource in a button's fall() function is not allowed
 EventQueue eventQueue;
@@ -60,6 +63,9 @@
 MbedCloudClientResource *camera_capture_res;
 
 bool take_photo(uint8_t *photo_data, uint32_t *photo_data_len) {
+    // When taking a photo, RED LED (LED4) lights.
+    DigitalOut led(LED_RED, LED_ON);
+
     JPEG_Converter::bitmap_buff_info_t buff_info;
     JPEG_Converter::encode_options_t   encode_opt;
 
@@ -76,10 +82,13 @@
     encode_opt.input_swapsetting = JPEG_Converter::WR_RD_WRSWA_32_16_8BIT;
 
     dcache_invalid(photo_data, *photo_data_len);
-    if (Jcu.encode(&buff_info, photo_data, (size_t *)photo_data_len, &encode_opt) != JPEG_Converter::JPEG_CONV_OK) {
+    JPEG_Converter::jpeg_conv_error_t err = Jcu.encode(&buff_info, photo_data, (size_t *)photo_data_len, &encode_opt);
+    led = LED_OFF;
+    
+    if(err != JPEG_Converter::JPEG_CONV_OK)
+    {
         return false;
     }
-
     return true;
 }
 
@@ -106,10 +115,23 @@
     }
 }
 
+/*
+ * Monitor the network connection. If the network is disconnected, the RED LED (LED4) on the board lights.
+ */
+void monitor() {
+    nsapi_connection_status status = net->get_connection_status();
+    if(status != NSAPI_STATUS_GLOBAL_UP) {
+        DigitalOut led(LED_RED, LED_ON);
+        printf("Network is disconnected. Status = %d.\n", status);
+    } else {
+        DigitalOut led(LED_RED, LED_OFF);
+    }
+}
+
 void camera_capture_callback(MbedCloudClientResource *resource, const NoticationDeliveryStatus status)
 {
     printf("camera notification, status: %s (%d)\n", 
-    	MbedCloudClientResource::delivery_status_to_string(status), status);
+    MbedCloudClientResource::delivery_status_to_string(status), status);
 }
 
 /**
@@ -143,6 +165,8 @@
     // Set default photo
     M2MResource* m2m_res = camera_capture_res->get_m2m_resource();
     m2m_res->set_value(DEFAULT_PHOTO, DEFAULT_PHOTO_LEN);
+    // Turn on the GREEN LED (LED1) when device is registered.
+    DigitalOut led(LED_GREEN, LED_ON);
 }
  
 
@@ -155,6 +179,8 @@
 
     if (status != NSAPI_ERROR_OK) {
         printf("Connecting to the network failed %d!\n", status);
+        // Turn on the YELLOW LED (LED2) when the network initialization failed.
+        DigitalOut led(LED_YELLOW, LED_ON);
         return -1;
     }
 
@@ -165,6 +191,8 @@
     int client_status = client.init();
     if (client_status != 0) {
         printf("Pelion Client initialization failed (%d)\n", client_status);
+        // Turn on the ORANGE LED (LED3) when Pelion Client initialization failed.
+        DigitalOut led(LED_ORANGE, LED_ON);
         return -1;
     }
 
@@ -218,6 +246,10 @@
     // thread context instead of ISR context, which allows safely updating the cloud resource
     btn.fall(eventQueue.event(&button_press));
 
+    // Monitor the network connection periodically.
+    Ticker ticker;
+    ticker.attach(eventQueue.event(&monitor), 5.0);    // second param is period in seconds
+
     // You can easily run the eventQueue in a separate thread if required
     eventQueue.dispatch_forever();
 }