Add I2CSlave to ov580 master.

Dependencies:   MorseGenerator2

Committer:
claytonk
Date:
Mon Mar 11 00:14:12 2019 +0000
Revision:
14:5590fcd73be4
Parent:
13:2b83989d136c
Child:
15:86cc61deeb3e
new currents given 3/8

Who changed what in which revision?

UserRevisionLine numberNew contents of line
claytonk 7:9c77eaad5102 1 #define TWIS1_ENABLED 1
claytonk 7:9c77eaad5102 2 #define TWIS0_ENABLED 0
claytonk 7:9c77eaad5102 3 #define TWIS_ENABLED 1
claytonk 7:9c77eaad5102 4 #define TWI0_ENABLED 1
claytonk 7:9c77eaad5102 5 #define TWI1_ENABLED 0
claytonk 7:9c77eaad5102 6 #define TWI0_USE_EASY_DMA 1
claytonk 7:9c77eaad5102 7 #define TWI1_USE_EASY_DMA 1
claytonk 7:9c77eaad5102 8 #define TWI_DEFAULT_CONFIG_FREQUENCY 104857600
claytonk 7:9c77eaad5102 9 #define ARDUINO_A4_PIN 14
claytonk 7:9c77eaad5102 10 #define ARDUINO_A5_PIN 15
claytonk 7:9c77eaad5102 11
claytonk 7:9c77eaad5102 12
claytonk 0:605fe136b7ea 13 #include "mbed.h"
claytonk 7:9c77eaad5102 14 //#include <nrfx_config.h> need SDK config instead
claytonk 7:9c77eaad5102 15 //#include "sdk_config.h" not needed now
claytonk 0:605fe136b7ea 16
claytonk 0:605fe136b7ea 17 /*
claytonk 0:605fe136b7ea 18 FEATURE REQUIREMENTS
claytonk 0:605fe136b7ea 19
claytonk 3:6b14862f5f51 20 - I2C write occurs on falling edge of strobe pulse to prevent unknown states
claytonk 3:6b14862f5f51 21
claytonk 3:6b14862f5f51 22 - Stack check occurs on leading edge of strobe pulse to ensure strobes are
claytonk 3:6b14862f5f51 23 set correctly
claytonk 0:605fe136b7ea 24
claytonk 3:6b14862f5f51 25 - Reoccuring enable from app that will prevent the emitters from remaining
claytonk 3:6b14862f5f51 26 on if the app crashes and a turn off command isn't sent
claytonk 0:605fe136b7ea 27 - Can be a counter on the emitter enable > threshold
claytonk 3:6b14862f5f51 28 - Better if it's a counter based on reads from the fault register
claytonk 0:605fe136b7ea 29
claytonk 9:69e0bbfdb62b 30 -Flood/Dot tagging indicated on GPIO3 / PWM0
claytonk 0:605fe136b7ea 31 - 0 Flood
claytonk 0:605fe136b7ea 32 - 1 DOT
claytonk 0:605fe136b7ea 33
claytonk 9:69e0bbfdb62b 34 -Fault indication on GPIO4 / PWM1 to indicate to app to reboot
claytonk 0:605fe136b7ea 35 - 0 OK
claytonk 0:605fe136b7ea 36 - 1 Fault/Reboot
claytonk 0:605fe136b7ea 37
claytonk 0:605fe136b7ea 38 I2C write commands
claytonk 0:605fe136b7ea 39 Reg: Information Condition
claytonk 4:fc0c93cb0197 40 0x0000 Emitter enable 0x00 Emitters off
claytonk 0:605fe136b7ea 41 0x01 Dot on
claytonk 0:605fe136b7ea 42 0x10 Flood on
claytonk 0:605fe136b7ea 43 0x11 Flood / Dot on
claytonk 0:605fe136b7ea 44
claytonk 4:fc0c93cb0197 45 0x0001 Dot fault Read from LM36011
claytonk 0:605fe136b7ea 46
claytonk 4:fc0c93cb0197 47 0x0002 Dot Current 0x00 - level_dot_max
claytonk 3:6b14862f5f51 48
claytonk 4:fc0c93cb0197 49 0x0003 Flood Fault Read from LM36011
claytonk 3:6b14862f5f51 50
claytonk 4:fc0c93cb0197 51 0x0004 Flood Current 0x00 - level_flood_max
claytonk 0:605fe136b7ea 52
claytonk 4:fc0c93cb0197 53 0x0005 Fault register bit[0] KILL_VCSEL fault
claytonk 3:6b14862f5f51 54 bit[1] dot fault
claytonk 3:6b14862f5f51 55 bit[2] flood fault
claytonk 3:6b14862f5f51 56 bit[3] unstacked fault
claytonk 3:6b14862f5f51 57 bit[4] ?not in app fault?
claytonk 3:6b14862f5f51 58 bit[5-7] unused
claytonk 3:6b14862f5f51 59
claytonk 3:6b14862f5f51 60
claytonk 4:fc0c93cb0197 61 0x0006 Version number 0x70 = version 7.0
claytonk 0:605fe136b7ea 62
claytonk 13:2b83989d136c 63 */
claytonk 9:69e0bbfdb62b 64 /* ERROR CHECKING */
claytonk 0:605fe136b7ea 65
claytonk 7:9c77eaad5102 66 #if (TWIS0_ENABLED == 1)
claytonk 7:9c77eaad5102 67 #error TWIS0 is congigured wrong
claytonk 7:9c77eaad5102 68 #endif
claytonk 7:9c77eaad5102 69
claytonk 7:9c77eaad5102 70 #if (TWIS1_ENABLED == 0)
claytonk 7:9c77eaad5102 71 #error TWIS1 is off
claytonk 7:9c77eaad5102 72 #endif
claytonk 6:85d9ad912c14 73
claytonk 7:9c77eaad5102 74 #if (TWIS_ENABLED == 0)
claytonk 7:9c77eaad5102 75 #error TWIS is off
claytonk 7:9c77eaad5102 76 #endif
claytonk 6:85d9ad912c14 77
claytonk 7:9c77eaad5102 78 #if (TWI0_ENABLED == 0)
claytonk 7:9c77eaad5102 79 #error TWI0 is off
claytonk 7:9c77eaad5102 80 #endif
claytonk 7:9c77eaad5102 81
claytonk 7:9c77eaad5102 82 #if (TWI1_ENABLED == 1)
claytonk 7:9c77eaad5102 83 #error TWI1 is congigured wrong
claytonk 7:9c77eaad5102 84 #endif
claytonk 6:85d9ad912c14 85
claytonk 3:6b14862f5f51 86 /* DEFINES */
claytonk 3:6b14862f5f51 87
claytonk 3:6b14862f5f51 88 #define version_number 0x70
claytonk 3:6b14862f5f51 89
claytonk 13:2b83989d136c 90
claytonk 13:2b83989d136c 91
claytonk 0:605fe136b7ea 92 // define pins for I2C
claytonk 0:605fe136b7ea 93 #define dot_sda p2
claytonk 0:605fe136b7ea 94 #define dot_scl p4
claytonk 0:605fe136b7ea 95 #define flood_sda p28
claytonk 0:605fe136b7ea 96 #define flood_scl p3
claytonk 0:605fe136b7ea 97 #define ov580_sda p30
claytonk 0:605fe136b7ea 98 #define ov580_scl p31
claytonk 3:6b14862f5f51 99
claytonk 3:6b14862f5f51 100 // define strobe pins
claytonk 9:69e0bbfdb62b 101 #define strobe_flood p23 // strobe0
claytonk 9:69e0bbfdb62b 102 #define strobe_dot p24 // strobe1
claytonk 3:6b14862f5f51 103
claytonk 3:6b14862f5f51 104 // define pmw pins
claytonk 0:605fe136b7ea 105 #define pwm_1_pin p29
claytonk 0:605fe136b7ea 106 #define pwm_0_pin p5
claytonk 0:605fe136b7ea 107
claytonk 13:2b83989d136c 108 // define stacked irq pin
claytonk 13:2b83989d136c 109 #define stacked_irq_pin p11
claytonk 13:2b83989d136c 110
claytonk 13:2b83989d136c 111 // define silego enable pin
claytonk 13:2b83989d136c 112 #define silego_en_pin p26 // needs to be pulled high for Silego
claytonk 13:2b83989d136c 113
claytonk 13:2b83989d136c 114 // define dot/flood status pin
claytonk 13:2b83989d136c 115 #define dot_flood_status_pin p27
claytonk 13:2b83989d136c 116
claytonk 13:2b83989d136c 117 // define VCSEL Fault
claytonk 13:2b83989d136c 118 #define vcselFault_pin p25
claytonk 13:2b83989d136c 119
claytonk 0:605fe136b7ea 120 // define LED pins
claytonk 13:2b83989d136c 121 #define ledRed_pin p12
claytonk 13:2b83989d136c 122 #define ledGreen_pin p17
claytonk 13:2b83989d136c 123 #define ledBlue_pin p13
claytonk 13:2b83989d136c 124
claytonk 13:2b83989d136c 125
claytonk 13:2b83989d136c 126 static float dot_zero_ms = 1;
claytonk 14:5590fcd73be4 127 static float dot_one_ms = 410;
claytonk 13:2b83989d136c 128 static float dot_two_ms = 354;
claytonk 14:5590fcd73be4 129 static float dot_three_ms = 294;
claytonk 14:5590fcd73be4 130 static float dot_four_ms = 294;
claytonk 14:5590fcd73be4 131 static float dot_five_ms = 294;
claytonk 13:2b83989d136c 132 static float flood_zero_ms = 1;
claytonk 14:5590fcd73be4 133 static float flood_one_ms = 610;
claytonk 14:5590fcd73be4 134 static float flood_two_ms = 420;
claytonk 14:5590fcd73be4 135 static float flood_three_ms = 270;
claytonk 14:5590fcd73be4 136 static float flood_four_ms = 270;
claytonk 14:5590fcd73be4 137 static float flood_five_ms = 270;
claytonk 0:605fe136b7ea 138
claytonk 4:fc0c93cb0197 139 /* THREAD */
claytonk 4:fc0c93cb0197 140 EventQueue queue;
claytonk 4:fc0c93cb0197 141
claytonk 6:85d9ad912c14 142 /* TIMOUT */
claytonk 8:10ffd42a3921 143 Timeout dot_timeout;
claytonk 8:10ffd42a3921 144 Timeout flood_timeout;
claytonk 9:69e0bbfdb62b 145 Timeout app_timeout;
claytonk 6:85d9ad912c14 146
claytonk 13:2b83989d136c 147 /* Timers */
claytonk 13:2b83989d136c 148 Timer dot_timer;
claytonk 13:2b83989d136c 149 Timer flood_timer;
claytonk 13:2b83989d136c 150
claytonk 4:fc0c93cb0197 151 /* INTERRUPTS */
claytonk 4:fc0c93cb0197 152 //create interupts
claytonk 4:fc0c93cb0197 153 InterruptIn int_strobe_dot(strobe_dot);
claytonk 13:2b83989d136c 154 InterruptIn int_strobe_flood(strobe_flood);
claytonk 3:6b14862f5f51 155
claytonk 3:6b14862f5f51 156 /* I/O */
claytonk 0:605fe136b7ea 157 // initialize LEDs
claytonk 13:2b83989d136c 158 DigitalOut red(ledRed_pin,1);
claytonk 13:2b83989d136c 159 DigitalOut green(ledGreen_pin,1);
claytonk 13:2b83989d136c 160 DigitalOut blue(ledBlue_pin,1);
claytonk 0:605fe136b7ea 161
claytonk 0:605fe136b7ea 162 // Initialize outputs
claytonk 3:6b14862f5f51 163 DigitalOut pwm_0_output(pwm_0_pin,0); // GPIO 3
claytonk 3:6b14862f5f51 164 DigitalOut pwm_1_output(pwm_1_pin,0); // GPIO 4
claytonk 0:605fe136b7ea 165
claytonk 13:2b83989d136c 166 // Silego
claytonk 13:2b83989d136c 167 DigitalOut silego(silego_en_pin,1); // initialize on
claytonk 13:2b83989d136c 168
claytonk 0:605fe136b7ea 169 // Initialize inputs
claytonk 7:9c77eaad5102 170 DigitalIn strobe0(strobe_flood,PullNone);
claytonk 7:9c77eaad5102 171 DigitalIn strobe1(strobe_dot,PullNone);
claytonk 13:2b83989d136c 172 DigitalIn vcselFault(vcselFault_pin, PullNone);
claytonk 13:2b83989d136c 173 //DigitalIn killVcsel(p26,PullNone);
claytonk 0:605fe136b7ea 174
claytonk 7:9c77eaad5102 175
claytonk 3:6b14862f5f51 176 /* REGISTERS */
claytonk 0:605fe136b7ea 177 static uint8_t LM36011_addr = 0x64 << 1; //0xC8
claytonk 0:605fe136b7ea 178
claytonk 0:605fe136b7ea 179 // register names
claytonk 0:605fe136b7ea 180 static uint8_t enable_reg = 0x01;
claytonk 0:605fe136b7ea 181 static uint8_t configuration_reg = 0x02;
claytonk 0:605fe136b7ea 182 static uint8_t brightness_reg = 0x03;
claytonk 13:2b83989d136c 183 static uint8_t torch_reg = 0x04;
claytonk 13:2b83989d136c 184 static uint8_t flags_reg = 0x05;
claytonk 3:6b14862f5f51 185 //static uint8_t device_id_reset_reg = 0x06;
claytonk 0:605fe136b7ea 186
claytonk 0:605fe136b7ea 187 // register settings
claytonk 0:605fe136b7ea 188 static uint8_t enable_ir = 0x05;
claytonk 0:605fe136b7ea 189 static uint8_t disable_ir = 0x20;
claytonk 0:605fe136b7ea 190 static uint8_t enable_flash_timeout = 0x01;
claytonk 13:2b83989d136c 191 const int thermal_scale_back = 0x08;
claytonk 13:2b83989d136c 192 const int thermal_shutdown = 0x10;
claytonk 0:605fe136b7ea 193
claytonk 0:605fe136b7ea 194 // level settings
claytonk 13:2b83989d136c 195 float divisor = 11.7; // Current / 11.7 = Decimal
claytonk 13:2b83989d136c 196 float dot_current_setting = dot_five_ms;
claytonk 13:2b83989d136c 197 float flood_current_setting = flood_five_ms;
claytonk 13:2b83989d136c 198 uint32_t level_dot_max_dec = uint32_t(dot_current_setting/divisor);
claytonk 13:2b83989d136c 199 uint32_t level_flood_max_dec = uint32_t(flood_current_setting/divisor);
claytonk 13:2b83989d136c 200
claytonk 13:2b83989d136c 201 uint8_t level_dot_max =
claytonk 13:2b83989d136c 202 (((level_dot_max_dec / 16) << 4) & 0xf0) |
claytonk 13:2b83989d136c 203 ((level_dot_max_dec % 16) & 0x0f);
claytonk 13:2b83989d136c 204 uint8_t level_flood_max =
claytonk 13:2b83989d136c 205 (((level_flood_max_dec / 16) << 4) & 0xf0) |
claytonk 13:2b83989d136c 206 ((level_flood_max_dec % 16) & 0x0f);
claytonk 13:2b83989d136c 207
claytonk 0:605fe136b7ea 208
claytonk 3:6b14862f5f51 209 char lm_on[2] = {enable_reg,enable_ir};
claytonk 3:6b14862f5f51 210 char lm_off[2] = {enable_reg,disable_ir};
claytonk 0:605fe136b7ea 211 char lmSafety[2] = {configuration_reg,enable_flash_timeout};
claytonk 0:605fe136b7ea 212
claytonk 13:2b83989d136c 213 char data_read[6];
claytonk 13:2b83989d136c 214
claytonk 0:605fe136b7ea 215 char flashBrightness_dot[2] = {brightness_reg,level_dot_max};
claytonk 0:605fe136b7ea 216 char flashBrightness_flood[2] = {brightness_reg,level_flood_max};
claytonk 13:2b83989d136c 217 char torchBrightness_both[2] = {torch_reg,0x5F};
claytonk 0:605fe136b7ea 218
claytonk 3:6b14862f5f51 219 /* I2C */
claytonk 9:69e0bbfdb62b 220 //I2CSlave ov_I2C(ov580_sda,ov580_scl);
claytonk 0:605fe136b7ea 221 I2C flood_I2C(flood_sda,flood_scl);
claytonk 0:605fe136b7ea 222 I2C dot_I2C(dot_sda,dot_scl);
claytonk 6:85d9ad912c14 223
claytonk 0:605fe136b7ea 224
claytonk 3:6b14862f5f51 225 /* VARIABLES */
claytonk 3:6b14862f5f51 226 bool stacked = false;
claytonk 3:6b14862f5f51 227 bool emitter_status_dot = false;
claytonk 7:9c77eaad5102 228 char rcv_buffer[3] = {0,0,0};
claytonk 8:10ffd42a3921 229 int dot_counter = 0;
claytonk 6:85d9ad912c14 230 bool dot_on = false;
claytonk 8:10ffd42a3921 231 int flood_counter = 0;
claytonk 6:85d9ad912c14 232 bool flood_on = false;
claytonk 6:85d9ad912c14 233 bool once = false;
claytonk 8:10ffd42a3921 234 bool in_app = false;
claytonk 8:10ffd42a3921 235 int app_counts_required = 10;
claytonk 8:10ffd42a3921 236 int stacked_counter = 0;
claytonk 13:2b83989d136c 237 bool read_fail;
claytonk 13:2b83989d136c 238
claytonk 13:2b83989d136c 239 int dot_timer_number;
claytonk 13:2b83989d136c 240 int flood_timer_number;
claytonk 3:6b14862f5f51 241
claytonk 3:6b14862f5f51 242 /* FUNCTIONS */
claytonk 13:2b83989d136c 243 void silego_check_status()
claytonk 13:2b83989d136c 244 {
claytonk 13:2b83989d136c 245 if(pwm_1_output) {
claytonk 13:2b83989d136c 246 silego = 0;
claytonk 13:2b83989d136c 247 wait(.5);
claytonk 13:2b83989d136c 248 silego = 1;
claytonk 13:2b83989d136c 249 }
claytonk 13:2b83989d136c 250 }
claytonk 13:2b83989d136c 251
claytonk 13:2b83989d136c 252
claytonk 13:2b83989d136c 253 void flood_check_status()
claytonk 13:2b83989d136c 254 {
claytonk 13:2b83989d136c 255 int read_fail = flood_I2C.read(LM36011_addr,data_read,6,false);
claytonk 13:2b83989d136c 256 if(read_fail) {
claytonk 13:2b83989d136c 257 red = 0;
claytonk 13:2b83989d136c 258 } else {
claytonk 13:2b83989d136c 259 /*
claytonk 13:2b83989d136c 260 if ((data_read[5]&thermal_shutdown) != 0) {
claytonk 13:2b83989d136c 261 red = 0;
claytonk 13:2b83989d136c 262 } else if((data_read[5]&thermal_scale_back) != 0) {
claytonk 13:2b83989d136c 263 red = !red;
claytonk 13:2b83989d136c 264 } else */{
claytonk 13:2b83989d136c 265 red = 1;
claytonk 13:2b83989d136c 266 }
claytonk 13:2b83989d136c 267 }
claytonk 13:2b83989d136c 268 silego_check_status();
claytonk 13:2b83989d136c 269 }
claytonk 13:2b83989d136c 270
claytonk 13:2b83989d136c 271 void dot_check_status()
claytonk 13:2b83989d136c 272 {
claytonk 13:2b83989d136c 273 int read_fail = dot_I2C.read(LM36011_addr,data_read,6,false);
claytonk 13:2b83989d136c 274 if(read_fail) {
claytonk 13:2b83989d136c 275 green = 0;
claytonk 13:2b83989d136c 276 } else {
claytonk 13:2b83989d136c 277 /*
claytonk 13:2b83989d136c 278 if ((data_read[5]&thermal_shutdown) != 0) {
claytonk 13:2b83989d136c 279 green = 0;
claytonk 13:2b83989d136c 280 } else if((data_read[5]&thermal_scale_back) != 0) {
claytonk 13:2b83989d136c 281 green = !green;
claytonk 13:2b83989d136c 282 } else*/ {
claytonk 13:2b83989d136c 283 green = 1;
claytonk 13:2b83989d136c 284 }
claytonk 13:2b83989d136c 285 }
claytonk 13:2b83989d136c 286 silego_check_status();
claytonk 13:2b83989d136c 287 }
claytonk 1:ffffa383ba7e 288
claytonk 6:85d9ad912c14 289 // WAI
claytonk 6:85d9ad912c14 290 void write_off()
claytonk 6:85d9ad912c14 291 {
claytonk 6:85d9ad912c14 292 dot_I2C.write(LM36011_addr,lm_off,2,false);
claytonk 6:85d9ad912c14 293 flood_I2C.write(LM36011_addr,lm_off,2,false);
claytonk 6:85d9ad912c14 294 }
claytonk 6:85d9ad912c14 295
claytonk 8:10ffd42a3921 296 // WAI
claytonk 6:85d9ad912c14 297 void write_dot()
claytonk 1:ffffa383ba7e 298 {
claytonk 6:85d9ad912c14 299 flood_I2C.write(LM36011_addr,lm_off,2,false);
claytonk 13:2b83989d136c 300 flood_check_status();
claytonk 6:85d9ad912c14 301 dot_I2C.write(LM36011_addr,lm_on,2,false);
claytonk 6:85d9ad912c14 302 }
claytonk 6:85d9ad912c14 303
claytonk 8:10ffd42a3921 304 // WAI
claytonk 6:85d9ad912c14 305 void write_flood()
claytonk 6:85d9ad912c14 306 {
claytonk 6:85d9ad912c14 307 dot_I2C.write(LM36011_addr,lm_off,2,false);
claytonk 13:2b83989d136c 308 dot_check_status();
claytonk 6:85d9ad912c14 309 flood_I2C.write(LM36011_addr,lm_on,2,false);
claytonk 6:85d9ad912c14 310 }
claytonk 6:85d9ad912c14 311
claytonk 8:10ffd42a3921 312 // WAI
claytonk 6:85d9ad912c14 313 void write_pulsed()
claytonk 6:85d9ad912c14 314 {
claytonk 6:85d9ad912c14 315 if(emitter_status_dot) {
claytonk 6:85d9ad912c14 316 write_dot();
claytonk 6:85d9ad912c14 317 } else {
claytonk 6:85d9ad912c14 318 write_flood();
claytonk 6:85d9ad912c14 319 }
claytonk 1:ffffa383ba7e 320 }
claytonk 1:ffffa383ba7e 321
claytonk 8:10ffd42a3921 322 // WAI
claytonk 4:fc0c93cb0197 323 void write_once()
claytonk 4:fc0c93cb0197 324 {
claytonk 8:10ffd42a3921 325 if(in_app) {
claytonk 8:10ffd42a3921 326 if(stacked_counter > app_counts_required) {
claytonk 8:10ffd42a3921 327 write_pulsed();
claytonk 8:10ffd42a3921 328 write_pulsed();
claytonk 4:fc0c93cb0197 329 } else {
claytonk 8:10ffd42a3921 330 if(dot_on) {
claytonk 8:10ffd42a3921 331 write_dot();
claytonk 8:10ffd42a3921 332 write_dot();
claytonk 8:10ffd42a3921 333 } else if(flood_on) {
claytonk 8:10ffd42a3921 334 write_flood();
claytonk 8:10ffd42a3921 335 write_flood();
claytonk 8:10ffd42a3921 336 } else {
claytonk 8:10ffd42a3921 337 write_off();
claytonk 8:10ffd42a3921 338 write_off();
claytonk 8:10ffd42a3921 339 }
claytonk 4:fc0c93cb0197 340 }
claytonk 8:10ffd42a3921 341 } else {
claytonk 8:10ffd42a3921 342 write_off();
claytonk 8:10ffd42a3921 343 write_off();
claytonk 6:85d9ad912c14 344 }
claytonk 6:85d9ad912c14 345 }
claytonk 6:85d9ad912c14 346
claytonk 8:10ffd42a3921 347 void dot_watchdog()
claytonk 6:85d9ad912c14 348 {
claytonk 8:10ffd42a3921 349 dot_on = false;
claytonk 8:10ffd42a3921 350 dot_counter = 0;
claytonk 8:10ffd42a3921 351 stacked_counter = 0;
claytonk 8:10ffd42a3921 352 stacked = false;
claytonk 8:10ffd42a3921 353 queue.call(&write_once);
claytonk 8:10ffd42a3921 354 }
claytonk 8:10ffd42a3921 355
claytonk 8:10ffd42a3921 356 void flood_watchdog()
claytonk 8:10ffd42a3921 357 {
claytonk 8:10ffd42a3921 358 flood_on = false;
claytonk 8:10ffd42a3921 359 flood_counter = 0;
claytonk 8:10ffd42a3921 360 stacked_counter = 0;
claytonk 8:10ffd42a3921 361 stacked = false;
claytonk 8:10ffd42a3921 362 queue.call(&write_once);
claytonk 8:10ffd42a3921 363 }
claytonk 8:10ffd42a3921 364
claytonk 9:69e0bbfdb62b 365 void app_watchdog()
claytonk 9:69e0bbfdb62b 366 {
claytonk 9:69e0bbfdb62b 367 in_app = false;
claytonk 9:69e0bbfdb62b 368 dot_watchdog();
claytonk 9:69e0bbfdb62b 369 flood_watchdog();
claytonk 9:69e0bbfdb62b 370 }
claytonk 9:69e0bbfdb62b 371
claytonk 8:10ffd42a3921 372 void dot_falling_edge()
claytonk 8:10ffd42a3921 373 {
claytonk 13:2b83989d136c 374 dot_timer_number = dot_timer.read_us();
claytonk 6:85d9ad912c14 375
claytonk 6:85d9ad912c14 376 if(stacked) {
claytonk 6:85d9ad912c14 377 emitter_status_dot = !emitter_status_dot;
claytonk 4:fc0c93cb0197 378 } else {
claytonk 6:85d9ad912c14 379 emitter_status_dot = dot_on;
claytonk 4:fc0c93cb0197 380 }
claytonk 8:10ffd42a3921 381 // indicate status dot
claytonk 8:10ffd42a3921 382 pwm_0_output = emitter_status_dot;
claytonk 8:10ffd42a3921 383 // indicate VCSEL fault if it exists
claytonk 8:10ffd42a3921 384 pwm_1_output = !vcselFault.read();
claytonk 8:10ffd42a3921 385
claytonk 8:10ffd42a3921 386 // write once
claytonk 8:10ffd42a3921 387 queue.call(&write_once);
claytonk 8:10ffd42a3921 388
claytonk 9:69e0bbfdb62b 389 // timeout for dot
claytonk 8:10ffd42a3921 390 dot_timeout.attach(&dot_watchdog,.05);
claytonk 9:69e0bbfdb62b 391 // timout for app
claytonk 9:69e0bbfdb62b 392 app_timeout.detach();
claytonk 9:69e0bbfdb62b 393 app_timeout.attach(&app_watchdog,1);
claytonk 4:fc0c93cb0197 394 }
claytonk 4:fc0c93cb0197 395
claytonk 8:10ffd42a3921 396 void flood_falling_edge()
claytonk 4:fc0c93cb0197 397 {
claytonk 13:2b83989d136c 398 flood_timer_number = flood_timer.read_us();
claytonk 13:2b83989d136c 399
claytonk 8:10ffd42a3921 400 if (!stacked) {
claytonk 8:10ffd42a3921 401 emitter_status_dot = dot_on;
claytonk 6:85d9ad912c14 402 }
claytonk 8:10ffd42a3921 403 // indicate status dot
claytonk 8:10ffd42a3921 404 pwm_0_output = emitter_status_dot;
claytonk 8:10ffd42a3921 405 // indicate VCSEL fault if it exists
claytonk 8:10ffd42a3921 406 pwm_1_output = !vcselFault.read();
claytonk 8:10ffd42a3921 407 // timeout for app exit
claytonk 8:10ffd42a3921 408 //timeout.attach(&write_off,.5);
claytonk 8:10ffd42a3921 409 // write once
claytonk 8:10ffd42a3921 410 queue.call(&write_once);
claytonk 4:fc0c93cb0197 411
claytonk 9:69e0bbfdb62b 412 // timeout for flood
claytonk 8:10ffd42a3921 413 flood_timeout.attach(&flood_watchdog,.05);
claytonk 9:69e0bbfdb62b 414 // timout for app
claytonk 9:69e0bbfdb62b 415 app_timeout.detach();
claytonk 9:69e0bbfdb62b 416 app_timeout.attach(&app_watchdog,1);
claytonk 8:10ffd42a3921 417 }
claytonk 4:fc0c93cb0197 418
claytonk 6:85d9ad912c14 419 void dot_check()
claytonk 6:85d9ad912c14 420 {
claytonk 8:10ffd42a3921 421 dot_timeout.detach();
claytonk 13:2b83989d136c 422 dot_timer.reset();
claytonk 6:85d9ad912c14 423
claytonk 8:10ffd42a3921 424 dot_counter ++;
claytonk 8:10ffd42a3921 425 if(dot_counter > app_counts_required) {
claytonk 8:10ffd42a3921 426 dot_on = true;
claytonk 10:c757bd889ed1 427 in_app = true;
claytonk 8:10ffd42a3921 428 } else {
claytonk 8:10ffd42a3921 429 dot_on = false;
claytonk 8:10ffd42a3921 430 }
claytonk 8:10ffd42a3921 431 stacked = strobe0.read();
claytonk 8:10ffd42a3921 432 if(stacked) {
claytonk 8:10ffd42a3921 433 stacked_counter++;
claytonk 8:10ffd42a3921 434 } else {
claytonk 8:10ffd42a3921 435 stacked_counter = 0;
claytonk 8:10ffd42a3921 436 flood_counter = 0;
claytonk 8:10ffd42a3921 437 flood_on = false;
claytonk 8:10ffd42a3921 438 }
claytonk 8:10ffd42a3921 439 if(!in_app) {
claytonk 8:10ffd42a3921 440 if (stacked_counter > app_counts_required) {
claytonk 8:10ffd42a3921 441 in_app = true;
claytonk 8:10ffd42a3921 442 }
claytonk 8:10ffd42a3921 443 }
claytonk 6:85d9ad912c14 444 }
claytonk 6:85d9ad912c14 445
claytonk 6:85d9ad912c14 446
claytonk 6:85d9ad912c14 447 void flood_check()
claytonk 6:85d9ad912c14 448 {
claytonk 8:10ffd42a3921 449 flood_timeout.detach();
claytonk 13:2b83989d136c 450 flood_timer.reset();
claytonk 6:85d9ad912c14 451
claytonk 8:10ffd42a3921 452 flood_counter ++;
claytonk 8:10ffd42a3921 453 if(flood_counter > app_counts_required) {
claytonk 8:10ffd42a3921 454 flood_on = true;
claytonk 10:c757bd889ed1 455 in_app = true;
claytonk 8:10ffd42a3921 456 } else {
claytonk 8:10ffd42a3921 457 flood_on = false;
claytonk 8:10ffd42a3921 458 }
claytonk 8:10ffd42a3921 459 stacked = strobe1.read();
claytonk 8:10ffd42a3921 460 if(stacked) {
claytonk 8:10ffd42a3921 461 stacked_counter++;
claytonk 8:10ffd42a3921 462 } else {
claytonk 8:10ffd42a3921 463 stacked_counter = 0;
claytonk 8:10ffd42a3921 464 dot_counter = 0;
claytonk 8:10ffd42a3921 465 dot_on = false;
claytonk 8:10ffd42a3921 466 }
claytonk 8:10ffd42a3921 467 if(!in_app) {
claytonk 8:10ffd42a3921 468 if (stacked_counter > app_counts_required) {
claytonk 8:10ffd42a3921 469 in_app = true;
claytonk 8:10ffd42a3921 470 }
claytonk 8:10ffd42a3921 471 }
claytonk 6:85d9ad912c14 472 }
claytonk 6:85d9ad912c14 473
claytonk 13:2b83989d136c 474 void test_function()
claytonk 13:2b83989d136c 475 {
claytonk 13:2b83989d136c 476
claytonk 13:2b83989d136c 477 }
claytonk 13:2b83989d136c 478
claytonk 6:85d9ad912c14 479 // TODOS //
claytonk 7:9c77eaad5102 480 // DONE P0 Get illumination working
claytonk 8:10ffd42a3921 481 // P0 Get OV580 I2C to look correct. Suspect open drain culprit
claytonk 9:69e0bbfdb62b 482 // DONE P0 Ensure that current implementation meets the needs of data collection
claytonk 8:10ffd42a3921 483 // DONE P0 Get in app working
claytonk 8:10ffd42a3921 484 // DONE P0 Get watchdog time working
claytonk 8:10ffd42a3921 485 // DONE P0 Check watchdog for working on dot and flood
claytonk 6:85d9ad912c14 486 // P1 Bluetooth OTA updates
claytonk 6:85d9ad912c14 487 // P2 Get writing working
claytonk 6:85d9ad912c14 488 // P2 Get reading working
claytonk 6:85d9ad912c14 489 //
claytonk 6:85d9ad912c14 490
claytonk 0:605fe136b7ea 491 // main() runs in its own thread in the OS
claytonk 1:ffffa383ba7e 492 int main()
claytonk 1:ffffa383ba7e 493 {
claytonk 4:fc0c93cb0197 494 Thread eventThread(osPriorityHigh);;
claytonk 4:fc0c93cb0197 495 eventThread.start(callback(&queue, &EventQueue::dispatch_forever));
claytonk 4:fc0c93cb0197 496
claytonk 4:fc0c93cb0197 497 // set interrupts
claytonk 6:85d9ad912c14 498 int_strobe_dot.rise(&dot_check);
claytonk 6:85d9ad912c14 499 int_strobe_flood.rise(&flood_check);
claytonk 8:10ffd42a3921 500 int_strobe_dot.fall(&dot_falling_edge);
claytonk 8:10ffd42a3921 501 int_strobe_flood.fall(&flood_falling_edge);
claytonk 8:10ffd42a3921 502
claytonk 13:2b83989d136c 503 dot_timer.start();
claytonk 13:2b83989d136c 504 flood_timer.start();
claytonk 13:2b83989d136c 505
claytonk 8:10ffd42a3921 506 while(!in_app) {
claytonk 9:69e0bbfdb62b 507 wait(.1);
claytonk 8:10ffd42a3921 508 }
claytonk 1:ffffa383ba7e 509
claytonk 13:2b83989d136c 510 silego = 1;
claytonk 13:2b83989d136c 511
claytonk 0:605fe136b7ea 512 // write safety
claytonk 0:605fe136b7ea 513 flood_I2C.write(LM36011_addr,lmSafety,2,false);
claytonk 0:605fe136b7ea 514 dot_I2C.write(LM36011_addr,lmSafety,2,false);
claytonk 3:6b14862f5f51 515
claytonk 13:2b83989d136c 516 // write torch
claytonk 13:2b83989d136c 517 flood_I2C.write(LM36011_addr,torchBrightness_both,2,false);
claytonk 13:2b83989d136c 518 dot_I2C.write(LM36011_addr,torchBrightness_both,2,false);
claytonk 13:2b83989d136c 519
claytonk 1:ffffa383ba7e 520 // write brightness
claytonk 1:ffffa383ba7e 521 flood_I2C.write(LM36011_addr,flashBrightness_flood,2,false);
claytonk 3:6b14862f5f51 522 dot_I2C.write(LM36011_addr,flashBrightness_dot,2,false);
claytonk 1:ffffa383ba7e 523
claytonk 0:605fe136b7ea 524 while (true) {
claytonk 13:2b83989d136c 525
claytonk 13:2b83989d136c 526 if(dot_timer_number > 700 && dot_timer_number < 1499) {
claytonk 13:2b83989d136c 527 dot_current_setting = dot_one_ms;
claytonk 13:2b83989d136c 528
claytonk 13:2b83989d136c 529 } else if(dot_timer_number > 1500 && dot_timer_number < 2499) {
claytonk 13:2b83989d136c 530 dot_current_setting = dot_two_ms;
claytonk 13:2b83989d136c 531
claytonk 13:2b83989d136c 532 } else if(dot_timer_number > 2500 && dot_timer_number < 3499) {
claytonk 13:2b83989d136c 533 dot_current_setting = dot_three_ms;
claytonk 13:2b83989d136c 534
claytonk 13:2b83989d136c 535 } else if(dot_timer_number > 3500 && dot_timer_number < 4499) {
claytonk 13:2b83989d136c 536 dot_current_setting = dot_four_ms;
claytonk 13:2b83989d136c 537
claytonk 13:2b83989d136c 538 } else if(dot_timer_number > 4500) {
claytonk 13:2b83989d136c 539 dot_current_setting = dot_five_ms;
claytonk 13:2b83989d136c 540
claytonk 13:2b83989d136c 541 } else {
claytonk 13:2b83989d136c 542 dot_current_setting = dot_zero_ms;
claytonk 13:2b83989d136c 543 }
claytonk 13:2b83989d136c 544
claytonk 13:2b83989d136c 545 level_dot_max_dec = uint32_t(dot_current_setting/divisor);
claytonk 13:2b83989d136c 546 level_dot_max = (((level_dot_max_dec / 16) << 4) & 0xf0) |
claytonk 13:2b83989d136c 547 ((level_dot_max_dec % 16) & 0x0f);
claytonk 13:2b83989d136c 548
claytonk 13:2b83989d136c 549 flashBrightness_dot[1] = level_dot_max;
claytonk 13:2b83989d136c 550
claytonk 14:5590fcd73be4 551 dot_I2C.write(LM36011_addr,flashBrightness_dot,2,false);
claytonk 9:69e0bbfdb62b 552 wait(.1);
claytonk 13:2b83989d136c 553
claytonk 13:2b83989d136c 554 if(flood_timer_number > 700 && flood_timer_number < 1499) {
claytonk 13:2b83989d136c 555 flood_current_setting = flood_one_ms;
claytonk 13:2b83989d136c 556
claytonk 13:2b83989d136c 557 } else if(flood_timer_number > 1500 && flood_timer_number < 2499) {
claytonk 13:2b83989d136c 558 flood_current_setting = flood_two_ms;
claytonk 13:2b83989d136c 559
claytonk 13:2b83989d136c 560 } else if(flood_timer_number > 2500 && flood_timer_number < 3499) {
claytonk 13:2b83989d136c 561 flood_current_setting = flood_three_ms;
claytonk 13:2b83989d136c 562
claytonk 13:2b83989d136c 563 } else if(flood_timer_number > 3500 && flood_timer_number < 4499) {
claytonk 13:2b83989d136c 564 flood_current_setting = flood_four_ms;
claytonk 13:2b83989d136c 565
claytonk 13:2b83989d136c 566 } else if(flood_timer_number > 4500) {
claytonk 13:2b83989d136c 567 flood_current_setting = flood_five_ms;
claytonk 13:2b83989d136c 568
claytonk 13:2b83989d136c 569 } else {
claytonk 13:2b83989d136c 570 flood_current_setting = flood_zero_ms;
claytonk 13:2b83989d136c 571 }
claytonk 13:2b83989d136c 572
claytonk 13:2b83989d136c 573 level_flood_max_dec = uint32_t(flood_current_setting/divisor);
claytonk 13:2b83989d136c 574 level_flood_max = (((level_flood_max_dec / 16) << 4) & 0xf0) |
claytonk 13:2b83989d136c 575 ((level_flood_max_dec % 16) & 0x0f);
claytonk 13:2b83989d136c 576
claytonk 13:2b83989d136c 577
claytonk 13:2b83989d136c 578 flashBrightness_flood[1] = level_flood_max;
claytonk 13:2b83989d136c 579
claytonk 14:5590fcd73be4 580 flood_I2C.write(LM36011_addr,flashBrightness_flood,2,false);
claytonk 13:2b83989d136c 581
claytonk 13:2b83989d136c 582 wait(.1);
claytonk 13:2b83989d136c 583
claytonk 13:2b83989d136c 584 //read_fail = flood_I2C.read(LM36011_addr,data_read,6,false);
claytonk 13:2b83989d136c 585 /*
claytonk 13:2b83989d136c 586 if(read_fail) {
claytonk 13:2b83989d136c 587 red = 0;
claytonk 13:2b83989d136c 588 } else {
claytonk 13:2b83989d136c 589 if(data_read[5] != 0) {
claytonk 13:2b83989d136c 590 red = 0;
claytonk 13:2b83989d136c 591 } else {
claytonk 13:2b83989d136c 592 red = !red;
claytonk 13:2b83989d136c 593 }
claytonk 13:2b83989d136c 594 }
claytonk 13:2b83989d136c 595 */
claytonk 13:2b83989d136c 596
claytonk 0:605fe136b7ea 597 }
claytonk 0:605fe136b7ea 598 }
claytonk 0:605fe136b7ea 599