Nespresso RGB Sensor / Mbed 2 deprecated EnvoyNespressoEndpointColorDetectorV2

Dependencies:   ColorDetectorV2 ExternalFlashClient SNICInterface mbed-rtos mbed nsdl

Fork of EnvoyNespressoEndpoint by Nespresso RGB Sensor

Committer:
mbedAustin
Date:
Mon Jul 06 22:20:11 2015 +0000
Revision:
19:85158f5a7775
Parent:
18:a44666d32c2a
Child:
20:4b6dcda0dcfd
Changed security type to match local network encryption

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bridadan 0:0782597771bc 1 #include "mbed.h"
mbedAustin 12:01e87cce0aab 2 //#include "EthernetInterface.h"
mbedAustin 12:01e87cce0aab 3 #include "SNIC_WifiInterface.h"
bridadan 0:0782597771bc 4 #include "nsdl_support.h"
bridadan 0:0782597771bc 5 #include "dbg.h"
bridadan 0:0782597771bc 6 #include "GroveColourSensor.h"
bridadan 0:0782597771bc 7 #include "ColorDetector.h"
bridadan 0:0782597771bc 8 #include "color_detector.h"
bridadan 7:b2df16ff5076 9 #include <cmath>
mbedAustin 12:01e87cce0aab 10 #include "Endpoint.h"
mbedAustin 12:01e87cce0aab 11 #include "UDPSocket.h"
bridadan 14:e5dc56c4e6f5 12 #include "ExternalFlashClient.h"
bridadan 0:0782597771bc 13
bridadan 0:0782597771bc 14 Serial pc(USBTX, USBRX); // tx, rx
bridadan 0:0782597771bc 15
bridadan 0:0782597771bc 16 // ****************************************************************************
bridadan 0:0782597771bc 17 // Configuration section
bridadan 0:0782597771bc 18
bridadan 6:9e3f6270fcb0 19 // I2C Settings
bridadan 6:9e3f6270fcb0 20 #define COLOR_SENSOR_SCL I2C_SCL
bridadan 6:9e3f6270fcb0 21 #define COLOR_SENSOR_SDA I2C_SDA
bridadan 6:9e3f6270fcb0 22
bridadan 14:e5dc56c4e6f5 23 // Envoy Settings
mbedAustin 16:ff5af00f3fb5 24 uint32_t SSID_ADDRESS = 0x0100;
mbedAustin 16:ff5af00f3fb5 25 uint32_t KEY_ADDRESS = 0x0200;
bridadan 14:e5dc56c4e6f5 26
bridadan 14:e5dc56c4e6f5 27 // Pins and SPI module for the external flash class
bridadan 14:e5dc56c4e6f5 28 PinName nSCS = D10;
bridadan 14:e5dc56c4e6f5 29 PinName SCLK = D13;
bridadan 14:e5dc56c4e6f5 30 PinName MOSI = D11;
bridadan 14:e5dc56c4e6f5 31 PinName MISO = D12;
bridadan 14:e5dc56c4e6f5 32 PinName SIRQ = D9;
bridadan 14:e5dc56c4e6f5 33
bridadan 14:e5dc56c4e6f5 34 // buffer for storing reads
bridadan 14:e5dc56c4e6f5 35 uint8_t readBuffer[100];
bridadan 14:e5dc56c4e6f5 36 block_t block = { .data = readBuffer,
bridadan 14:e5dc56c4e6f5 37 .length = sizeof(readBuffer),
bridadan 14:e5dc56c4e6f5 38 .offset = 0,
bridadan 14:e5dc56c4e6f5 39 .maxLength = sizeof(readBuffer)
bridadan 14:e5dc56c4e6f5 40 };
bridadan 14:e5dc56c4e6f5 41
mbedAustin 16:ff5af00f3fb5 42 volatile bool wifiProvisioned = false;
bridadan 14:e5dc56c4e6f5 43
mbedAustin 15:cbac93920f30 44 // debug LEDs
mbedAustin 15:cbac93920f30 45 DigitalOut led1(LED1);
mbedAustin 15:cbac93920f30 46
bridadan 0:0782597771bc 47 // Ethernet configuration
bridadan 0:0782597771bc 48 /* Define this to enable DHCP, otherwise manual address configuration is used */
bridadan 0:0782597771bc 49 #define DHCP
bridadan 0:0782597771bc 50
bridadan 0:0782597771bc 51 /* Manual IP configurations, if DHCP not defined */
bridadan 0:0782597771bc 52 #define IP "0.0.0.0"
bridadan 0:0782597771bc 53 #define MASK "255.255.255.0"
bridadan 0:0782597771bc 54 #define GW "0.0.0.0"
bridadan 0:0782597771bc 55
mbedAustin 15:cbac93920f30 56 //#define DEMO_AP_SSID "demossid"
mbedAustin 19:85158f5a7775 57 #define DEMO_AP_SECURITY_TYPE e_SEC_WPA2_AES
mbedAustin 15:cbac93920f30 58 //#define DEMO_AP_SECUTIRY_KEY "mbed.org"
mbedAustin 19:85158f5a7775 59 //#define DEMO_AP_SECUTIRY_KEY_LEN 8
mbedAustin 12:01e87cce0aab 60
mbedAustin 15:cbac93920f30 61 char SSID[50] = {0};
mbedAustin 15:cbac93920f30 62 char KEY[50] = {0};
mbedAustin 15:cbac93920f30 63
bridadan 0:0782597771bc 64 // NSP configuration
bridadan 0:0782597771bc 65 /* Change this IP address to that of your mbed Device Server installation */
mbedAustin 19:85158f5a7775 66 static const char* NSP_ADDRESS = "23.99.11.204"; // aka connector.mbed.org
bridadan 0:0782597771bc 67 static const int NSP_PORT = 5683;
bridadan 13:0edc42397e44 68 char endpoint_name[] = "nespresso-machine-wifi";
bridadan 9:202680169650 69 uint8_t ep_type[] = {"nespresso-endpoint"};
bridadan 9:202680169650 70 char nsp_domain[] = "56645321f5e24c49908e42f4d71b9ccb";
bridadan 0:0782597771bc 71 uint8_t lifetime_ptr[] = {"1200"};
bridadan 0:0782597771bc 72
bridadan 0:0782597771bc 73 // ****************************************************************************
bridadan 0:0782597771bc 74 // Ethernet initialization
mbedAustin 12:01e87cce0aab 75 C_SNIC_WifiInterface eth( D1, D0, NC, NC, D3 );
bridadan 14:e5dc56c4e6f5 76
bridadan 14:e5dc56c4e6f5 77 // Envoy initialization
bridadan 14:e5dc56c4e6f5 78 SPI spi(MOSI, MISO, SCLK);
bridadan 14:e5dc56c4e6f5 79 ExternalFlashClient flash(spi, nSCS, SIRQ);
bridadan 0:0782597771bc 80
mbedAustin 15:cbac93920f30 81 // liveness LED
mbedAustin 15:cbac93920f30 82 void tickerISR()
mbedAustin 15:cbac93920f30 83 {
mbedAustin 15:cbac93920f30 84 led1 = !led1;
mbedAustin 15:cbac93920f30 85 }
mbedAustin 15:cbac93920f30 86
bridadan 0:0782597771bc 87 static void ethernet_init()
bridadan 0:0782597771bc 88 {
mbedAustin 12:01e87cce0aab 89 // Initialize Wi-Fi interface
mbedAustin 12:01e87cce0aab 90 int s = eth.init();
mbedAustin 12:01e87cce0aab 91
mbedAustin 12:01e87cce0aab 92 NSDL_DEBUG("init();\r\n");
mbedAustin 12:01e87cce0aab 93
mbedAustin 12:01e87cce0aab 94 if( s != 0 ) {
mbedAustin 12:01e87cce0aab 95 NSDL_DEBUG( "Could not initialise wifi\n\r" );
mbedAustin 12:01e87cce0aab 96 //return -1;
mbedAustin 12:01e87cce0aab 97 }
mbedAustin 12:01e87cce0aab 98 wait(0.5);
mbedAustin 12:01e87cce0aab 99 s = eth.disconnect();
mbedAustin 12:01e87cce0aab 100 NSDL_DEBUG("disconnect();\r\n");
mbedAustin 12:01e87cce0aab 101 if( s != 0 ) {
mbedAustin 12:01e87cce0aab 102 NSDL_DEBUG( "disconnect failed\r\n" );
mbedAustin 12:01e87cce0aab 103 //return -1;
mbedAustin 12:01e87cce0aab 104 }
mbedAustin 12:01e87cce0aab 105
mbedAustin 12:01e87cce0aab 106 wait(0.3);
mbedAustin 12:01e87cce0aab 107 // Connect AP
mbedAustin 15:cbac93920f30 108 eth.connect( SSID
mbedAustin 15:cbac93920f30 109 , strlen(SSID)
mbedAustin 12:01e87cce0aab 110 , DEMO_AP_SECURITY_TYPE
mbedAustin 15:cbac93920f30 111 , KEY
mbedAustin 15:cbac93920f30 112 , strlen(KEY));
mbedAustin 12:01e87cce0aab 113 NSDL_DEBUG("connect();\r\n");
mbedAustin 12:01e87cce0aab 114 wait(0.5);
mbedAustin 12:01e87cce0aab 115
mbedAustin 12:01e87cce0aab 116 NSDL_DEBUG("IP Config();\r\n");
mbedAustin 12:01e87cce0aab 117 eth.setIPConfig( true );
bridadan 0:0782597771bc 118
bridadan 0:0782597771bc 119 NSDL_DEBUG("IP Address:%s ", eth.getIPAddress());
bridadan 0:0782597771bc 120 }
bridadan 0:0782597771bc 121
bridadan 0:0782597771bc 122 // ****************************************************************************
bridadan 0:0782597771bc 123 // NSP initialization
bridadan 0:0782597771bc 124
bridadan 0:0782597771bc 125 UDPSocket server;
bridadan 0:0782597771bc 126 Endpoint nsp;
bridadan 0:0782597771bc 127
bridadan 0:0782597771bc 128 static void nsp_init()
bridadan 0:0782597771bc 129 {
bridadan 0:0782597771bc 130 server.init();
bridadan 0:0782597771bc 131 server.bind(NSP_PORT);
bridadan 0:0782597771bc 132
bridadan 0:0782597771bc 133 nsp.set_address(NSP_ADDRESS, NSP_PORT);
mbedAustin 12:01e87cce0aab 134
bridadan 0:0782597771bc 135 NSDL_DEBUG("name: %s", endpoint_name);
bridadan 0:0782597771bc 136 NSDL_DEBUG("NSP=%s - port %d\n", NSP_ADDRESS, NSP_PORT);
bridadan 0:0782597771bc 137 }
bridadan 0:0782597771bc 138
bridadan 0:0782597771bc 139 // ****************************************************************************
bridadan 0:0782597771bc 140 // Resource creation
bridadan 0:0782597771bc 141
bridadan 0:0782597771bc 142 static int create_resources()
bridadan 0:0782597771bc 143 {
bridadan 0:0782597771bc 144 sn_nsdl_resource_info_s *resource_ptr = NULL;
mbedAustin 12:01e87cce0aab 145
bridadan 0:0782597771bc 146 NSDL_DEBUG("Creating resources");
bridadan 0:0782597771bc 147
bridadan 0:0782597771bc 148 // Create resources
bridadan 0:0782597771bc 149 resource_ptr = (sn_nsdl_resource_info_s*)nsdl_alloc(sizeof(sn_nsdl_resource_info_s));
bridadan 0:0782597771bc 150 if(!resource_ptr)
bridadan 0:0782597771bc 151 return 0;
bridadan 0:0782597771bc 152 memset(resource_ptr, 0, sizeof(sn_nsdl_resource_info_s));
bridadan 0:0782597771bc 153
bridadan 0:0782597771bc 154 resource_ptr->resource_parameters_ptr = (sn_nsdl_resource_parameters_s*)nsdl_alloc(sizeof(sn_nsdl_resource_parameters_s));
mbedAustin 12:01e87cce0aab 155 if(!resource_ptr->resource_parameters_ptr) {
bridadan 0:0782597771bc 156 nsdl_free(resource_ptr);
bridadan 0:0782597771bc 157 return 0;
bridadan 0:0782597771bc 158 }
bridadan 0:0782597771bc 159 memset(resource_ptr->resource_parameters_ptr, 0, sizeof(sn_nsdl_resource_parameters_s));
bridadan 0:0782597771bc 160
bridadan 0:0782597771bc 161 // Dynamic resources
mbedAustin 18:a44666d32c2a 162 // create_color_detector_resource(resource_ptr);
mbedAustin 12:01e87cce0aab 163
bridadan 0:0782597771bc 164 // Register with NSP
bridadan 6:9e3f6270fcb0 165 register_endpoint(true);
bridadan 0:0782597771bc 166
bridadan 0:0782597771bc 167 nsdl_free(resource_ptr->resource_parameters_ptr);
bridadan 0:0782597771bc 168 nsdl_free(resource_ptr);
bridadan 0:0782597771bc 169 return 1;
bridadan 0:0782597771bc 170 }
bridadan 0:0782597771bc 171
mbedAustin 15:cbac93920f30 172 //Read the Key
mbedAustin 15:cbac93920f30 173 void readDone2()
bridadan 14:e5dc56c4e6f5 174 {
bridadan 14:e5dc56c4e6f5 175 // copy string. first byte is the length
bridadan 14:e5dc56c4e6f5 176 uint8_t length = block.data[0];
mbedAustin 15:cbac93920f30 177 memcpy(KEY, &(block.data[1]), length);
mbedAustin 15:cbac93920f30 178 KEY[length] = '\0';
mbedAustin 18:a44666d32c2a 179
bridadan 14:e5dc56c4e6f5 180 // debug output the entire buffer
mbedAustin 18:a44666d32c2a 181 for (int idx = 0; idx < block.length; idx++) {
mbedAustin 18:a44666d32c2a 182 // zero out content to verify next read
bridadan 14:e5dc56c4e6f5 183 block.data[idx] = 0;
bridadan 14:e5dc56c4e6f5 184 }
mbedAustin 15:cbac93920f30 185
mbedAustin 15:cbac93920f30 186 wifiProvisioned = true;
mbedAustin 15:cbac93920f30 187 }
mbedAustin 15:cbac93920f30 188
mbedAustin 15:cbac93920f30 189 // Read the SSID
mbedAustin 15:cbac93920f30 190 void readDone()
mbedAustin 15:cbac93920f30 191 {
mbedAustin 15:cbac93920f30 192 // copy string. first byte is the length
mbedAustin 15:cbac93920f30 193 uint8_t length = block.data[0];
mbedAustin 15:cbac93920f30 194 memcpy(SSID, &(block.data[1]), length);
mbedAustin 15:cbac93920f30 195 SSID[length] = '\0';
mbedAustin 18:a44666d32c2a 196
mbedAustin 15:cbac93920f30 197 // debug output the entire buffer
mbedAustin 18:a44666d32c2a 198 for (int idx = 0; idx < block.length; idx++) {
mbedAustin 18:a44666d32c2a 199 // zero out content to verify next read
mbedAustin 15:cbac93920f30 200 block.data[idx] = 0;
mbedAustin 15:cbac93920f30 201 }
mbedAustin 18:a44666d32c2a 202
bridadan 14:e5dc56c4e6f5 203 wifiProvisioned = true;
bridadan 14:e5dc56c4e6f5 204 }
bridadan 14:e5dc56c4e6f5 205
bridadan 0:0782597771bc 206 // ****************************************************************************
bridadan 0:0782597771bc 207 // Program entry point
bridadan 0:0782597771bc 208
bridadan 0:0782597771bc 209 int main()
bridadan 0:0782597771bc 210 {
mbedAustin 15:cbac93920f30 211 // LED is off when high
mbedAustin 15:cbac93920f30 212 led1 = 1;
mbedAustin 18:a44666d32c2a 213
mbedAustin 15:cbac93920f30 214 // blink LED1
mbedAustin 15:cbac93920f30 215 Ticker ticker;
mbedAustin 15:cbac93920f30 216 ticker.attach(tickerISR, 1.0);
bridadan 0:0782597771bc 217 NSDL_DEBUG("mbed Nespresso Demo\n");
mbedAustin 12:01e87cce0aab 218
bridadan 0:0782597771bc 219 // Begin Color Sensor init
mbedAustin 12:01e87cce0aab 220
mbedAustin 18:a44666d32c2a 221 // First, ensure I2C bus is released by toggling clock (fixes reset errors)
mbedAustin 16:ff5af00f3fb5 222 // DigitalOut scl_dummy(COLOR_SENSOR_SCL);
mbedAustin 12:01e87cce0aab 223
mbedAustin 16:ff5af00f3fb5 224 // for (int i = 0; i < 100; i++) {
mbedAustin 16:ff5af00f3fb5 225 // scl_dummy = !scl_dummy;
mbedAustin 16:ff5af00f3fb5 226 // wait_us(2);
mbedAustin 16:ff5af00f3fb5 227 // }
mbedAustin 12:01e87cce0aab 228
mbedAustin 18:a44666d32c2a 229 // Next, initialize I2C
mbedAustin 16:ff5af00f3fb5 230 // I2C i2c(COLOR_SENSOR_SDA, COLOR_SENSOR_SCL);
mbedAustin 12:01e87cce0aab 231
mbedAustin 18:a44666d32c2a 232 // Create color sensor instance
mbedAustin 16:ff5af00f3fb5 233 // GroveColourSensor colorSensor(&i2c);
mbedAustin 12:01e87cce0aab 234
mbedAustin 18:a44666d32c2a 235 // Various config
mbedAustin 16:ff5af00f3fb5 236 // colorSensor.powerUp();
mbedAustin 16:ff5af00f3fb5 237 // colorSensor.setGain(1);
mbedAustin 16:ff5af00f3fb5 238 // colorSensor.setBlockRead();
mbedAustin 12:01e87cce0aab 239
mbedAustin 18:a44666d32c2a 240 // Create color detector
mbedAustin 16:ff5af00f3fb5 241 // ColorDetector detector(&colorSensor, 15, 3, 2, 256, 4);
mbedAustin 16:ff5af00f3fb5 242 // detector.setBaseline();
mbedAustin 12:01e87cce0aab 243
mbedAustin 18:a44666d32c2a 244 // Pass reference to color detector
mbedAustin 16:ff5af00f3fb5 245 // set_color_detector(&detector);
mbedAustin 18:a44666d32c2a 246 //
mbedAustin 15:cbac93920f30 247 printf("read SSID / KEY from flash\r\n");
mbedAustin 15:cbac93920f30 248 flash.read(SSID_ADDRESS, &block, readDone);
mbedAustin 18:a44666d32c2a 249
mbedAustin 16:ff5af00f3fb5 250 // wait for SSID to be read from Nordic chip
bridadan 14:e5dc56c4e6f5 251 while(!wifiProvisioned) {
mbedAustin 18:a44666d32c2a 252 //printf("wait\r\n");
bridadan 14:e5dc56c4e6f5 253 }
mbedAustin 18:a44666d32c2a 254 printf("SSID Provisioned Succesfully: ssid= %s\n\r",SSID);
mbedAustin 18:a44666d32c2a 255 wifiProvisioned = false;
mbedAustin 18:a44666d32c2a 256 wait(1); // Dont know why this has to be here, but it does, if I dont do it it doesnt work.
mbedAustin 18:a44666d32c2a 257
mbedAustin 18:a44666d32c2a 258 // now read the KEY
mbedAustin 16:ff5af00f3fb5 259 flash.read(KEY_ADDRESS, &block, readDone2);
mbedAustin 16:ff5af00f3fb5 260 // wait for SSID to be read from Nordic chip
mbedAustin 16:ff5af00f3fb5 261 while(!wifiProvisioned) {
mbedAustin 18:a44666d32c2a 262 //printf("wait\r\n");
mbedAustin 16:ff5af00f3fb5 263 }
mbedAustin 18:a44666d32c2a 264
mbedAustin 15:cbac93920f30 265 printf("ssid: %s, key: %s\r\n", SSID,KEY);
mbedAustin 18:a44666d32c2a 266
mbedAustin 15:cbac93920f30 267 // Ignore rest of program, just for development, it breaks before you get here
mbedAustin 18:a44666d32c2a 268 // while(true) {}
mbedAustin 12:01e87cce0aab 269
mbedAustin 18:a44666d32c2a 270 // Initialize Ethernet interface first
mbedAustin 18:a44666d32c2a 271 ethernet_init();
mbedAustin 12:01e87cce0aab 272
mbedAustin 18:a44666d32c2a 273 // Initialize NSP node
mbedAustin 18:a44666d32c2a 274 nsp_init();
mbedAustin 12:01e87cce0aab 275
mbedAustin 16:ff5af00f3fb5 276 // // Initialize NSDL stack
mbedAustin 18:a44666d32c2a 277 nsdl_init();
mbedAustin 12:01e87cce0aab 278
mbedAustin 18:a44666d32c2a 279 // Create NSDL resources
mbedAustin 18:a44666d32c2a 280 create_resources();
mbedAustin 12:01e87cce0aab 281
mbedAustin 18:a44666d32c2a 282 nsdl_event_loop_init();
mbedAustin 12:01e87cce0aab 283
bridadan 0:0782597771bc 284 while(true) {
mbedAustin 18:a44666d32c2a 285 // Check if any nsdl events need to be handled
mbedAustin 18:a44666d32c2a 286 nsdl_event_loop_run_once();
mbedAustin 12:01e87cce0aab 287
mbedAustin 16:ff5af00f3fb5 288 // // Sample the color detector and potentially send samples to mDS
mbedAustin 16:ff5af00f3fb5 289 // run_color_detector();
bridadan 0:0782597771bc 290 }
bridadan 0:0782597771bc 291 }