A smart alarm that combines flashlights and games to makes you wake up happily!
Dependencies: Servo DigitDisplay-another HC-SR04-another buzzer TM1637
main.cpp@1:074829331740, 2020-01-09 (annotated)
- Committer:
- yungsung
- Date:
- Thu Jan 09 19:24:53 2020 +0000
- Revision:
- 1:074829331740
- Parent:
- 0:fcd980d5ee5f
A smart alarm that combines flashlights and games to makes you wake up happily!
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
yungsung | 0:fcd980d5ee5f | 1 | /* mbed Microcontroller Library |
yungsung | 0:fcd980d5ee5f | 2 | * Copyright (c) 2006-2013 ARM Limited |
yungsung | 0:fcd980d5ee5f | 3 | * |
yungsung | 0:fcd980d5ee5f | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
yungsung | 0:fcd980d5ee5f | 5 | * you may not use this file except in compliance with the License. |
yungsung | 0:fcd980d5ee5f | 6 | * You may obtain a copy of the License at |
yungsung | 0:fcd980d5ee5f | 7 | * |
yungsung | 0:fcd980d5ee5f | 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
yungsung | 0:fcd980d5ee5f | 9 | * |
yungsung | 0:fcd980d5ee5f | 10 | * Unless required by applicable law or agreed to in writing, software |
yungsung | 0:fcd980d5ee5f | 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
yungsung | 0:fcd980d5ee5f | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
yungsung | 0:fcd980d5ee5f | 13 | * See the License for the specific language governing permissions and |
yungsung | 0:fcd980d5ee5f | 14 | * limitations under the License. |
yungsung | 0:fcd980d5ee5f | 15 | */ |
yungsung | 0:fcd980d5ee5f | 16 | |
yungsung | 0:fcd980d5ee5f | 17 | #include <events/mbed_events.h> |
yungsung | 0:fcd980d5ee5f | 18 | #include <mbed.h> |
yungsung | 0:fcd980d5ee5f | 19 | #include "ble/BLE.h" |
yungsung | 0:fcd980d5ee5f | 20 | #include "LEDService.h" |
yungsung | 0:fcd980d5ee5f | 21 | |
yungsung | 0:fcd980d5ee5f | 22 | #include "Servo.h" |
yungsung | 0:fcd980d5ee5f | 23 | #include "buzzer.h" |
yungsung | 0:fcd980d5ee5f | 24 | #include "HCSR04.h" |
yungsung | 0:fcd980d5ee5f | 25 | #include "TM1637.h" |
yungsung | 0:fcd980d5ee5f | 26 | |
yungsung | 0:fcd980d5ee5f | 27 | #define CLK PA_15 // D9 |
yungsung | 0:fcd980d5ee5f | 28 | #define DIO PB_2 // D8 |
yungsung | 0:fcd980d5ee5f | 29 | #define ledPin PA_4 // D7 |
yungsung | 0:fcd980d5ee5f | 30 | #define laserPin PA_3 // D4 |
yungsung | 0:fcd980d5ee5f | 31 | #define SERVO_PIN PD_14 // D2 |
yungsung | 0:fcd980d5ee5f | 32 | #define buzzerPin PA_2 // D10 |
yungsung | 0:fcd980d5ee5f | 33 | #define trigPin PB_4 // D5 |
yungsung | 0:fcd980d5ee5f | 34 | #define echoPin PB_1 // D6 |
yungsung | 0:fcd980d5ee5f | 35 | #define CDSPin A0 // light sensor in pin A0 |
yungsung | 0:fcd980d5ee5f | 36 | |
yungsung | 0:fcd980d5ee5f | 37 | DigitalOut alivenessLED(LED1, 0); |
yungsung | 0:fcd980d5ee5f | 38 | DigitalOut actuatedLED(LED2, 0); |
yungsung | 0:fcd980d5ee5f | 39 | Serial pc(USBTX, USBRX); |
yungsung | 0:fcd980d5ee5f | 40 | Beep buzzer(buzzerPin); |
yungsung | 0:fcd980d5ee5f | 41 | HCSR04 sonar(trigPin, echoPin); |
yungsung | 0:fcd980d5ee5f | 42 | |
yungsung | 0:fcd980d5ee5f | 43 | // Setup: Pin Mode In/Out |
yungsung | 0:fcd980d5ee5f | 44 | DigitalOut myled(LED1); |
yungsung | 0:fcd980d5ee5f | 45 | DigitalOut out_led(PA_4); |
yungsung | 0:fcd980d5ee5f | 46 | DigitalOut out_laser(PA_3); |
yungsung | 0:fcd980d5ee5f | 47 | PwmOut servoVer(SERVO_PIN); |
yungsung | 0:fcd980d5ee5f | 48 | AnalogIn light_sensor(CDSPin); |
yungsung | 0:fcd980d5ee5f | 49 | |
yungsung | 0:fcd980d5ee5f | 50 | //DisplayData_t size is 6 bytes (6 grids @ 8 segments) |
yungsung | 0:fcd980d5ee5f | 51 | char digits[] = {63,6,91,79,102,109,125,7,127,111}; |
yungsung | 0:fcd980d5ee5f | 52 | char numdigits[4]; |
yungsung | 0:fcd980d5ee5f | 53 | |
yungsung | 0:fcd980d5ee5f | 54 | TM1637::DisplayData_t all_str = {0xFF, 0xFF, 0xFF, 0xFF}; |
yungsung | 0:fcd980d5ee5f | 55 | TM1637::DisplayData_t data_bits = {0xFF, 0xFF, 0xFF, 0xFF}; |
yungsung | 0:fcd980d5ee5f | 56 | |
yungsung | 0:fcd980d5ee5f | 57 | // KeyData_t size is 1 bytes |
yungsung | 0:fcd980d5ee5f | 58 | TM1637::KeyData_t keydata; |
yungsung | 0:fcd980d5ee5f | 59 | |
yungsung | 0:fcd980d5ee5f | 60 | // TM1637 declaration, Select the desired type in TM1637_Config.h |
yungsung | 0:fcd980d5ee5f | 61 | TM1637 CATALEX(DIO, CLK); //F401 |
yungsung | 0:fcd980d5ee5f | 62 | |
yungsung | 0:fcd980d5ee5f | 63 | |
yungsung | 0:fcd980d5ee5f | 64 | // Declare: Global Variables |
yungsung | 0:fcd980d5ee5f | 65 | long duration, cm, inches; |
yungsung | 0:fcd980d5ee5f | 66 | float my_dist[21]; |
yungsung | 0:fcd980d5ee5f | 67 | int16_t remain = 5; |
yungsung | 0:fcd980d5ee5f | 68 | const float start_pos = 120.0; |
yungsung | 0:fcd980d5ee5f | 69 | const float end_pos = 60.0; |
yungsung | 0:fcd980d5ee5f | 70 | int CDSVal; // initial value for light sensor = 0 |
yungsung | 0:fcd980d5ee5f | 71 | |
yungsung | 0:fcd980d5ee5f | 72 | // TODO: replace the virtual timing with RTC clock |
yungsung | 0:fcd980d5ee5f | 73 | int hr = 15; |
yungsung | 0:fcd980d5ee5f | 74 | int minutes = 35; |
yungsung | 0:fcd980d5ee5f | 75 | int sec = 40; |
yungsung | 0:fcd980d5ee5f | 76 | |
yungsung | 0:fcd980d5ee5f | 77 | const static char DEVICE_NAME[] = "AwesomeAlarm"; |
yungsung | 0:fcd980d5ee5f | 78 | static const uint16_t uuid16_list[] = {LEDService::LED_SERVICE_UUID}; |
yungsung | 0:fcd980d5ee5f | 79 | int i = 0; |
yungsung | 0:fcd980d5ee5f | 80 | int ble_read_value = 0; |
yungsung | 0:fcd980d5ee5f | 81 | static EventQueue eventQueue(/* event count */ 10 * EVENTS_EVENT_SIZE); |
yungsung | 0:fcd980d5ee5f | 82 | bool end_ring = 0; |
yungsung | 0:fcd980d5ee5f | 83 | bool display_time = 1; |
yungsung | 0:fcd980d5ee5f | 84 | // Define Threads |
yungsung | 0:fcd980d5ee5f | 85 | Thread* thread_ring = new Thread(); // ring tone while waiting for laser gun shot |
yungsung | 0:fcd980d5ee5f | 86 | Thread* thread_ble = new Thread(); // read ble while main program is executed |
yungsung | 0:fcd980d5ee5f | 87 | Thread* thread_scan = new Thread(); // scan the distance while count the time |
yungsung | 0:fcd980d5ee5f | 88 | Thread* thread_time = new Thread(); // ount the time and display it when main program is running |
yungsung | 0:fcd980d5ee5f | 89 | |
yungsung | 0:fcd980d5ee5f | 90 | LEDService *ledServicePtr; |
yungsung | 0:fcd980d5ee5f | 91 | |
yungsung | 0:fcd980d5ee5f | 92 | // Function: Buzzer Beep ring |
yungsung | 0:fcd980d5ee5f | 93 | void ringTone() { |
yungsung | 0:fcd980d5ee5f | 94 | int num = 10; |
yungsung | 0:fcd980d5ee5f | 95 | for (int j=0; j<num; j++) { //repeat num times |
yungsung | 0:fcd980d5ee5f | 96 | for (int i=0; i<10; i++) { //repeat 10 times |
yungsung | 0:fcd980d5ee5f | 97 | buzzer.beep(1000,0.05); |
yungsung | 0:fcd980d5ee5f | 98 | wait(0.05); |
yungsung | 0:fcd980d5ee5f | 99 | buzzer.beep(500,0.05); |
yungsung | 0:fcd980d5ee5f | 100 | wait(0.05); |
yungsung | 0:fcd980d5ee5f | 101 | } |
yungsung | 0:fcd980d5ee5f | 102 | buzzer.nobeep(); |
yungsung | 0:fcd980d5ee5f | 103 | wait(2); |
yungsung | 0:fcd980d5ee5f | 104 | if (end_ring) { |
yungsung | 0:fcd980d5ee5f | 105 | end_ring = 0; |
yungsung | 0:fcd980d5ee5f | 106 | break; |
yungsung | 0:fcd980d5ee5f | 107 | } |
yungsung | 0:fcd980d5ee5f | 108 | } |
yungsung | 0:fcd980d5ee5f | 109 | } |
yungsung | 0:fcd980d5ee5f | 110 | |
yungsung | 0:fcd980d5ee5f | 111 | // Function convert digits to data bits and write to TM1637 |
yungsung | 0:fcd980d5ee5f | 112 | void write_digits(int num){ |
yungsung | 0:fcd980d5ee5f | 113 | int i=0; |
yungsung | 0:fcd980d5ee5f | 114 | while(i<4) |
yungsung | 0:fcd980d5ee5f | 115 | { |
yungsung | 0:fcd980d5ee5f | 116 | int digit = num % 10; |
yungsung | 0:fcd980d5ee5f | 117 | num = num / 10; |
yungsung | 0:fcd980d5ee5f | 118 | numdigits[i]=digit; |
yungsung | 0:fcd980d5ee5f | 119 | i++; |
yungsung | 0:fcd980d5ee5f | 120 | } |
yungsung | 0:fcd980d5ee5f | 121 | TM1637::DisplayData_t dat = {digits[numdigits[3]],digits[numdigits[2]],digits[numdigits[1]],digits[numdigits[0]]}; |
yungsung | 0:fcd980d5ee5f | 122 | CATALEX.writeData(dat); |
yungsung | 0:fcd980d5ee5f | 123 | } |
yungsung | 0:fcd980d5ee5f | 124 | |
yungsung | 0:fcd980d5ee5f | 125 | |
yungsung | 0:fcd980d5ee5f | 126 | // Function to write Servo motor by degrees |
yungsung | 0:fcd980d5ee5f | 127 | void write_servo(int degree){ |
yungsung | 0:fcd980d5ee5f | 128 | servoVer.pulsewidth(0.0009+(0.0033-0.0009)*degree/240.0); |
yungsung | 0:fcd980d5ee5f | 129 | } |
yungsung | 0:fcd980d5ee5f | 130 | |
yungsung | 0:fcd980d5ee5f | 131 | // Function: measure distance |
yungsung | 0:fcd980d5ee5f | 132 | void scan(){ |
yungsung | 0:fcd980d5ee5f | 133 | float dis = 0; |
yungsung | 0:fcd980d5ee5f | 134 | int idx = 0; |
yungsung | 0:fcd980d5ee5f | 135 | for(int i=start_pos; i>=end_pos; i-=5.0) { |
yungsung | 0:fcd980d5ee5f | 136 | write_servo(i); |
yungsung | 0:fcd980d5ee5f | 137 | wait(1); |
yungsung | 0:fcd980d5ee5f | 138 | dis = sonar.getCm(); |
yungsung | 0:fcd980d5ee5f | 139 | if (dis < 20.0){ |
yungsung | 0:fcd980d5ee5f | 140 | wait(1); |
yungsung | 0:fcd980d5ee5f | 141 | dis = sonar.getCm(); |
yungsung | 0:fcd980d5ee5f | 142 | } |
yungsung | 0:fcd980d5ee5f | 143 | printf("Angle %d degree ", i); |
yungsung | 0:fcd980d5ee5f | 144 | printf("Distance %.2f cm \n", dis); |
yungsung | 0:fcd980d5ee5f | 145 | my_dist[idx] = dis; |
yungsung | 0:fcd980d5ee5f | 146 | idx += 1; |
yungsung | 0:fcd980d5ee5f | 147 | } |
yungsung | 0:fcd980d5ee5f | 148 | } |
yungsung | 0:fcd980d5ee5f | 149 | |
yungsung | 0:fcd980d5ee5f | 150 | // Function: measure distance |
yungsung | 0:fcd980d5ee5f | 151 | void lowest(){ |
yungsung | 0:fcd980d5ee5f | 152 | float dis = 0.0; |
yungsung | 0:fcd980d5ee5f | 153 | int idx = 0; |
yungsung | 0:fcd980d5ee5f | 154 | float new_dist = 0; |
yungsung | 0:fcd980d5ee5f | 155 | float maximum = 0; |
yungsung | 0:fcd980d5ee5f | 156 | int maximum_t = 0; |
yungsung | 0:fcd980d5ee5f | 157 | int max_angle = 0; |
yungsung | 0:fcd980d5ee5f | 158 | for(int i=start_pos; i>=end_pos; i-=5.0) { |
yungsung | 0:fcd980d5ee5f | 159 | write_servo(i); |
yungsung | 0:fcd980d5ee5f | 160 | wait(1); |
yungsung | 0:fcd980d5ee5f | 161 | dis = sonar.getCm(); |
yungsung | 0:fcd980d5ee5f | 162 | if (dis < 20.0){ |
yungsung | 0:fcd980d5ee5f | 163 | printf("Distance %.2f cm , is too short\n", dis); |
yungsung | 0:fcd980d5ee5f | 164 | wait(1); |
yungsung | 0:fcd980d5ee5f | 165 | dis = sonar.getCm(); |
yungsung | 0:fcd980d5ee5f | 166 | } |
yungsung | 0:fcd980d5ee5f | 167 | printf("Angle %d degree ", i); |
yungsung | 0:fcd980d5ee5f | 168 | printf("Distance %.2f cm ", dis); |
yungsung | 0:fcd980d5ee5f | 169 | printf("Origin %.2f cm ", my_dist[idx]); |
yungsung | 0:fcd980d5ee5f | 170 | new_dist = my_dist[idx] - dis; |
yungsung | 0:fcd980d5ee5f | 171 | printf("Diff %.2f cm \n", new_dist); |
yungsung | 0:fcd980d5ee5f | 172 | if (new_dist > maximum && new_dist < 20.0){ |
yungsung | 0:fcd980d5ee5f | 173 | maximum = new_dist; |
yungsung | 0:fcd980d5ee5f | 174 | maximum_t = idx; |
yungsung | 0:fcd980d5ee5f | 175 | max_angle = i; |
yungsung | 0:fcd980d5ee5f | 176 | } |
yungsung | 0:fcd980d5ee5f | 177 | idx += 1; |
yungsung | 0:fcd980d5ee5f | 178 | } |
yungsung | 0:fcd980d5ee5f | 179 | printf("MIN Angle %d degree ", 120- 5*maximum_t); |
yungsung | 0:fcd980d5ee5f | 180 | printf("MIN Distance %.2f cm ", maximum); |
yungsung | 0:fcd980d5ee5f | 181 | printf("MIN Origin %.2f cm\n", my_dist[maximum_t]); |
yungsung | 0:fcd980d5ee5f | 182 | idx = 0; |
yungsung | 0:fcd980d5ee5f | 183 | write_servo(max_angle); |
yungsung | 0:fcd980d5ee5f | 184 | } |
yungsung | 0:fcd980d5ee5f | 185 | |
yungsung | 0:fcd980d5ee5f | 186 | void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) |
yungsung | 0:fcd980d5ee5f | 187 | { |
yungsung | 0:fcd980d5ee5f | 188 | (void) params; |
yungsung | 0:fcd980d5ee5f | 189 | BLE::Instance().gap().startAdvertising(); |
yungsung | 0:fcd980d5ee5f | 190 | } |
yungsung | 0:fcd980d5ee5f | 191 | |
yungsung | 0:fcd980d5ee5f | 192 | void blinkCallback(void) |
yungsung | 0:fcd980d5ee5f | 193 | { |
yungsung | 0:fcd980d5ee5f | 194 | alivenessLED = !alivenessLED; /* Do blinky on LED1 to indicate system aliveness. */ |
yungsung | 0:fcd980d5ee5f | 195 | // pc.printf("CallBack!\n"); |
yungsung | 0:fcd980d5ee5f | 196 | } |
yungsung | 0:fcd980d5ee5f | 197 | |
yungsung | 0:fcd980d5ee5f | 198 | /** |
yungsung | 0:fcd980d5ee5f | 199 | * This callback allows the LEDService to receive updates to the ledState Characteristic. |
yungsung | 0:fcd980d5ee5f | 200 | * |
yungsung | 0:fcd980d5ee5f | 201 | * @param[in] params |
yungsung | 0:fcd980d5ee5f | 202 | * Information about the characterisitc being updated. |
yungsung | 0:fcd980d5ee5f | 203 | */ |
yungsung | 0:fcd980d5ee5f | 204 | void onDataWrittenCallback(const GattWriteCallbackParams *params) { |
yungsung | 0:fcd980d5ee5f | 205 | |
yungsung | 0:fcd980d5ee5f | 206 | ble_read_value = *(params->data); |
yungsung | 0:fcd980d5ee5f | 207 | if ((params->handle == ledServicePtr->getValueHandle())) { |
yungsung | 0:fcd980d5ee5f | 208 | actuatedLED = *(params->data); |
yungsung | 0:fcd980d5ee5f | 209 | pc.printf("\nSet Values: "); |
yungsung | 0:fcd980d5ee5f | 210 | pc.printf("%d ", *(params->data)); |
yungsung | 0:fcd980d5ee5f | 211 | pc.printf("Length: %d", params->len); |
yungsung | 0:fcd980d5ee5f | 212 | pc.printf("\n"); |
yungsung | 0:fcd980d5ee5f | 213 | } else{ |
yungsung | 0:fcd980d5ee5f | 214 | pc.printf("\nFailed to Set Values: "); |
yungsung | 0:fcd980d5ee5f | 215 | pc.printf("%d ", *(params->data)); |
yungsung | 0:fcd980d5ee5f | 216 | pc.printf("Length: %d", params->len); |
yungsung | 0:fcd980d5ee5f | 217 | pc.printf("\n"); |
yungsung | 0:fcd980d5ee5f | 218 | } |
yungsung | 0:fcd980d5ee5f | 219 | |
yungsung | 0:fcd980d5ee5f | 220 | } |
yungsung | 0:fcd980d5ee5f | 221 | |
yungsung | 0:fcd980d5ee5f | 222 | /** |
yungsung | 0:fcd980d5ee5f | 223 | * This function is called when the ble initialization process has failled |
yungsung | 0:fcd980d5ee5f | 224 | */ |
yungsung | 0:fcd980d5ee5f | 225 | void onBleInitError(BLE &ble, ble_error_t error) |
yungsung | 0:fcd980d5ee5f | 226 | { |
yungsung | 0:fcd980d5ee5f | 227 | /* Initialization error handling should go here */ |
yungsung | 0:fcd980d5ee5f | 228 | } |
yungsung | 0:fcd980d5ee5f | 229 | |
yungsung | 0:fcd980d5ee5f | 230 | /** |
yungsung | 0:fcd980d5ee5f | 231 | * Callback triggered when the ble initialization process has finished |
yungsung | 0:fcd980d5ee5f | 232 | */ |
yungsung | 0:fcd980d5ee5f | 233 | void bleInitComplete(BLE::InitializationCompleteCallbackContext *params) |
yungsung | 0:fcd980d5ee5f | 234 | { |
yungsung | 0:fcd980d5ee5f | 235 | BLE& ble = params->ble; |
yungsung | 0:fcd980d5ee5f | 236 | ble_error_t error = params->error; |
yungsung | 0:fcd980d5ee5f | 237 | |
yungsung | 0:fcd980d5ee5f | 238 | if (error != BLE_ERROR_NONE) { |
yungsung | 0:fcd980d5ee5f | 239 | /* In case of error, forward the error handling to onBleInitError */ |
yungsung | 0:fcd980d5ee5f | 240 | onBleInitError(ble, error); |
yungsung | 0:fcd980d5ee5f | 241 | return; |
yungsung | 0:fcd980d5ee5f | 242 | } |
yungsung | 0:fcd980d5ee5f | 243 | |
yungsung | 0:fcd980d5ee5f | 244 | /* Ensure that it is the default instance of BLE */ |
yungsung | 0:fcd980d5ee5f | 245 | if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) { |
yungsung | 0:fcd980d5ee5f | 246 | return; |
yungsung | 0:fcd980d5ee5f | 247 | } |
yungsung | 0:fcd980d5ee5f | 248 | |
yungsung | 0:fcd980d5ee5f | 249 | ble.gap().onDisconnection(disconnectionCallback); |
yungsung | 0:fcd980d5ee5f | 250 | ble.gattServer().onDataWritten(onDataWrittenCallback); |
yungsung | 0:fcd980d5ee5f | 251 | |
yungsung | 0:fcd980d5ee5f | 252 | bool initialValueForLEDCharacteristic = false; |
yungsung | 0:fcd980d5ee5f | 253 | ledServicePtr = new LEDService(ble, initialValueForLEDCharacteristic); |
yungsung | 0:fcd980d5ee5f | 254 | |
yungsung | 0:fcd980d5ee5f | 255 | /* setup advertising */ |
yungsung | 0:fcd980d5ee5f | 256 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); |
yungsung | 0:fcd980d5ee5f | 257 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list)); |
yungsung | 0:fcd980d5ee5f | 258 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); |
yungsung | 0:fcd980d5ee5f | 259 | ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
yungsung | 0:fcd980d5ee5f | 260 | ble.gap().setAdvertisingInterval(1000); /* 1000ms. */ |
yungsung | 0:fcd980d5ee5f | 261 | ble.gap().startAdvertising(); |
yungsung | 0:fcd980d5ee5f | 262 | } |
yungsung | 0:fcd980d5ee5f | 263 | |
yungsung | 0:fcd980d5ee5f | 264 | void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) { |
yungsung | 0:fcd980d5ee5f | 265 | BLE &ble = BLE::Instance(); |
yungsung | 0:fcd980d5ee5f | 266 | eventQueue.call(Callback<void()>(&ble, &BLE::processEvents)); |
yungsung | 0:fcd980d5ee5f | 267 | } |
yungsung | 0:fcd980d5ee5f | 268 | |
yungsung | 0:fcd980d5ee5f | 269 | void run_ble(){ |
yungsung | 0:fcd980d5ee5f | 270 | |
yungsung | 0:fcd980d5ee5f | 271 | BLE &ble = BLE::Instance(); |
yungsung | 0:fcd980d5ee5f | 272 | ble.onEventsToProcess(scheduleBleEventsProcessing); |
yungsung | 0:fcd980d5ee5f | 273 | ble.init(bleInitComplete); |
yungsung | 0:fcd980d5ee5f | 274 | |
yungsung | 0:fcd980d5ee5f | 275 | eventQueue.dispatch_forever(); |
yungsung | 0:fcd980d5ee5f | 276 | } |
yungsung | 0:fcd980d5ee5f | 277 | |
yungsung | 0:fcd980d5ee5f | 278 | void count_time() { |
yungsung | 0:fcd980d5ee5f | 279 | while(1){ |
yungsung | 0:fcd980d5ee5f | 280 | wait(1); |
yungsung | 0:fcd980d5ee5f | 281 | sec = sec + 1; |
yungsung | 0:fcd980d5ee5f | 282 | if (sec == 60){ |
yungsung | 0:fcd980d5ee5f | 283 | minutes = minutes + 1; |
yungsung | 0:fcd980d5ee5f | 284 | sec = 0; |
yungsung | 0:fcd980d5ee5f | 285 | } |
yungsung | 0:fcd980d5ee5f | 286 | if (minutes == 60) { |
yungsung | 0:fcd980d5ee5f | 287 | hr = hr + 1; |
yungsung | 0:fcd980d5ee5f | 288 | minutes = 0; |
yungsung | 0:fcd980d5ee5f | 289 | } |
yungsung | 0:fcd980d5ee5f | 290 | if (hr == 24) { |
yungsung | 0:fcd980d5ee5f | 291 | hr = 0; |
yungsung | 0:fcd980d5ee5f | 292 | } |
yungsung | 0:fcd980d5ee5f | 293 | if (display_time) |
yungsung | 0:fcd980d5ee5f | 294 | write_digits(100*hr + minutes); |
yungsung | 0:fcd980d5ee5f | 295 | } |
yungsung | 0:fcd980d5ee5f | 296 | |
yungsung | 0:fcd980d5ee5f | 297 | } |
yungsung | 0:fcd980d5ee5f | 298 | |
yungsung | 0:fcd980d5ee5f | 299 | |
yungsung | 0:fcd980d5ee5f | 300 | int main() |
yungsung | 0:fcd980d5ee5f | 301 | { |
yungsung | 0:fcd980d5ee5f | 302 | eventQueue.call_every(500, blinkCallback); |
yungsung | 0:fcd980d5ee5f | 303 | pc.printf("\nHelloWorld!\n"); |
yungsung | 0:fcd980d5ee5f | 304 | thread_ble->start(run_ble); |
yungsung | 0:fcd980d5ee5f | 305 | thread_time->start(count_time); |
yungsung | 0:fcd980d5ee5f | 306 | |
yungsung | 0:fcd980d5ee5f | 307 | pc.printf("BLE Setup Done!\n"); |
yungsung | 0:fcd980d5ee5f | 308 | |
yungsung | 0:fcd980d5ee5f | 309 | CATALEX.cls(); |
yungsung | 0:fcd980d5ee5f | 310 | CATALEX.writeData(all_str); |
yungsung | 0:fcd980d5ee5f | 311 | CATALEX.setBrightness(TM1637_BRT3); |
yungsung | 0:fcd980d5ee5f | 312 | |
yungsung | 0:fcd980d5ee5f | 313 | // Start infine loop! |
yungsung | 0:fcd980d5ee5f | 314 | while(1){ |
yungsung | 0:fcd980d5ee5f | 315 | while (ble_read_value==0){ |
yungsung | 0:fcd980d5ee5f | 316 | pc.printf("Waiting for write...\n"); |
yungsung | 0:fcd980d5ee5f | 317 | wait(1); |
yungsung | 0:fcd980d5ee5f | 318 | } |
yungsung | 0:fcd980d5ee5f | 319 | thread_scan->start(scan); |
yungsung | 0:fcd980d5ee5f | 320 | display_time = 0; |
yungsung | 0:fcd980d5ee5f | 321 | for(remain=ble_read_value;remain>=0;remain--) |
yungsung | 0:fcd980d5ee5f | 322 | { |
yungsung | 0:fcd980d5ee5f | 323 | write_digits(remain); |
yungsung | 0:fcd980d5ee5f | 324 | wait(1); |
yungsung | 0:fcd980d5ee5f | 325 | } |
yungsung | 0:fcd980d5ee5f | 326 | lowest(); |
yungsung | 0:fcd980d5ee5f | 327 | display_time = 1; |
yungsung | 0:fcd980d5ee5f | 328 | thread_ring->start(ringTone); |
yungsung | 0:fcd980d5ee5f | 329 | out_led = 1; |
yungsung | 0:fcd980d5ee5f | 330 | out_laser = 1; |
yungsung | 0:fcd980d5ee5f | 331 | // printf("RTC example\n"); |
yungsung | 0:fcd980d5ee5f | 332 | // set_time(1387188323); // Set RTC time to 16 December 2013 10:05:23 UTC |
yungsung | 0:fcd980d5ee5f | 333 | // printf("Date and time are set.\n"); |
yungsung | 0:fcd980d5ee5f | 334 | |
yungsung | 0:fcd980d5ee5f | 335 | while(1) { |
yungsung | 0:fcd980d5ee5f | 336 | |
yungsung | 0:fcd980d5ee5f | 337 | time_t seconds = time(NULL); |
yungsung | 0:fcd980d5ee5f | 338 | |
yungsung | 0:fcd980d5ee5f | 339 | //printf("Time as seconds since January 1, 1970 = %d\n", seconds); |
yungsung | 0:fcd980d5ee5f | 340 | |
yungsung | 0:fcd980d5ee5f | 341 | printf("Time as a basic string = %s", ctime(&seconds)); |
yungsung | 0:fcd980d5ee5f | 342 | |
yungsung | 0:fcd980d5ee5f | 343 | CDSVal = light_sensor.read_u16()/100; |
yungsung | 0:fcd980d5ee5f | 344 | pc.printf("READ %d", CDSVal); |
yungsung | 0:fcd980d5ee5f | 345 | if (CDSVal<100) {break;} |
yungsung | 0:fcd980d5ee5f | 346 | |
yungsung | 0:fcd980d5ee5f | 347 | //char buffer[32]; |
yungsung | 0:fcd980d5ee5f | 348 | //strftime(buffer, 32, "%I:%M:%S %p\n", localtime(&seconds)); |
yungsung | 0:fcd980d5ee5f | 349 | //printf("Time as a custom formatted string = %s", buffer); |
yungsung | 0:fcd980d5ee5f | 350 | |
yungsung | 0:fcd980d5ee5f | 351 | myled = !myled; |
yungsung | 0:fcd980d5ee5f | 352 | wait(1); |
yungsung | 0:fcd980d5ee5f | 353 | } |
yungsung | 0:fcd980d5ee5f | 354 | end_ring = 1; |
yungsung | 0:fcd980d5ee5f | 355 | out_led = 0; |
yungsung | 0:fcd980d5ee5f | 356 | out_laser = 0; |
yungsung | 0:fcd980d5ee5f | 357 | ble_read_value=0; |
yungsung | 0:fcd980d5ee5f | 358 | thread_ring->join(); |
yungsung | 0:fcd980d5ee5f | 359 | thread_scan->join(); |
yungsung | 0:fcd980d5ee5f | 360 | delete thread_ring; |
yungsung | 0:fcd980d5ee5f | 361 | delete thread_scan; |
yungsung | 0:fcd980d5ee5f | 362 | thread_ring = new Thread(); |
yungsung | 0:fcd980d5ee5f | 363 | thread_scan = new Thread(); |
yungsung | 0:fcd980d5ee5f | 364 | } |
yungsung | 0:fcd980d5ee5f | 365 | } |