Donald Meyers / Mbed OS evan
Committer:
djmeyers
Date:
Sat Mar 18 22:37:16 2017 +0000
Revision:
0:06ee5f8a484a
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
djmeyers 0:06ee5f8a484a 1 #include "mbed.h"
djmeyers 0:06ee5f8a484a 2 #include "utils.hpp"
djmeyers 0:06ee5f8a484a 3
djmeyers 0:06ee5f8a484a 4 #include "EthernetInterface.h"
djmeyers 0:06ee5f8a484a 5 #include "frdm_client.hpp"
djmeyers 0:06ee5f8a484a 6
djmeyers 0:06ee5f8a484a 7 #include "metronome.hpp"
djmeyers 0:06ee5f8a484a 8
djmeyers 0:06ee5f8a484a 9 #define IOT_ENABLED
djmeyers 0:06ee5f8a484a 10
djmeyers 0:06ee5f8a484a 11 namespace active_low
djmeyers 0:06ee5f8a484a 12 {
djmeyers 0:06ee5f8a484a 13 const bool on = false;
djmeyers 0:06ee5f8a484a 14 const bool off = true;
djmeyers 0:06ee5f8a484a 15 }
djmeyers 0:06ee5f8a484a 16
djmeyers 0:06ee5f8a484a 17 DigitalOut g_led_red(LED1);
djmeyers 0:06ee5f8a484a 18 DigitalOut g_led_green(LED2);
djmeyers 0:06ee5f8a484a 19 DigitalOut g_led_blue(LED3);
djmeyers 0:06ee5f8a484a 20
djmeyers 0:06ee5f8a484a 21 InterruptIn g_button_mode(SW3);
djmeyers 0:06ee5f8a484a 22 InterruptIn g_button_tap(SW2);
djmeyers 0:06ee5f8a484a 23
djmeyers 0:06ee5f8a484a 24 metronome *m = new metronome();
djmeyers 0:06ee5f8a484a 25
djmeyers 0:06ee5f8a484a 26 float delay = 0, pulse = 0.1f;
djmeyers 0:06ee5f8a484a 27
djmeyers 0:06ee5f8a484a 28 void on_mode()
djmeyers 0:06ee5f8a484a 29 {
djmeyers 0:06ee5f8a484a 30 // Change modes
djmeyers 0:06ee5f8a484a 31 if (m->is_timing()) {
djmeyers 0:06ee5f8a484a 32 m->stop_timing();
djmeyers 0:06ee5f8a484a 33 } else {
djmeyers 0:06ee5f8a484a 34 m->start_timing();
djmeyers 0:06ee5f8a484a 35 }
djmeyers 0:06ee5f8a484a 36
djmeyers 0:06ee5f8a484a 37 }
djmeyers 0:06ee5f8a484a 38
djmeyers 0:06ee5f8a484a 39 void on_tap()
djmeyers 0:06ee5f8a484a 40 {
djmeyers 0:06ee5f8a484a 41 if(m->is_timing()){
djmeyers 0:06ee5f8a484a 42 g_led_red = active_low::on;
djmeyers 0:06ee5f8a484a 43 wait(pulse);
djmeyers 0:06ee5f8a484a 44 g_led_red = active_low::off;
djmeyers 0:06ee5f8a484a 45 m->tap();
djmeyers 0:06ee5f8a484a 46 }
djmeyers 0:06ee5f8a484a 47 }
djmeyers 0:06ee5f8a484a 48
djmeyers 0:06ee5f8a484a 49 int main()
djmeyers 0:06ee5f8a484a 50 {
djmeyers 0:06ee5f8a484a 51 // Seed the RNG for networking purposes
djmeyers 0:06ee5f8a484a 52 unsigned seed = utils::entropy_seed();
djmeyers 0:06ee5f8a484a 53 srand(seed);
djmeyers 0:06ee5f8a484a 54
djmeyers 0:06ee5f8a484a 55 // LEDs are active LOW - true/1 means off, false/0 means on
djmeyers 0:06ee5f8a484a 56 // Use the constants for easier reading
djmeyers 0:06ee5f8a484a 57 g_led_red = active_low::off;
djmeyers 0:06ee5f8a484a 58 g_led_green = active_low::off;
djmeyers 0:06ee5f8a484a 59 g_led_blue = active_low::off;
djmeyers 0:06ee5f8a484a 60
djmeyers 0:06ee5f8a484a 61 // Button falling edge is on push (rising is on release)
djmeyers 0:06ee5f8a484a 62 g_button_mode.fall(&on_mode);
djmeyers 0:06ee5f8a484a 63 g_button_tap.fall(&on_tap);
djmeyers 0:06ee5f8a484a 64
djmeyers 0:06ee5f8a484a 65
djmeyers 0:06ee5f8a484a 66
djmeyers 0:06ee5f8a484a 67 #ifdef IOT_ENABLED
djmeyers 0:06ee5f8a484a 68 // Turn on the blue LED until connected to the network
djmeyers 0:06ee5f8a484a 69 g_led_blue = active_low::on;
djmeyers 0:06ee5f8a484a 70
djmeyers 0:06ee5f8a484a 71 // Need to be connected with Ethernet cable for success
djmeyers 0:06ee5f8a484a 72 EthernetInterface ethernet;
djmeyers 0:06ee5f8a484a 73 if (ethernet.connect() != 0)
djmeyers 0:06ee5f8a484a 74 return 1;
djmeyers 0:06ee5f8a484a 75
djmeyers 0:06ee5f8a484a 76 // Pair with the device connector
djmeyers 0:06ee5f8a484a 77 frdm_client client("coap://api.connector.mbed.com:5684", &ethernet);
djmeyers 0:06ee5f8a484a 78 if (client.get_state() == frdm_client::state::error)
djmeyers 0:06ee5f8a484a 79 return 1;
djmeyers 0:06ee5f8a484a 80
djmeyers 0:06ee5f8a484a 81 // The REST endpoints for this device
djmeyers 0:06ee5f8a484a 82 // Add your own M2MObjects to this list with push_back before client.connect()
djmeyers 0:06ee5f8a484a 83 M2MObjectList objects;
djmeyers 0:06ee5f8a484a 84
djmeyers 0:06ee5f8a484a 85
djmeyers 0:06ee5f8a484a 86 M2MDevice* device = frdm_client::make_device();
djmeyers 0:06ee5f8a484a 87 objects.push_back(device);
djmeyers 0:06ee5f8a484a 88
djmeyers 0:06ee5f8a484a 89
djmeyers 0:06ee5f8a484a 90 M2MObject* frequency_object = M2MInterfaceFactory::create_object("3318");
djmeyers 0:06ee5f8a484a 91 M2MObjectInstance* frequency_object_instance = frequency_object->create_object_instance();
djmeyers 0:06ee5f8a484a 92
djmeyers 0:06ee5f8a484a 93 M2MResource* set_point_value = frequency_object_instance->create_dynamic_resource("5900", "Set",
djmeyers 0:06ee5f8a484a 94 M2MResourceInstance::STRING, true);
djmeyers 0:06ee5f8a484a 95 set_point_value->set_operation(M2MBase::GET_PUT_ALLOWED);
djmeyers 0:06ee5f8a484a 96 set_point_value->set_value((uint8_t*)"0", 1);
djmeyers 0:06ee5f8a484a 97
djmeyers 0:06ee5f8a484a 98 M2MResource* min = frequency_object_instance->create_dynamic_resource("5601", "Min",
djmeyers 0:06ee5f8a484a 99 M2MResourceInstance::STRING, true);
djmeyers 0:06ee5f8a484a 100 min->set_operation(M2MBase::GET_PUT_ALLOWED);
djmeyers 0:06ee5f8a484a 101 min->set_value((uint8_t*)"0", 1);
djmeyers 0:06ee5f8a484a 102
djmeyers 0:06ee5f8a484a 103 M2MResource* max = frequency_object_instance->create_dynamic_resource("5602", "Max",
djmeyers 0:06ee5f8a484a 104 M2MResourceInstance::STRING, true);
djmeyers 0:06ee5f8a484a 105 max->set_operation(M2MBase::GET_PUT_ALLOWED);
djmeyers 0:06ee5f8a484a 106 max->set_value((uint8_t*)"0", 1);
djmeyers 0:06ee5f8a484a 107
djmeyers 0:06ee5f8a484a 108 M2MResource* units = frequency_object_instance->create_dynamic_resource("5701", "Units",
djmeyers 0:06ee5f8a484a 109 M2MResourceInstance::STRING, true);
djmeyers 0:06ee5f8a484a 110 units->set_operation(M2MBase::GET_PUT_ALLOWED);
djmeyers 0:06ee5f8a484a 111 units->set_value((uint8_t*)"BPM", 3);
djmeyers 0:06ee5f8a484a 112
djmeyers 0:06ee5f8a484a 113 objects.push_back(frequency_object);
djmeyers 0:06ee5f8a484a 114
djmeyers 0:06ee5f8a484a 115
djmeyers 0:06ee5f8a484a 116 // Publish the RESTful endpoints
djmeyers 0:06ee5f8a484a 117 client.connect(objects);
djmeyers 0:06ee5f8a484a 118
djmeyers 0:06ee5f8a484a 119 // Connect complete; turn off blue LED forever
djmeyers 0:06ee5f8a484a 120 g_led_blue = active_low::off;
djmeyers 0:06ee5f8a484a 121 #endif
djmeyers 0:06ee5f8a484a 122
djmeyers 0:06ee5f8a484a 123 while (true)
djmeyers 0:06ee5f8a484a 124 {
djmeyers 0:06ee5f8a484a 125 #ifdef IOT_ENABLED
djmeyers 0:06ee5f8a484a 126 if (client.get_state() == frdm_client::state::error)
djmeyers 0:06ee5f8a484a 127 break;
djmeyers 0:06ee5f8a484a 128 #endif
djmeyers 0:06ee5f8a484a 129
djmeyers 0:06ee5f8a484a 130 // Insert any code that must be run continuously here
djmeyers 0:06ee5f8a484a 131
djmeyers 0:06ee5f8a484a 132 char buffer[20];
djmeyers 0:06ee5f8a484a 133 int size;
djmeyers 0:06ee5f8a484a 134 if(!m->is_timing()){
djmeyers 0:06ee5f8a484a 135 size = sprintf(buffer,"%d",m->get_bpm());
djmeyers 0:06ee5f8a484a 136 set_point_value->set_value((uint8_t*)buffer, size);
djmeyers 0:06ee5f8a484a 137 delay = m->get_delay() / 1000.0f;
djmeyers 0:06ee5f8a484a 138 if(delay != 0){
djmeyers 0:06ee5f8a484a 139 g_led_green = active_low::on;
djmeyers 0:06ee5f8a484a 140 wait(pulse);
djmeyers 0:06ee5f8a484a 141 g_led_green = active_low::off;
djmeyers 0:06ee5f8a484a 142 wait(delay - pulse);
djmeyers 0:06ee5f8a484a 143 }
djmeyers 0:06ee5f8a484a 144 }
djmeyers 0:06ee5f8a484a 145 }
djmeyers 0:06ee5f8a484a 146
djmeyers 0:06ee5f8a484a 147 #ifdef IOT_ENABLED
djmeyers 0:06ee5f8a484a 148 client.disconnect();
djmeyers 0:06ee5f8a484a 149 #endif
djmeyers 0:06ee5f8a484a 150
djmeyers 0:06ee5f8a484a 151 return 1;
djmeyers 0:06ee5f8a484a 152 }