int main( int argc, char** argv ) { int devfd; int value, ret; #if ( defined(DIRECT_IO_ACCESS) && !defined(DJGPP) ) #if (defined(LINUX_ENV)) iopl(3); #endif #if (defined(FreeBSD_ENV)) int iofl; SET_IOPL(); #endif #endif fprintf(stdout, "=== Lanner platform miscellaneous utility ===\n");; fprintf(stdout, PLATFORM_NAME" Status LED "CODE_VERSION"\n\n");; #ifdef DIRECT_IO_ACCESS sled_gpio_init(); printf("Set LED RED for 4 seconds...\n"); set_led_green(); sleep(4); printf("Set LED GREEN for 4 seconds...\n"); set_led_amber(); sleep(4); printf("Set LED DARK\n"); set_led_off(); printf("Test Finished.\n"); #if (defined(FreeBSD_ENV)) RESET_IOPL(); #endif #else devfd = open("/dev/sled_drv", O_RDONLY); if(devfd == -1) { printf("Can't open /dev/sled_drv\n"); return -1; } printf("Set LED AMBER for 4 seconds...\n"); value = LED_SET_STATUS_AMBER; ret = ioctl(devfd, IOCTL_LED_SET_STATUS, &value); sleep(4); printf("Set LED GREEN for 4 seconds...\n"); value = LED_SET_STATUS_GREEN; ret = ioctl(devfd, IOCTL_LED_SET_STATUS, &value); sleep(4); printf("Set LED DARK\n"); value = LED_SET_STATUS_OFF; ret = ioctl(devfd, IOCTL_LED_SET_STATUS, &value); printf("Test Finished.\n"); close(devfd); return 0; #endif //DIRECT_IO_ACCESS return 0; }
static void update_state(void){ static utime_t fault_song = 0; static utime_t diag_last = 0; static int8_t diag_counter = 0; int sw = get_switch(); int bn = get_button(); blinky_override = 0; switch( inv_state ){ case INV_STATE_OFF: set_led_green(0); if( sw ){ // switch was turned on ondelay_until = get_time() + ONDELAY; inv_state = INV_STATE_ONDELAY; blinky_override = 1; set_led_white(255); play(ivolume, "c+3"); // debounce delay printbig("STARTING...\n"); syslog("switch on"); } break; case INV_STATE_ONDELAY: if( !sw ){ // switch was turned off inv_state = INV_STATE_OFF; play(ivolume, "a-3"); diag_counter ++; diag_last = get_time(); printbig("OFF\n"); usleep(500000); print_ready(); syslog("canceled"); }else if( get_time() >= ondelay_until ){ // countdown finished set_led_green( 255 ); inv_state = INV_STATE_ONDELAY2; diag_counter = 0; play(ivolume, "b"); printbig("ACTIVE\n"); syslog("ac active"); }else{ // flash + chirp; 2Hz blinky_override = 1; set_led_green(127); set_led_white(0); play(ivolume, "b+5>>"); set_led_green(0); set_led_white(64); usleep(437500); // reset the clock if Vi drops below 300 (per the spec) if( s_vi._curr < MIN_VI_SOFT ){ ondelay_until = get_time() + ONDELAY; } } break; case INV_STATE_ONDELAY2: // will move to running at next zero-xing break; case INV_STATE_RUNNING: set_led_green( 127 ); if( !sw ){ // switch was turned off // quickly bring VH down, and stop at zero-xing shutdown_until = get_time() + OFFDELAY; inv_state = INV_STATE_SHUTTINGDOWN; play(ivolume, "a-3"); // debounce syslog("switch off"); } break; case INV_STATE_SHUTTINGDOWN: set_led_green(255); if( get_time() >= shutdown_until ){ if( sw ){ // wild switch flipping inv_state = INV_STATE_FAULTEDOFF; fault_song = 0; fault_reason = "SWITCH ERR"; syslog("switch fault"); }else{ // done ramping down inv_state = INV_STATE_OFF; play(ivolume, "f-3"); printbig("AC OFF\n"); syslog("ac disabled"); usleep(500000); print_ready(); } } break; case INV_STATE_FAULTED: set_led_green(255); set_led_red(255); // we ramp down same as a shutdown, but end in faultedoff shutdown_until = get_time() + OFFDELAY; inv_state = INV_STATE_FAULTINGDOWN; printadj(fault_reason); break; case INV_STATE_FAULTINGDOWN: set_led_green(255); set_led_red(255); if( get_time() >= shutdown_until ){ inv_state = INV_STATE_FAULTEDOFF; fault_song = 0; syslog("ac disabled (fault)"); } break; case INV_STATE_FAULTEDOFF: set_led_green(0); set_led_red(255); if( !sw ){ // switch turned off, resume normal operation inv_state = INV_STATE_OFF; play(ivolume, "f-3"); set_led_red(0); print_ready(); }else if( get_time() >= fault_song ){ // periodically, sing printadj(fault_reason); play(128, "t150[4 d+3d-3]"); fault_song = get_time() + FAULTSONGT; } break; case INV_STATE_DIAG: menu(&guitop); inv_state = INV_STATE_OFF; print_ready(); break; case INV_STATE_TEST: break; } if( diag_last && diag_last + 5000000 < get_time() ){ diag_counter = 0; diag_last = 0; } // toggle switch rapidly, or toggle switch once + press button if( (diag_mode != 2) && ((diag_counter >= 5) || (bn && diag_counter)) ){ inv_state = INV_STATE_DIAG; diag_counter = 0; printbig("DIAG MODE\n"); syslog("diag mode"); play(ivolume, "g4e4f4f-3"); // ... } }