int main(void) { // Enable pin change interrupt for pulse input PCMSK3 |= _BV(PCINT28); PCICR |= _BV(PCIE3); // Enable pullup resistor on unused pins PORTA = 0xFF; // Set millisecond-timer period to 1ms OCR1A = 9999; STOP_MILLISECOND_TIMER; TIMSK1 |= _BV(OCIE1A); // Set other init usb_initialize(); camera_initialize(); display_initialize(); // Enable relay mode until reboot if (eeprom_read_byte(RELAY_EEPROM_OFFSET) == RELAY_ENABLED) { set_timer_status(TIMER_RELAY); eeprom_update_byte(RELAY_EEPROM_OFFSET, RELAY_DISABLED); } // Enable interrupts sei(); gps_initialize(); // Main program loop for (;;) { // Handle message flags set via interrupt if (message_flags && timer_status != TIMER_RELAY) { uint8_t temp_int_flags = 0; ATOMIC_BLOCK(ATOMIC_FORCEON) { temp_int_flags = message_flags; message_flags = 0; } if (temp_int_flags & FLAG_SEND_TRIGGER) usb_send_trigger(); if (temp_int_flags & FLAG_SEND_TIMESTAMP) usb_send_timestamp(); if (temp_int_flags & FLAG_SEND_STATUS) usb_send_status(timer_status, gps_status); if (temp_int_flags & FLAG_STOP_EXPOSURE) usb_stop_exposure(); if (temp_int_flags & FLAG_DUPLICATE_PULSE) usb_send_message_P(msg_duplicate_pulse); if (temp_int_flags & FLAG_MISSING_PULSE) usb_send_message_P(msg_missing_pulse); if (temp_int_flags & FLAG_TIME_DRIFT) usb_send_message_fmt_P(fmt_time_drift, millisecond_drift); } camera_tick(); usb_tick(); gps_tick(); display_update(); }
int main(int ac, char** av) { t_vm* vm = vm_initialize(); t_process* process = (t_process*) malloc(sizeof(t_process)); int32 i; t_display* display; int32 update_display = 0; int32 was_pressed = 0; t_ring_buffer* ring_buffer; ring_buffer = ring_buffer_initialize(10, free); if (load_cores(vm, ac, av) <= 0) return -1; display = display_initialize(800, 600); vm_set_print_callback(vm, main_debug_print, ring_buffer); if (1) { while (vm->process_count && !display_should_exit(display)) { vm->cycle_current++; update_display = 1; int process_count = vm->process_count; for (i = 0; i < process_count; ++i) { t_process* process = vm->processes[i]; if (process->cycle_wait <= 0) { update_display = 0; vm_reset_process_io_op(process); if (process->current_opcode) vm_execute(vm, process); vm_get_opcode(vm, process); } else process->cycle_wait--; } if (vm->cycle_current > vm->cycle_to_die) { vm->cycle_current = 0; vm_kill_process_if_no_live(vm); } vm_clean_dead_process(vm); // update_display = 0; if (display_update_input(display) || update_display == 0) { display_print_ring_buffer(display, 0, 0, ring_buffer); display_step(vm, display); } } } else { int32 execute_one = 0; int32 current_keys_state[GLFW_KEY_LAST]; int32 previous_keys_state[GLFW_KEY_LAST]; memset(previous_keys_state, 0, GLFW_KEY_LAST * sizeof(int32)); memset(current_keys_state, 0, GLFW_KEY_LAST * sizeof(int32)); display_step(vm, display); while (vm->process_count && !display_should_exit(display)) { int32 executed = 0; int32 print_processes; int32 process_count = 0; current_keys_state[GLFW_KEY_S] = display_key_pressed(display, GLFW_KEY_S); current_keys_state[GLFW_KEY_P] = display_key_pressed(display, GLFW_KEY_P); if (!execute_one) execute_one = previous_keys_state[GLFW_KEY_S] && !current_keys_state[GLFW_KEY_S]; print_processes = previous_keys_state[GLFW_KEY_P] && !current_keys_state[GLFW_KEY_P]; memcpy(previous_keys_state, current_keys_state, sizeof(int32) * GLFW_KEY_LAST); if (execute_one) vm->cycle_current++; for (i = 0; i < vm->process_count; ++i) { t_process* process = vm->processes[i]; if (print_processes) vm_debug_print_process(vm, process); if (execute_one) { if (process->cycle_wait <= 0) { vm_reset_process_io_op(process); vm_execute(vm, process); vm_get_opcode(vm, process); executed++; if (vm->live_count >= NBR_LIVE) { vm->live_count = 0; vm->cycle_to_die -= vm->cycle_delta; } } process->cycle_wait--; } } if (executed) execute_one = 0; if (vm->cycle_current > vm->cycle_to_die) { vm->cycle_current = 0; vm_kill_process_if_no_live(vm); } vm_clean_dead_process(vm); executed += display_update_input(display); if (executed) display_step(vm, display); else glfwPollEvents(); } } ring_buffer_destroy(ring_buffer); display_destroy(display); vm_destroy(vm); }