volatile char timerStatusRemote(char key, char first) { static uint32_t startTime = 0; static uint8_t toggle = 0; if(first) { startTime = 0; } if(clock.Ms() > startTime + 100) { startTime = clock.Ms(); lcd.cls(); if(toggle == 0) remote.request(REMOTE_BATTERY); else if(toggle == 1) remote.send(REMOTE_BATTERY, REMOTE_TYPE_NOTIFY_SET); else if(toggle == 2) remote.request(REMOTE_START); else remote.request(REMOTE_STATUS); if(++toggle >= 10) toggle = 2; displayTimerStatus(1); menu.setTitle(TEXT("Remote")); if(remote.running) menu.setBar(TEXT("RETURN"), TEXT("STOP")); else menu.setBar(TEXT("RETURN"), BLANK_STR); lcd.update(); } if(!remote.connected) return FN_CANCEL; switch(key) { case FR_KEY: remote.set(REMOTE_STOP); break; case FL_KEY: case LEFT_KEY: remote.send(REMOTE_BATTERY, REMOTE_TYPE_NOTIFY_UNSET); toggle = 0; return FN_CANCEL; } return FN_CONTINUE; }
volatile char viewSeconds(char key, char first) { if(first) { lcd.cls(); lcd.writeString(1, 18, TEXT("Clock:")); menu.setTitle(TEXT("Clock")); menu.setBar(TEXT("TARE"), TEXT("RETURN")); } lcd.eraseBox(36, 18, 83, 18 + 8); /*char x =*/ lcd.writeNumber(83, 18, clock.Seconds(), 'F', 'R'); lcd.update(); switch(key) { case FL_KEY: clock.tare(); break; case FR_KEY: return FN_CANCEL; } return FN_CONTINUE; }
volatile char IRremote(char key, char first) { if(first) { lcd.cls(); menu.setTitle(TEXT("IR Remote")); menu.setBar(TEXT("Delayed"), TEXT("Trigger")); lcd.update(); } switch(key) { case FL_KEY: ir.shutterDelayed(); break; case FR_KEY: ir.shutterNow(); break; case LEFT_KEY: return FN_CANCEL; } return FN_CONTINUE; }
volatile char lighteningTrigger(char key, char first) { if(first) { sleepOk = 0; hardware_lightening_enable(); lcd.cls(); menu.setTitle(TEXT("Lightening")); lcd.writeString(25, 20, TEXT("READY")); menu.setBar(TEXT("RETURN"), TEXT("CALIBRATE")); lcd.update(); } if(key == FL_KEY || key == LEFT_KEY) { sleepOk = 1; hardware_lightening_disable(); return FN_CANCEL; } if(key == FR_KEY) { menu.message(TEXT("Calibrating")); hardware_lightening_disable(); } return FN_CONTINUE; }
volatile char timerStatus(char key, char first) { static uint8_t counter; if(first) { counter = 0; } if(counter++ > 3) { counter = 0; lcd.cls(); displayTimerStatus(0); menu.setTitle(TEXT("Running")); menu.setBar(TEXT(""), TEXT("STOP")); lcd.update(); } if(!timer.running) return FN_CANCEL; if(key == FR_KEY) { menu.push(); menu.spawn((void*)timerStop); return FN_JUMP; } return FN_CONTINUE; }
volatile char factoryReset(char key, char first) { if(first) { lcd.cls(); lcd.writeString(14, 12, TEXT("Reset all")); lcd.writeString(14, 22, TEXT("settings?")); menu.setTitle(TEXT("Reset")); menu.setBar(TEXT("CANCEL"), TEXT("RESET")); lcd.update(); } switch(key) { case FL_KEY: return FN_CANCEL; case FR_KEY: settings_default(); menu.message(TEXT("Factory Reset")); return FN_CANCEL; } return FN_CONTINUE; }
volatile char sysStatus(char key, char first) { char* text; if(first) { } lcd.cls(); text = getChargingStatus(); char l = lcd.measureStringTiny(text); lcd.writeStringTiny(80 - l, 6 + SY, text); lcd.writeStringTiny(3, 6 + SY, TEXT("USB:")); char buf[6]; uint16_t val; val = (uint16_t)battery_percent; int_to_str(val, buf); text = buf; l = lcd.measureStringTiny(text); lcd.writeStringTiny(80 - l, 12 + SY, text); lcd.writeStringTiny(3, 12 + SY, TEXT("Battery:")); val = hardware_freeMemory(); int_to_str(val, buf); text = buf; l = lcd.measureStringTiny(text); lcd.writeStringTiny(80 - l, 18 + SY, text); lcd.writeStringTiny(3, 18 + SY, TEXT("Free RAM:")); val = clock.seconds; int_to_str(val, buf); text = buf; l = lcd.measureStringTiny(text); lcd.writeStringTiny(80 - l, 24 + SY, text); lcd.writeStringTiny(3, 24 + SY, TEXT("Clock s:")); val = clock.ms; int_to_str(val, buf); text = buf; l = lcd.measureStringTiny(text); lcd.writeStringTiny(80 - l, 30 + SY, text); lcd.writeStringTiny(3, 30 + SY, TEXT("Clock ms:")); menu.setTitle(TEXT("Sys Status")); menu.setBar(TEXT("RETURN"), BLANK_STR); lcd.update(); _delay_ms(10); if(key == FL_KEY || key == LEFT_KEY) return FN_CANCEL; return FN_CONTINUE; }
volatile char cableReleaseRemote(char key, char first) { static char status; //, cable; if(first) { status = 0; lcd.cls(); menu.setTitle(TEXT("BT Cable Remote")); menu.setBar(TEXT("Bulb"), TEXT("Photo")); lcd.update(); remote.set(REMOTE_BULB_END); } if(key == FL_KEY) { if(status != 1) { status = 1; lcd.eraseBox(8, 18, 8 + 6 * 11, 26); lcd.writeString(8, 18, TEXT("(BULB OPEN)")); remote.set(REMOTE_BULB_START); lcd.update(); } else { status = 0; lcd.eraseBox(8, 18, 8 + 6 * 11, 26); remote.set(REMOTE_BULB_END); lcd.update(); } } else if(key == FR_KEY && status != 1) { status = 0; lcd.eraseBox(8, 18, 8 + 6 * 11, 26); remote.set(REMOTE_CAPTURE); lcd.update(); } else if(key != 0) { status = 0; lcd.eraseBox(8, 18, 8 + 6 * 11, 26); remote.set(REMOTE_BULB_END); lcd.update(); } if(key == LEFT_KEY || !remote.connected) { remote.set(REMOTE_BULB_END); return FN_CANCEL; } return FN_CONTINUE; }
volatile char firmwareUpdated(char key, char first) { if(first) { uint8_t l, c; char* text; char buf[6]; lcd.cls(); menu.setTitle(TEXT("FIRMWARE")); lcd.writeStringTiny(13, 10, TEXT("Successfully")); lcd.writeStringTiny(25, 16, TEXT("Updated")); lcd.writeStringTiny(8, 28, TEXT("Version:")); uint32_t version = VERSION; l = 0; while(version) { c = (char)(version % 10); buf[0] = ((char)(c + '0')); buf[1] = 0; text = buf; l += lcd.measureStringTiny(text) + 1; lcd.writeStringTiny(75 - l, 28, text); version -= (uint32_t)c; version /= 10; } menu.setBar(TEXT("RETURN"), BLANK_STR); lcd.update(); } switch(key) { case FL_KEY: case LEFT_KEY: return FN_CANCEL; } return FN_CONTINUE; }
volatile char notYet(char key, char first) { if(first) { lcd.cls(); lcd.writeString(3, 7, TEXT("Sorry, this ")); lcd.writeString(3, 15, TEXT("feature has ")); lcd.writeString(3, 23, TEXT("not yet been ")); lcd.writeString(3, 31, TEXT("implemented ")); menu.setTitle(TEXT("Not Yet")); menu.setBar(TEXT("RETURN"), BLANK_STR); lcd.update(); } if(key) return FN_CANCEL; return FN_CONTINUE; }
volatile char memoryFree(char key, char first) { if(first) { unsigned int mem = hardware_freeMemory(); lcd.cls(); lcd.writeString(1, 18, TEXT("Free RAM:")); /*char x =*/lcd.writeNumber(55, 18, mem, 'U', 'L'); //lcd.writeString(55 + x * 6, 18, TEXT("b")); menu.setTitle(TEXT("Memory")); menu.setBar(TEXT("RETURN"), BLANK_STR); lcd.update(); } if(key == FL_KEY) return FN_CANCEL; return FN_CONTINUE; }
volatile char lightMeter(char key, char first) { static char held = 0; if(first) { lcd.backlight(0); hardware_flashlight(0); } if(!held) { lcd.cls(); menu.setTitle(TEXT("Light Meter")); if(key == FR_KEY) { held = 1; menu.setBar(TEXT("RETURN"), TEXT("RUN")); } else { menu.setBar(TEXT("RETURN"), TEXT("PAUSE")); } char buf[6] , l; uint16_t val; char* text; val = (uint16_t)hardware_readLight(0); int_to_str(val, buf); text = buf; l = lcd.measureStringTiny(text); lcd.writeStringTiny(80 - l, 12 + SY, text); lcd.writeStringTiny(3, 12 + SY, TEXT("Level 1:")); val = (uint16_t)hardware_readLight(1); int_to_str(val, buf); text = buf; l = lcd.measureStringTiny(text); lcd.writeStringTiny(80 - l, 18 + SY, text); lcd.writeStringTiny(3, 18 + SY, TEXT("Level 2:")); val = (uint16_t)hardware_readLight(2); int_to_str(val, buf); text = buf; l = lcd.measureStringTiny(text); lcd.writeStringTiny(80 - l, 24 + SY, text); lcd.writeStringTiny(3, 24 + SY, TEXT("Level 3:")); lcd.update(); _delay_ms(10); } else { if(key == FR_KEY) held = 0; } if(key == FL_KEY) { lcd.backlight(255); return FN_CANCEL; } return FN_CONTINUE; }
volatile char sysInfo(char key, char first) { if(first) { lcd.cls(); char l; char* text; char buf[6]; uint16_t val; // Lines (Y) = 6, 12, 18, 24, 30 val = (uint16_t)bt.version(); text = TEXT("TLP01"); l = lcd.measureStringTiny(text); lcd.writeStringTiny(80 - l, 6 + SY, text); lcd.writeStringTiny(3, 6 + SY, TEXT("Model:")); if(val > 1) text = TEXT("BTLE"); else text = TEXT("KS99"); l = lcd.measureStringTiny(text); lcd.writeStringTiny(80 - l, 12 + SY, text); lcd.writeStringTiny(3, 12 + SY, TEXT("Edition:")); lcd.writeStringTiny(3, 18 + SY, TEXT("Firmware:")); uint32_t version = VERSION; char c; l = 0; while(version) { c = (char)(version % 10); buf[0] = ((char)(c + '0')); buf[1] = 0; text = buf; l += lcd.measureStringTiny(text) + 1; lcd.writeStringTiny(80 - l, 18 + SY, text); version -= (uint32_t)c; version /= 10; } if(val > 1) { int_to_str(val, buf); text = buf; l = lcd.measureStringTiny(text); lcd.writeStringTiny(80 - l, 30 + SY, text); lcd.writeStringTiny(3, 30 + SY, TEXT("BT FW Version:")); } menu.setTitle(TEXT("System Info")); menu.setBar(TEXT("RETURN"), BLANK_STR); lcd.update(); } if(key == FL_KEY || key == LEFT_KEY) return FN_CANCEL; return FN_CONTINUE; }
volatile char btConnect(char key, char first) { static uint8_t sfirst = 1; uint8_t i; static uint8_t menuSize; static uint8_t menuSelected; uint8_t c; uint8_t update, menuScroll; update = 0; if(sfirst) { menuScroll = 0; menuSelected = 0; sfirst = 0; update = 1; if(bt.state != BT_ST_CONNECTED) { bt.advertise(); bt.scan(); } } switch(key) { case LEFT_KEY: case FL_KEY: sfirst = 1; if(bt.state != BT_ST_CONNECTED) bt.sleep(); return FN_CANCEL; case FR_KEY: if(bt.state == BT_ST_CONNECTED) { bt.disconnect(); } else { bt.connect(bt.device[menuSelected].addr); } break; } update = 1; switch(bt.event) { case BT_EVENT_DISCOVERY: debug(STR("dicovery!\r\n")); break; case BT_EVENT_SCAN_COMPLETE: debug(STR("done!\r\n")); if(bt.state != BT_ST_CONNECTED) bt.scan(); break; case BT_EVENT_DISCONNECT: bt.scan(); break; default: update = 0; } bt.event = BT_EVENT_NULL; // clear event so we don't process it twice if(first) { update = 1; } if(key == UP_KEY && menuSelected > 0) { menuSelected--; update = 1; } else if(key == DOWN_KEY && menuSelected < menuSize - 1) { menuSelected++; update = 1; } if(update) { lcd.cls(); if(bt.state == BT_ST_CONNECTED) { menu.setTitle(TEXT("Connect")); lcd.writeStringTiny(18, 20, TEXT("Connected!")); menu.setBar(TEXT("RETURN"), TEXT("DISCONNECT")); } else { if(menuSelected > 2) menuScroll = menuSelected - 2; menuSize = 0; for(i = 0; i < bt.devices; i++) { if(i >= menuScroll && i <= menuScroll + 4) { for(c = 0; c < MENU_NAME_LEN - 1; c++) // Write settings item text // { if(bt.device[i].name[c]) lcd.writeChar(3 + c * 6, 8 + 9 * (menuSize - menuScroll), bt.device[i].name[c]); } } menuSize++; } if(bt.devices) { lcd.drawHighlight(2, 7 + 9 * (menuSelected - menuScroll), 81, 7 + 9 * (menuSelected - menuScroll) + 8); menu.setBar(TEXT("RETURN"), TEXT("CONNECT")); } else { lcd.writeStringTiny(6, 20, TEXT("No Devices Found")); menu.setBar(TEXT("RETURN"), BLANK_STR); } menu.setTitle(TEXT("Connect")); lcd.drawLine(0, 3, 0, 40); lcd.drawLine(83, 3, 83, 40); } lcd.update(); } return FN_CONTINUE; }
volatile char usbPlug(char key, char first) { static char connected = 0; if(first || (PTP_Connected != connected) || (PTP_Ready)) { connected = PTP_Connected; char exp_name[7]; if(PTP_Connected) { if(PTP_Ready) { lcd.cls(); lcd.writeString(3, 7, PTP_CameraModel); if(camera.shutterName(exp_name, camera.shutter)) { lcd.writeString(3, 15, exp_name); } if(camera.apertureName(exp_name, camera.aperture)) { lcd.writeString(3, 23, TEXT("f")); lcd.writeString(3+6, 23, exp_name); } if(camera.isoName(exp_name, camera.iso)) { lcd.writeString(3, 31, TEXT("ISO")); lcd.writeString(3+24, 31, exp_name); } menu.setTitle(TEXT("Camera Info")); menu.setBar(TEXT("RETURN"), TEXT("PHOTO")); lcd.update(); connectUSBcamera = 1; } else { lcd.cls(); lcd.writeString(3, 7, TEXT(" Connected! ")); lcd.writeString(3, 15, TEXT(" Retrieving ")); lcd.writeString(3, 23, TEXT(" Device ")); lcd.writeString(3, 31, TEXT(" Info... ")); menu.setTitle(TEXT("Camera Info")); menu.setBar(TEXT("RETURN"), BLANK_STR); lcd.update(); connectUSBcamera = 1; } } else { lcd.cls(); lcd.writeString(3, 7, TEXT("Plug camera ")); lcd.writeString(3, 15, TEXT("into left USB")); lcd.writeString(3, 23, TEXT("port... ")); lcd.writeString(3, 31, TEXT(" ")); menu.setTitle(TEXT("Connect USB")); menu.setBar(TEXT("CANCEL"), BLANK_STR); lcd.update(); connectUSBcamera = 1; } } if(key == FL_KEY || key == LEFT_KEY) { if(!PTP_Connected) connectUSBcamera = 0; return FN_CANCEL; } else if(key == FR_KEY) { if(PTP_Ready) camera.capture(); } else if(key == UP_KEY) { if(PTP_Ready) camera.isoUp(camera.iso); } else if(key == DOWN_KEY) { if(PTP_Ready) camera.isoDown(camera.iso); } return FN_CONTINUE; }
volatile char batteryStatus(char key, char first) { // uint16_t batt_high = 645; // uint16_t batt_low = 540; static uint8_t charging; char stat = battery_status(); if(first) { charging = (stat > 0); } // unsigned int batt_level = battery_read_raw(); #define BATT_LINES 36 // uint8_t lines = ((batt_level - batt_low) * BATT_LINES) / (batt_high - batt_low); uint8_t lines = (uint8_t)((uint16_t)battery_percent * BATT_LINES / 100); if(lines > BATT_LINES - 1 && stat == 1) lines = BATT_LINES - 1; if(lines > BATT_LINES || stat == 2) lines = BATT_LINES; lcd.cls(); char* text; text = getChargingStatus(); char l = lcd.measureStringTiny(text) / 2; if(battery_status()) lcd.writeStringTiny(41 - l, 31, text); // Draw Battery Outline // lcd.drawLine(20, 15, 60, 15); lcd.drawLine(20, 16, 20, 27); lcd.drawLine(21, 27, 60, 27); lcd.drawLine(60, 16, 60, 19); lcd.drawLine(60, 23, 60, 26); lcd.drawLine(61, 19, 61, 23); // Draw Battery Charge // for(uint8_t i = 0; i <= lines; i++) { lcd.drawLine(22 + i, 17, 22 + i, 25); } menu.setTitle(TEXT("Battery Status")); menu.setBar(TEXT("RETURN"), BLANK_STR); lcd.update(); if(stat == 0 && charging) { clock.awake(); return FN_CANCEL; // unplugged } if(key == FL_KEY) return FN_CANCEL; return FN_CONTINUE; }
volatile char shutter_load(char key, char first) { static char menuSize; static char menuSelected; static char itemSelected; uint8_t c; char ch, update, menuScroll; update = 0; if(first) { menuScroll = 0; update = 1; } if(key == UP_KEY && menuSelected > 0) { menuSelected--; update = 1; } else if(key == DOWN_KEY && menuSelected < menuSize - 1) { menuSelected++; update = 1; } if(update) { lcd.cls(); if(menuSelected > 2) menuScroll = menuSelected - 2; menuSize = 0; char i = 0; for(char x = 1; x < MAX_STORED; x++) { i++; ch = eeprom_read_byte((uint8_t*)&stored[i - 1].Name[0]); if(ch == 0 || ch == 255) continue; for(c = 0; c < MENU_NAME_LEN - 1; c++) // Write settings item text // { if(i >= menuScroll && i <= menuScroll + 5) { ch = eeprom_read_byte((uint8_t*)&stored[i - 1].Name[c]); if(ch == 0) break; if(ch < 'A' || ch > 'Z') ch = ' '; lcd.writeChar(3 + c * 6, 8 + 9 * (menuSize - menuScroll), ch); if(menuSize == menuSelected) itemSelected = i - 1; } } menuSize++; } lcd.drawHighlight(2, 7 + 9 * (menuSelected - menuScroll), 81, 7 + 9 * (menuSelected - menuScroll) + 8); menu.setTitle(TEXT("Load Saved")); menu.setBar(TEXT("CANCEL"), TEXT("LOAD")); lcd.drawLine(0, 3, 0, 40); lcd.drawLine(83, 3, 83, 40); lcd.update(); } switch(key) { case FL_KEY: case LEFT_KEY: return FN_CANCEL; case FR_KEY: case RIGHT_KEY: timer.load(itemSelected); menu.message(TEXT("Loaded")); menu.back(); menu.select(0); return FN_SAVE; } return FN_CONTINUE; }
volatile char shutterTest(char key, char first) { static char status, cable; if(first) { status = 0; cable = 0; lcd.cls(); menu.setTitle(TEXT("Shutter Test")); menu.setBar(TEXT("Half"), TEXT("Full")); lcd.update(); } if(key == FL_KEY && status != 1) { status = 1; lcd.eraseBox(20, 18, 20 + 6 * 6, 26); lcd.writeString(20, 18, TEXT("(HALF)")); timer.half(); lcd.update(); } else if(key == FR_KEY && status != 2) { status = 2; lcd.eraseBox(20, 18, 20 + 6 * 6, 26); lcd.writeString(20, 18, TEXT("(FULL)")); timer.full(); lcd.update(); } else if(key != 0) { status = 0; lcd.eraseBox(20, 18, 20 + 6 * 6, 26); timer.off(); lcd.update(); } if(timer.cableIsConnected()) { if(cable == 0) { cable = 1; lcd.writeStringTiny(6, 28, TEXT("Cable Connected")); lcd.update(); } } else { if(cable == 1) { cable = 0; lcd.eraseBox(6, 28, 6 + 15 * 5, 36); lcd.update(); } } if(key == LEFT_KEY) return FN_CANCEL; return FN_CONTINUE; }
volatile char shutterLagTest(char key, char first) { // static uint8_t cable; uint16_t start_lag, end_lag; if(first) { // cable = 0; lcd.cls(); menu.setTitle(TEXT("Shutter Lag Test")); menu.setBar(TEXT("Test 1"), TEXT("Test 2 ")); lcd.update(); } if(key == FL_KEY || key == FR_KEY) { lcd.eraseBox(10, 18, 80, 38); lcd.writeString(10, 18, TEXT("Result:")); ENABLE_SHUTTER; ENABLE_MIRROR; ENABLE_AUX_PORT; _delay_ms(100); if(key == FR_KEY) { MIRROR_UP; _delay_ms(1000); } SHUTTER_OPEN; clock.tare(); while(!AUX_INPUT1) { if(clock.eventMs() >= 1000) break; } start_lag = (uint16_t)clock.eventMs(); _delay_ms(50); SHUTTER_CLOSE; clock.tare(); while(AUX_INPUT1) { if(clock.eventMs() > 1000) break; } end_lag = (uint16_t)clock.eventMs(); lcd.writeNumber(56, 18, start_lag, 'U', 'L'); lcd.writeNumber(56, 28, end_lag, 'U', 'L'); lcd.update(); } if(key == LEFT_KEY) return FN_CANCEL; return FN_CONTINUE; }
volatile char motionTrigger(char key, char first) { uint8_t i; uint16_t val; static uint16_t lv[3]; static uint8_t threshold = 2; if(key == LEFT_KEY) { if(threshold > 0) threshold--; first = 1; } if(key == RIGHT_KEY) { if(threshold < 4) threshold++; first = 1; } if(first) { sleepOk = 0; clock.tare(); lcd.cls(); menu.setTitle(TEXT("Motion Sensor")); menu.setBar(TEXT("RETURN"), BLANK_STR); lcd.drawLine(10, 22, 84-10, 22); lcd.drawLine(11, 21, 11, 23); lcd.drawLine(84-11, 21, 84-11, 23); lcd.drawLine(12, 20, 12, 24); lcd.drawLine(84-12, 20, 84-12, 24); lcd.drawLine(13, 20, 13, 24); lcd.drawLine(84-13, 20, 84-13, 24); lcd.setPixel(42, 21); lcd.setPixel(42+10, 21); lcd.setPixel(42-10, 21); lcd.setPixel(42+20, 21); lcd.setPixel(42-20, 21); i = threshold * 10; lcd.drawLine(42-3-20+i, 16, 42+3-20+i, 16); lcd.drawLine(42-2-20+i, 17, 42+2-20+i, 17); lcd.drawLine(42-1-20+i, 18, 42+1-20+i, 18); lcd.setPixel(42-20+i, 19); lcd.writeStringTiny(19, 25, TEXT("SENSITIVITY")); lcd.update(); lcd.backlight(0); hardware_flashlight(0); _delay_ms(50); for(i = 0; i < 3; i++) { lv[i] = (uint16_t)hardware_readLight(i); } } uint8_t thres = 4 - threshold + 2; if((4 - threshold) > 2) thres += ((4 - threshold) - 1) * 2; for(i = 0; i < 3; i++) { val = (uint16_t)hardware_readLight(i); if(clock.eventMs() > 1000 && val > thres && (val < (lv[i] - thres) || val > (lv[i] + thres))) { clock.tare(); shutter_capture(); } lv[i] = val; } if(key == FL_KEY) { sleepOk = 1; lcd.backlight(255); return FN_CANCEL; } return FN_CONTINUE; }
volatile char cableRelease(char key, char first) { static char status; //, cable; if(first) { status = 0; //cable = 0; lcd.cls(); menu.setTitle(TEXT("Cable Remote")); menu.setBar(TEXT("Bulb"), TEXT("Photo")); lcd.update(); timer.half(); } if(key == FL_KEY) { if(status != 1) { status = 1; lcd.eraseBox(8, 18, 8 + 6 * 11, 26); lcd.writeString(8, 18, TEXT("(BULB OPEN)")); timer.bulbStart(); lcd.update(); } else { status = 0; lcd.eraseBox(8, 18, 8 + 6 * 11, 26); timer.bulbEnd(); lcd.update(); } } else if(key == FR_KEY && status != 1) { status = 0; lcd.eraseBox(8, 18, 8 + 6 * 11, 26); timer.capture(); lcd.update(); } else if(key != 0) { status = 0; lcd.eraseBox(8, 18, 8 + 6 * 11, 26); timer.half(); lcd.update(); } /* if(timer.cableIsConnected()) { if(cable == 0) { cable = 1; lcd.writeStringTiny(6, 28, TEXT("Cable Connected")); lcd.update(); } } else { if(cable == 1) { cable = 0; lcd.eraseBox(6, 28, 6 + 15 * 5, 36); lcd.update(); } } */ if(key == LEFT_KEY) { timer.off(); return FN_CANCEL; } return FN_CONTINUE; }