Jason Chang
/
9v1
Add I2CSlave to ov580 master.
main.cpp@1:ffffa383ba7e, 2018-10-19 (annotated)
- Committer:
- claytonk
- Date:
- Fri Oct 19 01:54:34 2018 +0000
- Revision:
- 1:ffffa383ba7e
- Parent:
- 0:605fe136b7ea
- Child:
- 2:afc300c4f8e4
writing initial commands and getting to green flashy on plug, but once in app the flashy goes away and the illumination doesn't come on
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
claytonk | 0:605fe136b7ea | 1 | #include "mbed.h" |
claytonk | 0:605fe136b7ea | 2 | |
claytonk | 0:605fe136b7ea | 3 | /* |
claytonk | 0:605fe136b7ea | 4 | FEATURE REQUIREMENTS |
claytonk | 0:605fe136b7ea | 5 | |
claytonk | 1:ffffa383ba7e | 6 | - I2C write occurs on |
claytonk | 0:605fe136b7ea | 7 | |
claytonk | 0:605fe136b7ea | 8 | -Reoccuring enable from app that will prevent the emitters from remaining |
claytonk | 0:605fe136b7ea | 9 | on if the app crashes and a turn off command isn't sent |
claytonk | 0:605fe136b7ea | 10 | - Can be a counter on the emitter enable > threshold |
claytonk | 0:605fe136b7ea | 11 | |
claytonk | 0:605fe136b7ea | 12 | -Flood/Dot tagging indicated on GPIO3 |
claytonk | 0:605fe136b7ea | 13 | - 0 Flood |
claytonk | 0:605fe136b7ea | 14 | - 1 DOT |
claytonk | 0:605fe136b7ea | 15 | |
claytonk | 0:605fe136b7ea | 16 | -Fault indication on GPIO4 to indicate to app to reboot |
claytonk | 0:605fe136b7ea | 17 | - 0 OK |
claytonk | 0:605fe136b7ea | 18 | - 1 Fault/Reboot |
claytonk | 0:605fe136b7ea | 19 | |
claytonk | 0:605fe136b7ea | 20 | I2C write commands |
claytonk | 0:605fe136b7ea | 21 | Reg: Information Condition |
claytonk | 0:605fe136b7ea | 22 | 0x00 Emitter enable 0x00 Emitters off |
claytonk | 0:605fe136b7ea | 23 | 0x01 Dot on |
claytonk | 0:605fe136b7ea | 24 | 0x10 Flood on |
claytonk | 0:605fe136b7ea | 25 | 0x11 Flood / Dot on |
claytonk | 0:605fe136b7ea | 26 | |
claytonk | 1:ffffa383ba7e | 27 | 0x01 Dot fault Read from LM36011 |
claytonk | 0:605fe136b7ea | 28 | |
claytonk | 0:605fe136b7ea | 29 | 0x02 Flood Fault Read from LM36011 |
claytonk | 0:605fe136b7ea | 30 | |
claytonk | 0:605fe136b7ea | 31 | 0x03 Kill VCSEL Fault Define this |
claytonk | 0:605fe136b7ea | 32 | |
claytonk | 0:605fe136b7ea | 33 | */ |
claytonk | 0:605fe136b7ea | 34 | |
claytonk | 0:605fe136b7ea | 35 | // define pins for I2C |
claytonk | 0:605fe136b7ea | 36 | #define dot_sda p2 |
claytonk | 0:605fe136b7ea | 37 | #define dot_scl p4 |
claytonk | 0:605fe136b7ea | 38 | #define flood_sda p28 |
claytonk | 0:605fe136b7ea | 39 | #define flood_scl p3 |
claytonk | 0:605fe136b7ea | 40 | #define ov580_sda p30 |
claytonk | 0:605fe136b7ea | 41 | #define ov580_scl p31 |
claytonk | 0:605fe136b7ea | 42 | #define strobe_dot p23 |
claytonk | 0:605fe136b7ea | 43 | #define strobe_flood p24 |
claytonk | 0:605fe136b7ea | 44 | #define pwm_1_pin p29 |
claytonk | 0:605fe136b7ea | 45 | #define pwm_0_pin p5 |
claytonk | 0:605fe136b7ea | 46 | |
claytonk | 0:605fe136b7ea | 47 | // define LED pins |
claytonk | 0:605fe136b7ea | 48 | #define ledRed p12 |
claytonk | 0:605fe136b7ea | 49 | #define ledGreen p17 |
claytonk | 0:605fe136b7ea | 50 | #define ledBlue p13 |
claytonk | 0:605fe136b7ea | 51 | |
claytonk | 0:605fe136b7ea | 52 | // initialize LEDs |
claytonk | 0:605fe136b7ea | 53 | DigitalOut red(ledRed,1); |
claytonk | 0:605fe136b7ea | 54 | DigitalOut green(ledGreen,1); |
claytonk | 0:605fe136b7ea | 55 | DigitalOut blue(ledBlue,1); |
claytonk | 0:605fe136b7ea | 56 | |
claytonk | 0:605fe136b7ea | 57 | // Initialize outputs |
claytonk | 0:605fe136b7ea | 58 | DigitalIn pwm_1(pwm_1_pin,PullNone); |
claytonk | 0:605fe136b7ea | 59 | |
claytonk | 0:605fe136b7ea | 60 | // Initialize inputs |
claytonk | 0:605fe136b7ea | 61 | DigitalIn strobe0(p23,PullNone); |
claytonk | 0:605fe136b7ea | 62 | DigitalIn strobe1(p24,PullNone); |
claytonk | 0:605fe136b7ea | 63 | DigitalIn pwm_0(pwm_0_pin,PullNone); |
claytonk | 0:605fe136b7ea | 64 | DigitalIn vcselFault(p25,PullNone); |
claytonk | 0:605fe136b7ea | 65 | DigitalIn killVcsel(p26,PullNone); |
claytonk | 0:605fe136b7ea | 66 | |
claytonk | 0:605fe136b7ea | 67 | static uint8_t LM36011_addr = 0x64 << 1; //0xC8 |
claytonk | 0:605fe136b7ea | 68 | |
claytonk | 0:605fe136b7ea | 69 | // register names |
claytonk | 0:605fe136b7ea | 70 | static uint8_t enable_reg = 0x01; |
claytonk | 0:605fe136b7ea | 71 | static uint8_t configuration_reg = 0x02; |
claytonk | 0:605fe136b7ea | 72 | static uint8_t brightness_reg = 0x03; |
claytonk | 0:605fe136b7ea | 73 | static uint8_t torch_reg = 0x04; |
claytonk | 0:605fe136b7ea | 74 | static uint8_t flags_reg = 0x05; |
claytonk | 0:605fe136b7ea | 75 | static uint8_t device_id_reset_reg = 0x06; |
claytonk | 0:605fe136b7ea | 76 | |
claytonk | 0:605fe136b7ea | 77 | // register settings |
claytonk | 0:605fe136b7ea | 78 | static uint8_t enable_ir = 0x05; |
claytonk | 0:605fe136b7ea | 79 | static uint8_t disable_ir = 0x20; |
claytonk | 0:605fe136b7ea | 80 | static uint8_t enable_flash_timeout = 0x01; |
claytonk | 0:605fe136b7ea | 81 | |
claytonk | 0:605fe136b7ea | 82 | // level settings |
claytonk | 0:605fe136b7ea | 83 | static uint8_t level_flood_max = 0x66; // = 1.2 A |
claytonk | 0:605fe136b7ea | 84 | //static uint8_t level_dot_max = 0x5F; // = 1.03 A |
claytonk | 0:605fe136b7ea | 85 | //static uint8_t level_dot_max = 0x3F; // = 0.75 A |
claytonk | 0:605fe136b7ea | 86 | //static uint8_t level_dot_max = 0x3C; // = 0.70 A |
claytonk | 0:605fe136b7ea | 87 | //static uint8_t level_dot_max = 0x15 //0.257 A |
claytonk | 0:605fe136b7ea | 88 | static uint8_t level_dot_max = 0x1F; // = 352mA |
claytonk | 0:605fe136b7ea | 89 | |
claytonk | 0:605fe136b7ea | 90 | //size_t write_size 2; |
claytonk | 0:605fe136b7ea | 91 | bool err; |
claytonk | 0:605fe136b7ea | 92 | bool on = false; |
claytonk | 0:605fe136b7ea | 93 | bool stacked_error = false; |
claytonk | 0:605fe136b7ea | 94 | bool in_app = false; |
claytonk | 0:605fe136b7ea | 95 | uint64_t stacked_counter = 0; |
claytonk | 0:605fe136b7ea | 96 | bool flip = false; |
claytonk | 0:605fe136b7ea | 97 | bool dot_on = false; |
claytonk | 0:605fe136b7ea | 98 | bool flood_on = false; |
claytonk | 0:605fe136b7ea | 99 | bool pulsed = false; |
claytonk | 0:605fe136b7ea | 100 | |
claytonk | 0:605fe136b7ea | 101 | char lmInit[2] = {enable_reg,enable_ir}; |
claytonk | 0:605fe136b7ea | 102 | char lmOff[2] = {enable_reg,disable_ir}; |
claytonk | 0:605fe136b7ea | 103 | char lmSafety[2] = {configuration_reg,enable_flash_timeout}; |
claytonk | 0:605fe136b7ea | 104 | |
claytonk | 0:605fe136b7ea | 105 | char flashBrightness_dot[2] = {brightness_reg,level_dot_max}; |
claytonk | 0:605fe136b7ea | 106 | char flashBrightness_flood[2] = {brightness_reg,level_flood_max}; |
claytonk | 0:605fe136b7ea | 107 | |
claytonk | 0:605fe136b7ea | 108 | //create interupts |
claytonk | 1:ffffa383ba7e | 109 | InterruptIn strobe_0(p23); |
claytonk | 1:ffffa383ba7e | 110 | InterruptIn strobe_1(p24); |
claytonk | 0:605fe136b7ea | 111 | |
claytonk | 0:605fe136b7ea | 112 | // i2c declarations |
claytonk | 0:605fe136b7ea | 113 | I2C flood_I2C(flood_sda,flood_scl); |
claytonk | 0:605fe136b7ea | 114 | I2C dot_I2C(dot_sda,dot_scl); |
claytonk | 0:605fe136b7ea | 115 | I2CSlave ov_I2C(ov580_sda,ov580_scl); |
claytonk | 0:605fe136b7ea | 116 | |
claytonk | 1:ffffa383ba7e | 117 | // functions |
claytonk | 1:ffffa383ba7e | 118 | void lightsOn() |
claytonk | 1:ffffa383ba7e | 119 | { |
claytonk | 1:ffffa383ba7e | 120 | // set on true if stacked error isn't present |
claytonk | 1:ffffa383ba7e | 121 | if(in_app) { |
claytonk | 1:ffffa383ba7e | 122 | |
claytonk | 1:ffffa383ba7e | 123 | if(!pulsed && dot_on) { |
claytonk | 1:ffffa383ba7e | 124 | // set driver current |
claytonk | 1:ffffa383ba7e | 125 | dot_I2C.write(LM36011_addr, lmInit, 2, false); |
claytonk | 1:ffffa383ba7e | 126 | wait_us(2); |
claytonk | 1:ffffa383ba7e | 127 | } else if (pulsed && flip) { |
claytonk | 1:ffffa383ba7e | 128 | dot_I2C.write(LM36011_addr, lmInit, 2, false); |
claytonk | 1:ffffa383ba7e | 129 | wait_us(2); |
claytonk | 1:ffffa383ba7e | 130 | } else { |
claytonk | 1:ffffa383ba7e | 131 | dot_I2C.write(LM36011_addr, lmOff, 2, false); |
claytonk | 1:ffffa383ba7e | 132 | wait_us(2); |
claytonk | 1:ffffa383ba7e | 133 | } |
claytonk | 1:ffffa383ba7e | 134 | |
claytonk | 1:ffffa383ba7e | 135 | if(!pulsed && flood_on) { |
claytonk | 1:ffffa383ba7e | 136 | flood_I2C.write(LM36011_addr, lmInit, 2, false); |
claytonk | 1:ffffa383ba7e | 137 | wait_us(2); |
claytonk | 1:ffffa383ba7e | 138 | } else if (pulsed && !flip) { |
claytonk | 1:ffffa383ba7e | 139 | flood_I2C.write(LM36011_addr, lmInit, 2, false); |
claytonk | 1:ffffa383ba7e | 140 | wait_us(2); |
claytonk | 1:ffffa383ba7e | 141 | } else { |
claytonk | 1:ffffa383ba7e | 142 | flood_I2C.write(LM36011_addr, lmOff, 2, false); |
claytonk | 1:ffffa383ba7e | 143 | wait_us(2); |
claytonk | 1:ffffa383ba7e | 144 | } |
claytonk | 1:ffffa383ba7e | 145 | } |
claytonk | 1:ffffa383ba7e | 146 | } |
claytonk | 1:ffffa383ba7e | 147 | |
claytonk | 1:ffffa383ba7e | 148 | void stack_check() |
claytonk | 1:ffffa383ba7e | 149 | { |
claytonk | 1:ffffa383ba7e | 150 | // check strobe 1 for high, and if high set stacked_error |
claytonk | 1:ffffa383ba7e | 151 | stacked_error = strobe_1.read(); |
claytonk | 1:ffffa383ba7e | 152 | if(stacked_error) { |
claytonk | 1:ffffa383ba7e | 153 | stacked_counter++; |
claytonk | 1:ffffa383ba7e | 154 | } else { |
claytonk | 1:ffffa383ba7e | 155 | in_app = false; |
claytonk | 1:ffffa383ba7e | 156 | stacked_counter = 0; |
claytonk | 1:ffffa383ba7e | 157 | } |
claytonk | 1:ffffa383ba7e | 158 | if(stacked_counter > 30) { |
claytonk | 1:ffffa383ba7e | 159 | in_app = true; |
claytonk | 1:ffffa383ba7e | 160 | } |
claytonk | 1:ffffa383ba7e | 161 | flood_on = pwm_0; |
claytonk | 1:ffffa383ba7e | 162 | dot_on = pwm_1; |
claytonk | 1:ffffa383ba7e | 163 | if(flood_on && dot_on) { |
claytonk | 1:ffffa383ba7e | 164 | pulsed = true; |
claytonk | 1:ffffa383ba7e | 165 | |
claytonk | 1:ffffa383ba7e | 166 | } else { |
claytonk | 1:ffffa383ba7e | 167 | pulsed = false; |
claytonk | 1:ffffa383ba7e | 168 | } |
claytonk | 1:ffffa383ba7e | 169 | |
claytonk | 1:ffffa383ba7e | 170 | flip = !flip; |
claytonk | 1:ffffa383ba7e | 171 | } |
claytonk | 1:ffffa383ba7e | 172 | |
claytonk | 0:605fe136b7ea | 173 | // main() runs in its own thread in the OS |
claytonk | 1:ffffa383ba7e | 174 | int main() |
claytonk | 1:ffffa383ba7e | 175 | { |
claytonk | 1:ffffa383ba7e | 176 | |
claytonk | 0:605fe136b7ea | 177 | // set I2C Frequency to 400kHz |
claytonk | 0:605fe136b7ea | 178 | flood_I2C.frequency(400000); |
claytonk | 0:605fe136b7ea | 179 | dot_I2C.frequency(400000); |
claytonk | 1:ffffa383ba7e | 180 | |
claytonk | 0:605fe136b7ea | 181 | // write safety |
claytonk | 0:605fe136b7ea | 182 | flood_I2C.write(LM36011_addr,lmSafety,2,false); |
claytonk | 0:605fe136b7ea | 183 | dot_I2C.write(LM36011_addr,lmSafety,2,false); |
claytonk | 0:605fe136b7ea | 184 | |
claytonk | 1:ffffa383ba7e | 185 | // write brightness |
claytonk | 1:ffffa383ba7e | 186 | flood_I2C.write(LM36011_addr,flashBrightness_flood,2,false); |
claytonk | 1:ffffa383ba7e | 187 | dot_I2C.write(LM36011_addr,flashBrightness_dot,2,false); |
claytonk | 1:ffffa383ba7e | 188 | |
claytonk | 1:ffffa383ba7e | 189 | // set interrupts |
claytonk | 1:ffffa383ba7e | 190 | strobe_0.fall(lightsOn); |
claytonk | 1:ffffa383ba7e | 191 | strobe_0.rise(stack_check); |
claytonk | 1:ffffa383ba7e | 192 | |
claytonk | 0:605fe136b7ea | 193 | while (true) { |
claytonk | 1:ffffa383ba7e | 194 | |
claytonk | 0:605fe136b7ea | 195 | green = !green; |
claytonk | 0:605fe136b7ea | 196 | wait(0.5); |
claytonk | 0:605fe136b7ea | 197 | } |
claytonk | 0:605fe136b7ea | 198 | } |
claytonk | 0:605fe136b7ea | 199 |