/* ATmega328P 20MHz */ /* Fuses (E:FF, H:D9, L:F7) */ #define F_CPU 20000000L #include #include #include #include #include #include "config.h" volatile uint8_t polarization_h, polarization_v, polarization_count, line_pair, i, mode, page, page_flash, keyboard_state, frames_per_keyboard_read, frames_per_keyboard_read_target=5, tb_objects, tb_objects_order, tb_ao_position_h, tb_ao_position_v, tb_ao_size_v, tb_ao_frequency, tb_ao_frequency_change_flag, tb_ao_frames_count, tb_ao_frames_per_upper_part, tb_ao_frames_target, tb_ao_position, tb_ao_on_flag, tb_ao_gap, tb_ao_size_v_minus_gap, tb_ao_size_v_plus_gap, tb_di_position_v, tb_di_size_v, tb_di_period, tb_di_period_change_flag, tb_di_position, tb_di_on_flag, tb_di_break, tb_di_gap, sbs_objects, sbs_objects_order, sbs_ao_position_h, sbs_ao_position_v, sbs_ao_size_h, sbs_ao_frequency, sbs_ao_frequency_change_flag, sbs_ao_frames_count, sbs_ao_frames_per_left_part, sbs_ao_frames_target, sbs_ao_position, sbs_ao_on_flag, sbs_ao_gap, sbs_di_position_h, sbs_di_size_h, sbs_di_period, sbs_di_period_change_flag, sbs_di_position, sbs_di_on_flag, sbs_di_break, sbs_ao_left_edge, sbs_ao_right_edge, sbs_di_left_edge, sbs_di_right_edge, sbs_line_beginning, ffr_objects, ffr_objects_order, ffr_fr_position, ffr_fr_visible, ffr_fr_period, ffr_fr_on_flag, ffr_fr_period_change_flag, ffr_fr_v_values_change_flag, ffr_sr_position, ffr_sr_visible, ffr_sr_period, ffr_sr_on_flag, ffr_sr_period_change_flag, ffr_sr_v_values_change_flag, frames_per_line_count_change_check; volatile uint8_t rendered_line[320]; volatile int8_t tb_di_offset, sbs_di_offset; volatile uint16_t line_count, j, frames_to_settings_save, tb_ao_size_h, tb_ao_left_edge, tb_ao_right_edge, tb_di_left_edge, tb_di_right_edge, tb_di_position_h, tb_di_size_h, tb_di_frames_count, tb_di_frames_per_upper_part, tb_di_frames_target, tb_di_left_edge, tb_di_right_edge, sbs_ao_size_v, sbs_di_position_v, sbs_di_size_v, sbs_di_frames_count, sbs_di_frames_per_left_part, sbs_di_frames_target, sbs_di_gap, ffr_gap, ffr_fr_frames_count, ffr_fr_frames_per_visible_part, ffr_fr_frames_target, ffr_fr_position_h, ffr_fr_position_v, ffr_fr_size_h, ffr_fr_size_v, ffr_sr_frames_count, ffr_sr_frames_per_visible_part, ffr_sr_frames_target, ffr_sr_position_h, ffr_sr_position_v, ffr_sr_size_h, ffr_sr_size_v, number_of_lines_in_previous_frame; volatile int16_t temp_tb_di_size_v, temp_sbs_di_size_h, temp_sbs_di_size_v; void turn_off_watchdog(void) __attribute__((naked)) __attribute__((section(".init3"))); void turn_off_watchdog(void) { MCUSR = 0; // clear Watchdog System Reset Flag, so MCU can start after watchdog system reset wdt_reset(); // reset watchdog WDTCSR |= (1< MAX_TB_AO_FREQUENCY) tb_ao_frequency = DEFAULT_TB_AO_FREQUENCY; tb_ao_frames_per_upper_part = eeprom_read_byte((uint8_t*)ADDRESS_TB_AO_FRAMES_PER_UPPER_PART); if(tb_ao_frames_per_upper_part > MAX_TB_AO_FRAMES_PER_UPPER_PART) tb_ao_frames_per_upper_part = DEFAULT_TB_AO_FRAMES_PER_UPPER_PART; tb_ao_on_flag = eeprom_read_byte((uint8_t*)ADDRESS_TB_AO_ON_FLAG); if(tb_ao_on_flag > MAX_TB_AO_ON_FLAG) tb_ao_on_flag = DEFAULT_TB_AO_ON_FLAG; tb_ao_gap = eeprom_read_byte((uint8_t*)ADDRESS_TB_AO_GAP); if(tb_ao_gap > MAX_TB_AO_GAP) tb_ao_gap = DEFAULT_TB_AO_GAP; tb_ao_position_h = eeprom_read_byte((uint8_t*)ADDRESS_TB_AO_POSITION_H); if((tb_ao_position_hMAX_TB_AO_POSITION_H)) tb_ao_position_h = DEFAULT_TB_AO_POSITION_H; tb_ao_position_v = eeprom_read_byte((uint8_t*)ADDRESS_TB_AO_POSITION_V); if(tb_ao_position_v > MAX_TB_AO_POSITION_V) tb_ao_position_v = DEFAULT_TB_AO_POSITION_V; tb_ao_size_h = eeprom_read_word((uint16_t*)ADDRESS_TB_AO_SIZE_H); if((tb_ao_size_hMAX_TB_AO_SIZE_H)) tb_ao_size_h = DEFAULT_TB_AO_SIZE_H; tb_ao_size_v = eeprom_read_byte((uint8_t*)ADDRESS_TB_AO_SIZE_V); if((tb_ao_size_vMAX_TB_AO_SIZE_V)) tb_ao_size_v = DEFAULT_TB_AO_SIZE_V; tb_di_period = eeprom_read_byte((uint8_t*)ADDRESS_TB_DI_PERIOD); if(tb_di_period > MAX_TB_DI_PERIOD) tb_di_period = DEFAULT_TB_DI_PERIOD; tb_di_frames_per_upper_part = eeprom_read_word((uint16_t*)ADDRESS_TB_DI_FRAMES_PER_UPPER_PART); if(tb_di_frames_per_upper_part > MAX_TB_DI_FRAMES_PER_UPPER_PART) tb_di_frames_per_upper_part = DEFAULT_TB_DI_FRAMES_PER_UPPER_PART; tb_di_on_flag = eeprom_read_byte((uint8_t*)ADDRESS_TB_DI_ON_FLAG); if(tb_di_on_flag > MAX_TB_DI_ON_FLAG) tb_di_on_flag = DEFAULT_TB_DI_ON_FLAG; tb_di_offset = eeprom_read_byte((uint8_t*)ADDRESS_TB_DI_OFFSET); if((tb_di_offsetMAX_TB_DI_OFFSET)) tb_di_offset = DEFAULT_TB_DI_OFFSET; tb_di_break = eeprom_read_byte((uint8_t*)ADDRESS_TB_DI_BREAK); if(tb_di_break > MAX_TB_DI_BREAK) tb_di_break = DEFAULT_TB_DI_BREAK; tb_di_position_h = eeprom_read_word((uint16_t*)ADDRESS_TB_DI_POSITION_H); if(tb_di_position_h>MAX_TB_DI_POSITION_H) tb_di_position_h = DEFAULT_TB_DI_POSITION_H; tb_di_position_v = eeprom_read_byte((uint8_t*)ADDRESS_TB_DI_POSITION_V); if(tb_di_position_v > MAX_TB_DI_POSITION_V) tb_di_position_v = DEFAULT_TB_DI_POSITION_V; tb_di_size_h = eeprom_read_word((uint16_t*)ADDRESS_TB_DI_SIZE_H); if((tb_di_size_hMAX_TB_DI_SIZE_H)) tb_di_size_h = DEFAULT_TB_DI_SIZE_H; tb_di_size_v = eeprom_read_byte((uint8_t*)ADDRESS_TB_DI_SIZE_V); if( (tb_di_size_v < MIN_TB_DI_SIZE_V) || (tb_di_size_v > MAX_TB_DI_SIZE_V)) tb_di_size_v = DEFAULT_TB_DI_SIZE_V; sbs_ao_frequency = eeprom_read_byte((uint8_t*)ADDRESS_SBS_AO_FREQUENCY); if(sbs_ao_frequency > MAX_SBS_AO_FREQUENCY) sbs_ao_frequency = DEFAULT_SBS_AO_FREQUENCY; sbs_ao_frames_per_left_part = eeprom_read_byte((uint8_t*)ADDRESS_SBS_AO_FRAMES_PER_LEFT_PART); if(sbs_ao_frames_per_left_part > MAX_SBS_AO_FRAMES_PER_LEFT_PART) sbs_ao_frames_per_left_part = DEFAULT_SBS_AO_FRAMES_PER_LEFT_PART; sbs_ao_on_flag = eeprom_read_byte((uint8_t*)ADDRESS_SBS_AO_ON_FLAG); if(sbs_ao_on_flag > MAX_SBS_AO_ON_FLAG) sbs_ao_on_flag = DEFAULT_SBS_AO_ON_FLAG; sbs_ao_gap = eeprom_read_byte((uint8_t*)ADDRESS_SBS_AO_GAP); if(sbs_ao_gap > MAX_SBS_AO_GAP) sbs_ao_gap = DEFAULT_SBS_AO_GAP; sbs_ao_position_h = eeprom_read_byte((uint8_t*)ADDRESS_SBS_AO_POSITION_H); if((sbs_ao_position_hMAX_SBS_AO_POSITION_H)) sbs_ao_position_h = DEFAULT_SBS_AO_POSITION_H; sbs_ao_position_v = eeprom_read_byte((uint8_t*)ADDRESS_SBS_AO_POSITION_V); if(sbs_ao_position_v > MAX_SBS_AO_POSITION_V) sbs_ao_position_v = DEFAULT_SBS_AO_POSITION_V; sbs_ao_right_edge = eeprom_read_byte((uint8_t*)ADDRESS_SBS_AO_RIGHT_EDGE); if((sbs_ao_right_edgeMAX_SBS_RIGHT_EDGE)) sbs_ao_right_edge = DEFAULT_SBS_AO_RIGHT_EDGE; sbs_ao_size_v = eeprom_read_word((uint16_t*)ADDRESS_SBS_AO_SIZE_V); if((sbs_ao_size_vMAX_SBS_AO_SIZE_V)) sbs_ao_size_v = DEFAULT_SBS_AO_SIZE_V; sbs_di_period = eeprom_read_byte((uint8_t*)ADDRESS_SBS_DI_PERIOD); if(sbs_di_period > MAX_SBS_DI_PERIOD) sbs_di_period = DEFAULT_SBS_DI_PERIOD; sbs_di_frames_per_left_part = eeprom_read_word((uint16_t*)ADDRESS_SBS_DI_FRAMES_PER_LEFT_PART); if(sbs_di_frames_per_left_part > MAX_SBS_DI_FRAMES_PER_LEFT_PART) sbs_di_frames_per_left_part = DEFAULT_SBS_DI_FRAMES_PER_LEFT_PART; sbs_di_on_flag = eeprom_read_byte((uint8_t*)ADDRESS_SBS_DI_ON_FLAG); if(sbs_di_on_flag > MAX_SBS_DI_ON_FLAG) sbs_di_on_flag = DEFAULT_SBS_DI_ON_FLAG; sbs_di_offset = eeprom_read_byte((uint8_t*)ADDRESS_SBS_DI_OFFSET); if((sbs_di_offsetMAX_SBS_DI_OFFSET)) sbs_di_offset = DEFAULT_SBS_DI_OFFSET; sbs_di_break = eeprom_read_byte((uint8_t*)ADDRESS_SBS_DI_BREAK); if(sbs_di_break > MAX_SBS_DI_BREAK) sbs_di_break = DEFAULT_SBS_DI_BREAK; sbs_di_position_h = eeprom_read_byte((uint8_t*)ADDRESS_SBS_DI_POSITION_H); if((sbs_di_position_hMAX_SBS_DI_POSITION_H)) sbs_di_position_h = DEFAULT_SBS_DI_POSITION_H; sbs_di_position_v = eeprom_read_word((uint16_t*)ADDRESS_SBS_DI_POSITION_V); if(sbs_di_position_v > MAX_SBS_DI_POSITION_V) sbs_di_position_v = DEFAULT_SBS_DI_POSITION_V; sbs_di_size_h = eeprom_read_byte((uint8_t*)ADDRESS_SBS_DI_SIZE_H); if((sbs_di_size_hMAX_SBS_DI_SIZE_H)) sbs_di_size_h = DEFAULT_SBS_DI_SIZE_H; sbs_di_size_v = eeprom_read_word((uint16_t*)ADDRESS_SBS_DI_SIZE_V); if((sbs_di_size_v < MIN_SBS_DI_SIZE_V) || (sbs_di_size_v > MAX_SBS_DI_SIZE_V)) sbs_di_size_v = DEFAULT_SBS_DI_SIZE_V; ffr_fr_position = eeprom_read_byte((uint8_t*)ADDRESS_FFR_FR_POSITION); if(ffr_fr_position > MAX_FFR_FR_POSITION) ffr_fr_position = DEFAULT_FFR_FR_POSITION; ffr_fr_period = eeprom_read_byte((uint8_t*)ADDRESS_FFR_FR_PERIOD); if(ffr_fr_period > MAX_FFR_FR_PERIOD) ffr_fr_period = DEFAULT_FFR_FR_PERIOD; ffr_fr_frames_per_visible_part = eeprom_read_word((uint16_t*)ADDRESS_FFR_FR_FRAMES_PER_VISIBLE_PART); if(ffr_fr_frames_per_visible_part > MAX_FFR_FR_FRAMES_PER_VISIBLE_PART) ffr_fr_frames_per_visible_part = DEFAULT_FFR_FR_FRAMES_PER_VISIBLE_PART; ffr_fr_on_flag = eeprom_read_byte((uint8_t*)ADDRESS_FFR_FR_ON_FLAG); if(ffr_fr_on_flag > MAX_FFR_FR_ON_FLAG) ffr_fr_on_flag = DEFAULT_FFR_FR_ON_FLAG; ffr_fr_position_h = eeprom_read_word((uint16_t*)ADDRESS_FFR_FR_POSITION_H); if((ffr_fr_position_hMAX_FFR_FR_POSITION_H)) ffr_fr_position_h = DEFAULT_FFR_FR_POSITION_H; ffr_fr_position_v = eeprom_read_word((uint16_t*)ADDRESS_FFR_FR_POSITION_V); if(ffr_fr_position_v > MAX_FFR_FR_POSITION_V) ffr_fr_position_v = DEFAULT_FFR_FR_POSITION_V; ffr_fr_size_h = eeprom_read_word((uint16_t*)ADDRESS_FFR_FR_SIZE_H); if((ffr_fr_size_hMAX_FFR_FR_SIZE_H)) ffr_fr_size_h = DEFAULT_FFR_FR_SIZE_H; ffr_fr_size_v = eeprom_read_word((uint16_t*)ADDRESS_FFR_FR_SIZE_V); if( (ffr_fr_size_v < MIN_FFR_FR_SIZE_V) || (ffr_fr_size_v > MAX_FFR_FR_SIZE_V)) ffr_fr_size_v = DEFAULT_FFR_FR_SIZE_V; ffr_sr_position = eeprom_read_byte((uint8_t*)ADDRESS_FFR_SR_POSITION); if(ffr_sr_position > MAX_FFR_SR_POSITION) ffr_sr_position = DEFAULT_FFR_SR_POSITION; ffr_sr_period = eeprom_read_byte((uint8_t*)ADDRESS_FFR_SR_PERIOD); if(ffr_sr_period > MAX_FFR_SR_PERIOD) ffr_sr_period = DEFAULT_FFR_SR_PERIOD; ffr_sr_frames_per_visible_part = eeprom_read_word((uint16_t*)ADDRESS_FFR_SR_FRAMES_PER_VISIBLE_PART); if(ffr_sr_frames_per_visible_part > MAX_FFR_SR_FRAMES_PER_VISIBLE_PART) ffr_sr_frames_per_visible_part = DEFAULT_FFR_SR_FRAMES_PER_VISIBLE_PART; ffr_sr_on_flag = eeprom_read_byte((uint8_t*)ADDRESS_FFR_SR_ON_FLAG); if(ffr_sr_on_flag > MAX_FFR_SR_ON_FLAG) ffr_sr_on_flag = DEFAULT_FFR_SR_ON_FLAG; ffr_sr_position_h = eeprom_read_word((uint16_t*)ADDRESS_FFR_SR_POSITION_H); if((ffr_sr_position_hMAX_FFR_SR_POSITION_H)) ffr_sr_position_h = DEFAULT_FFR_SR_POSITION_H; ffr_sr_position_v = eeprom_read_word((uint16_t*)ADDRESS_FFR_SR_POSITION_V); if(ffr_sr_position_v > MAX_FFR_SR_POSITION_V) ffr_sr_position_v = DEFAULT_FFR_SR_POSITION_V; ffr_sr_size_h = eeprom_read_word((uint16_t*)ADDRESS_FFR_SR_SIZE_H); if((ffr_sr_size_hMAX_FFR_SR_SIZE_H)) ffr_sr_size_h = DEFAULT_FFR_SR_SIZE_H; ffr_sr_size_v = eeprom_read_word((uint16_t*)ADDRESS_FFR_SR_SIZE_V); if( (ffr_sr_size_v < MIN_FFR_SR_SIZE_V) || (ffr_sr_size_v > MAX_FFR_SR_SIZE_V)) ffr_sr_size_v = DEFAULT_FFR_SR_SIZE_V; EIMSK |= (1 << INT1) | (1 << INT0); // enable Hsync and Vsync interrupts sei(); // global interrupt enable while (1) { } } /* Vsync interrupt. Change of settings and rendering is done here. */ ISR(INT1_vect) { TIMSK1 &= ~( (1 << OCIE1B) | (1 << OCIE1A) ); // disable 16-bit Timer/Counter1 compare match interrupts wdt_reset(); // reset watchdog to make sure that device won't restart /* Every 10 frames check if number of lines in frame did not change (change of resolution). If so, restart MCU with Watchdog System Reset (detection of sync pulse polarity is done at MCU start-up). */ frames_per_line_count_change_check++; if(frames_per_line_count_change_check > 10) { if(number_of_lines_in_previous_frame > 80) { if( (line_count < number_of_lines_in_previous_frame - 5) || (line_count > number_of_lines_in_previous_frame + 5) ) { wdt_reset(); WDTCSR |= (1<= 4) mode = 0; frames_per_keyboard_read_target = 10; } // and PAGE_KEY is not, change mode to next one else { // if MODE_KEY and PAGE_KEY are both pressed, set default settings mode = 0; page = 5; tb_ao_frequency = DEFAULT_TB_AO_FREQUENCY; tb_ao_frames_per_upper_part = DEFAULT_TB_AO_FRAMES_PER_UPPER_PART; tb_ao_on_flag = DEFAULT_TB_AO_ON_FLAG; tb_ao_gap = DEFAULT_TB_AO_GAP; tb_ao_position_h = DEFAULT_TB_AO_POSITION_H; tb_ao_position_v = DEFAULT_TB_AO_POSITION_V; tb_ao_size_h = DEFAULT_TB_AO_SIZE_H; tb_ao_size_v = DEFAULT_TB_AO_SIZE_V; tb_di_period = DEFAULT_TB_DI_PERIOD; tb_di_frames_per_upper_part = DEFAULT_TB_DI_FRAMES_PER_UPPER_PART; tb_di_on_flag = DEFAULT_TB_DI_ON_FLAG; tb_di_offset = DEFAULT_TB_DI_OFFSET; tb_di_break = DEFAULT_TB_DI_BREAK; tb_di_position_h = DEFAULT_TB_DI_POSITION_H; tb_di_position_v = DEFAULT_TB_DI_POSITION_V; tb_di_size_h = DEFAULT_TB_DI_SIZE_H; tb_di_size_v = DEFAULT_TB_DI_SIZE_V; eeprom_update_byte((uint8_t*)ADDRESS_TB_AO_FREQUENCY, tb_ao_frequency); eeprom_update_byte((uint8_t*)ADDRESS_TB_AO_FRAMES_PER_UPPER_PART, tb_ao_frames_per_upper_part); eeprom_update_byte((uint8_t*)ADDRESS_TB_AO_ON_FLAG, tb_ao_on_flag); eeprom_update_byte((uint8_t*)ADDRESS_TB_AO_GAP, tb_ao_gap); eeprom_update_byte((uint8_t*)ADDRESS_TB_AO_POSITION_H, tb_ao_position_h); eeprom_update_byte((uint8_t*)ADDRESS_TB_AO_POSITION_V, tb_ao_position_v); eeprom_update_word((uint16_t*)ADDRESS_TB_AO_SIZE_H, tb_ao_size_h); eeprom_update_byte((uint8_t*)ADDRESS_TB_AO_SIZE_V, tb_ao_size_v); eeprom_update_byte((uint8_t*)ADDRESS_TB_DI_PERIOD, tb_di_period); eeprom_update_word((uint16_t*)ADDRESS_TB_DI_FRAMES_PER_UPPER_PART, tb_di_frames_per_upper_part); eeprom_update_byte((uint8_t*)ADDRESS_TB_DI_ON_FLAG, tb_di_on_flag); eeprom_update_byte((uint8_t*)ADDRESS_TB_DI_OFFSET, tb_di_offset); eeprom_update_byte((uint8_t*)ADDRESS_TB_DI_BREAK, tb_di_break); eeprom_update_word((uint16_t*)ADDRESS_TB_DI_POSITION_H, tb_di_position_h); eeprom_update_byte((uint8_t*)ADDRESS_TB_DI_POSITION_V, tb_di_position_v); eeprom_update_word((uint16_t*)ADDRESS_TB_DI_SIZE_H, tb_di_size_h); eeprom_update_byte((uint8_t*)ADDRESS_TB_DI_SIZE_V, tb_di_size_v); sbs_ao_frequency = DEFAULT_SBS_AO_FREQUENCY; sbs_ao_frames_per_left_part = DEFAULT_SBS_AO_FRAMES_PER_LEFT_PART; sbs_ao_on_flag = DEFAULT_SBS_AO_ON_FLAG; sbs_ao_gap = DEFAULT_SBS_AO_GAP; sbs_ao_position_h = DEFAULT_SBS_AO_POSITION_H; sbs_ao_position_v = DEFAULT_SBS_AO_POSITION_V; sbs_ao_right_edge = DEFAULT_SBS_AO_RIGHT_EDGE; sbs_ao_size_v = DEFAULT_SBS_AO_SIZE_V; sbs_di_period = DEFAULT_SBS_DI_PERIOD; sbs_di_frames_per_left_part = DEFAULT_SBS_DI_FRAMES_PER_LEFT_PART; sbs_di_on_flag = DEFAULT_SBS_DI_ON_FLAG; sbs_di_offset = DEFAULT_SBS_DI_OFFSET; sbs_di_break = DEFAULT_SBS_DI_BREAK; sbs_di_position_h = DEFAULT_SBS_DI_POSITION_H; sbs_di_position_v = DEFAULT_SBS_DI_POSITION_V; sbs_di_size_h = DEFAULT_SBS_DI_SIZE_H; sbs_di_size_v = DEFAULT_SBS_DI_SIZE_V; eeprom_update_byte((uint8_t*)ADDRESS_SBS_AO_FREQUENCY, sbs_ao_frequency); eeprom_update_byte((uint8_t*)ADDRESS_SBS_AO_FRAMES_PER_LEFT_PART, sbs_ao_frames_per_left_part); eeprom_update_byte((uint8_t*)ADDRESS_SBS_AO_ON_FLAG, sbs_ao_on_flag); eeprom_update_byte((uint8_t*)ADDRESS_SBS_AO_GAP, sbs_ao_gap); eeprom_update_byte((uint8_t*)ADDRESS_SBS_AO_POSITION_H, sbs_ao_position_h); eeprom_update_byte((uint8_t*)ADDRESS_SBS_AO_POSITION_V, sbs_ao_position_v); eeprom_update_byte((uint8_t*)ADDRESS_SBS_AO_RIGHT_EDGE, sbs_ao_right_edge); eeprom_update_word((uint16_t*)ADDRESS_SBS_AO_SIZE_V, sbs_ao_size_v); eeprom_update_byte((uint8_t*)ADDRESS_SBS_DI_PERIOD, sbs_di_period); eeprom_update_word((uint16_t*)ADDRESS_SBS_DI_FRAMES_PER_LEFT_PART, sbs_di_frames_per_left_part); eeprom_update_byte((uint8_t*)ADDRESS_SBS_DI_ON_FLAG, sbs_di_on_flag); eeprom_update_byte((uint8_t*)ADDRESS_SBS_DI_OFFSET, sbs_di_offset); eeprom_update_byte((uint8_t*)ADDRESS_SBS_DI_BREAK, sbs_di_break); eeprom_update_byte((uint8_t*)ADDRESS_SBS_DI_POSITION_H, sbs_di_position_h); eeprom_update_word((uint16_t*)ADDRESS_SBS_DI_POSITION_V, sbs_di_position_v); eeprom_update_byte((uint8_t*)ADDRESS_SBS_DI_SIZE_H, sbs_di_size_h); eeprom_update_word((uint16_t*)ADDRESS_SBS_DI_SIZE_V, sbs_di_size_v); ffr_fr_position = DEFAULT_FFR_FR_POSITION; ffr_fr_period = DEFAULT_FFR_FR_PERIOD; ffr_fr_frames_per_visible_part = DEFAULT_FFR_FR_FRAMES_PER_VISIBLE_PART; ffr_fr_on_flag = DEFAULT_FFR_FR_ON_FLAG; ffr_fr_position_h = DEFAULT_FFR_FR_POSITION_H; ffr_fr_position_v = DEFAULT_FFR_FR_POSITION_V; ffr_fr_size_h = DEFAULT_FFR_FR_SIZE_H; ffr_fr_size_v = DEFAULT_FFR_FR_SIZE_V; ffr_sr_position = DEFAULT_FFR_SR_POSITION; ffr_sr_period = DEFAULT_FFR_SR_PERIOD; ffr_sr_frames_per_visible_part = DEFAULT_FFR_SR_FRAMES_PER_VISIBLE_PART; ffr_sr_on_flag = DEFAULT_FFR_SR_ON_FLAG; ffr_sr_position_h = DEFAULT_FFR_SR_POSITION_H; ffr_sr_position_v = DEFAULT_FFR_SR_POSITION_V; ffr_sr_size_h = DEFAULT_FFR_SR_SIZE_H; ffr_sr_size_v = DEFAULT_FFR_SR_SIZE_V; eeprom_update_byte((uint8_t*)ADDRESS_FFR_FR_POSITION, ffr_fr_position); eeprom_update_byte((uint8_t*)ADDRESS_FFR_FR_PERIOD, ffr_fr_period); eeprom_update_word((uint16_t*)ADDRESS_FFR_FR_FRAMES_PER_VISIBLE_PART, ffr_fr_frames_per_visible_part); eeprom_update_byte((uint8_t*)ADDRESS_FFR_FR_ON_FLAG, ffr_fr_on_flag); eeprom_update_word((uint16_t*)ADDRESS_FFR_FR_POSITION_H, ffr_fr_position_h); eeprom_update_word((uint16_t*)ADDRESS_FFR_FR_POSITION_V, ffr_fr_position_v); eeprom_update_word((uint16_t*)ADDRESS_FFR_FR_SIZE_H, ffr_fr_size_h); eeprom_update_word((uint16_t*)ADDRESS_FFR_FR_SIZE_V, ffr_fr_size_v); eeprom_update_byte((uint8_t*)ADDRESS_FFR_SR_POSITION, ffr_sr_position); eeprom_update_byte((uint8_t*)ADDRESS_FFR_SR_PERIOD, ffr_sr_period); eeprom_update_word((uint16_t*)ADDRESS_FFR_SR_FRAMES_PER_VISIBLE_PART, ffr_sr_frames_per_visible_part); eeprom_update_byte((uint8_t*)ADDRESS_FFR_SR_ON_FLAG, ffr_sr_on_flag); eeprom_update_word((uint16_t*)ADDRESS_FFR_SR_POSITION_H, ffr_sr_position_h); eeprom_update_word((uint16_t*)ADDRESS_FFR_SR_POSITION_V, ffr_sr_position_v); eeprom_update_word((uint16_t*)ADDRESS_FFR_SR_SIZE_H, ffr_sr_size_h); eeprom_update_word((uint16_t*)ADDRESS_FFR_SR_SIZE_V, ffr_sr_size_v); frames_per_keyboard_read_target = 20; } } if( !(KEYBOARD_PORT_IN &= (1 << PAGE_KEY)) ) { // if PAGE_KEY is pressed... if(KEYBOARD_PORT_IN &= (1 << SHIFT_KEY)) { page++; if(page >= 6) page = 0; } // and SHIFT_KEY is not, change page to next one else { page--; if(page > 240) page = 5; } // if PAGE_KEY and SHIFT_KEY are both pressed, change page to previous one frames_per_keyboard_read_target = 10; // 10 frames till next keyboard read } } frames_per_keyboard_read++; break; /* --- TOP - BOTTOM --- */ case 1: /* Read keyboard. */ if(frames_per_keyboard_read == frames_per_keyboard_read_target) { // read keyboard every frames_per_keyboard_read_target frames_per_keyboard_read_target = 5; // by default every 5 frames (changes when button is pressed) frames_per_keyboard_read = 0; if( !(MODE_KEY_PORT_IN &= (1 << MODE_KEY)) ) { // if MODE_KEY is pressed... if(KEYBOARD_PORT_IN &= (1 << PAGE_KEY)) { mode++; if(mode >= 4) mode = 0; frames_per_keyboard_read_target = 10; } // and PAGE_KEY is not, change mode to next one else { // if MODE_KEY and PAGE_KEY are both pressed, set default settings mode = 0; page = 5; tb_ao_frequency = DEFAULT_TB_AO_FREQUENCY; tb_ao_frames_per_upper_part = DEFAULT_TB_AO_FRAMES_PER_UPPER_PART; tb_ao_on_flag = DEFAULT_TB_AO_ON_FLAG; tb_ao_gap = DEFAULT_TB_AO_GAP; tb_ao_position_h = DEFAULT_TB_AO_POSITION_H; tb_ao_position_v = DEFAULT_TB_AO_POSITION_V; tb_ao_size_h = DEFAULT_TB_AO_SIZE_H; tb_ao_size_v = DEFAULT_TB_AO_SIZE_V; tb_di_period = DEFAULT_TB_DI_PERIOD; tb_di_frames_per_upper_part = DEFAULT_TB_DI_FRAMES_PER_UPPER_PART; tb_di_on_flag = DEFAULT_TB_DI_ON_FLAG; tb_di_offset = DEFAULT_TB_DI_OFFSET; tb_di_break = DEFAULT_TB_DI_BREAK; tb_di_position_h = DEFAULT_TB_DI_POSITION_H; tb_di_position_v = DEFAULT_TB_DI_POSITION_V; tb_di_size_h = DEFAULT_TB_DI_SIZE_H; tb_di_size_v = DEFAULT_TB_DI_SIZE_V; eeprom_update_byte((uint8_t*)ADDRESS_TB_AO_FREQUENCY, tb_ao_frequency); eeprom_update_byte((uint8_t*)ADDRESS_TB_AO_FRAMES_PER_UPPER_PART, tb_ao_frames_per_upper_part); eeprom_update_byte((uint8_t*)ADDRESS_TB_AO_ON_FLAG, tb_ao_on_flag); eeprom_update_byte((uint8_t*)ADDRESS_TB_AO_GAP, tb_ao_gap); eeprom_update_byte((uint8_t*)ADDRESS_TB_AO_POSITION_H, tb_ao_position_h); eeprom_update_byte((uint8_t*)ADDRESS_TB_AO_POSITION_V, tb_ao_position_v); eeprom_update_word((uint16_t*)ADDRESS_TB_AO_SIZE_H, tb_ao_size_h); eeprom_update_byte((uint8_t*)ADDRESS_TB_AO_SIZE_V, tb_ao_size_v); eeprom_update_byte((uint8_t*)ADDRESS_TB_DI_PERIOD, tb_di_period); eeprom_update_word((uint16_t*)ADDRESS_TB_DI_FRAMES_PER_UPPER_PART, tb_di_frames_per_upper_part); eeprom_update_byte((uint8_t*)ADDRESS_TB_DI_ON_FLAG, tb_di_on_flag); eeprom_update_byte((uint8_t*)ADDRESS_TB_DI_OFFSET, tb_di_offset); eeprom_update_byte((uint8_t*)ADDRESS_TB_DI_BREAK, tb_di_break); eeprom_update_word((uint16_t*)ADDRESS_TB_DI_POSITION_H, tb_di_position_h); eeprom_update_byte((uint8_t*)ADDRESS_TB_DI_POSITION_V, tb_di_position_v); eeprom_update_word((uint16_t*)ADDRESS_TB_DI_SIZE_H, tb_di_size_h); eeprom_update_byte((uint8_t*)ADDRESS_TB_DI_SIZE_V, tb_di_size_v); sbs_ao_frequency = DEFAULT_SBS_AO_FREQUENCY; sbs_ao_frames_per_left_part = DEFAULT_SBS_AO_FRAMES_PER_LEFT_PART; sbs_ao_on_flag = DEFAULT_SBS_AO_ON_FLAG; sbs_ao_gap = DEFAULT_SBS_AO_GAP; sbs_ao_position_h = DEFAULT_SBS_AO_POSITION_H; sbs_ao_position_v = DEFAULT_SBS_AO_POSITION_V; sbs_ao_right_edge = DEFAULT_SBS_AO_RIGHT_EDGE; sbs_ao_size_v = DEFAULT_SBS_AO_SIZE_V; sbs_di_period = DEFAULT_SBS_DI_PERIOD; sbs_di_frames_per_left_part = DEFAULT_SBS_DI_FRAMES_PER_LEFT_PART; sbs_di_on_flag = DEFAULT_SBS_DI_ON_FLAG; sbs_di_offset = DEFAULT_SBS_DI_OFFSET; sbs_di_break = DEFAULT_SBS_DI_BREAK; sbs_di_position_h = DEFAULT_SBS_DI_POSITION_H; sbs_di_position_v = DEFAULT_SBS_DI_POSITION_V; sbs_di_size_h = DEFAULT_SBS_DI_SIZE_H; sbs_di_size_v = DEFAULT_SBS_DI_SIZE_V; eeprom_update_byte((uint8_t*)ADDRESS_SBS_AO_FREQUENCY, sbs_ao_frequency); eeprom_update_byte((uint8_t*)ADDRESS_SBS_AO_FRAMES_PER_LEFT_PART, sbs_ao_frames_per_left_part); eeprom_update_byte((uint8_t*)ADDRESS_SBS_AO_ON_FLAG, sbs_ao_on_flag); eeprom_update_byte((uint8_t*)ADDRESS_SBS_AO_GAP, sbs_ao_gap); eeprom_update_byte((uint8_t*)ADDRESS_SBS_AO_POSITION_H, sbs_ao_position_h); eeprom_update_byte((uint8_t*)ADDRESS_SBS_AO_POSITION_V, sbs_ao_position_v); eeprom_update_byte((uint8_t*)ADDRESS_SBS_AO_RIGHT_EDGE, sbs_ao_right_edge); eeprom_update_word((uint16_t*)ADDRESS_SBS_AO_SIZE_V, sbs_ao_size_v); eeprom_update_byte((uint8_t*)ADDRESS_SBS_DI_PERIOD, sbs_di_period); eeprom_update_word((uint16_t*)ADDRESS_SBS_DI_FRAMES_PER_LEFT_PART, sbs_di_frames_per_left_part); eeprom_update_byte((uint8_t*)ADDRESS_SBS_DI_ON_FLAG, sbs_di_on_flag); eeprom_update_byte((uint8_t*)ADDRESS_SBS_DI_OFFSET, sbs_di_offset); eeprom_update_byte((uint8_t*)ADDRESS_SBS_DI_BREAK, sbs_di_break); eeprom_update_byte((uint8_t*)ADDRESS_SBS_DI_POSITION_H, sbs_di_position_h); eeprom_update_word((uint16_t*)ADDRESS_SBS_DI_POSITION_V, sbs_di_position_v); eeprom_update_byte((uint8_t*)ADDRESS_SBS_DI_SIZE_H, sbs_di_size_h); eeprom_update_word((uint16_t*)ADDRESS_SBS_DI_SIZE_V, sbs_di_size_v); ffr_fr_position = DEFAULT_FFR_FR_POSITION; ffr_fr_period = DEFAULT_FFR_FR_PERIOD; ffr_fr_frames_per_visible_part = DEFAULT_FFR_FR_FRAMES_PER_VISIBLE_PART; ffr_fr_on_flag = DEFAULT_FFR_FR_ON_FLAG; ffr_fr_position_h = DEFAULT_FFR_FR_POSITION_H; ffr_fr_position_v = DEFAULT_FFR_FR_POSITION_V; ffr_fr_size_h = DEFAULT_FFR_FR_SIZE_H; ffr_fr_size_v = DEFAULT_FFR_FR_SIZE_V; ffr_sr_position = DEFAULT_FFR_SR_POSITION; ffr_sr_period = DEFAULT_FFR_SR_PERIOD; ffr_sr_frames_per_visible_part = DEFAULT_FFR_SR_FRAMES_PER_VISIBLE_PART; ffr_sr_on_flag = DEFAULT_FFR_SR_ON_FLAG; ffr_sr_position_h = DEFAULT_FFR_SR_POSITION_H; ffr_sr_position_v = DEFAULT_FFR_SR_POSITION_V; ffr_sr_size_h = DEFAULT_FFR_SR_SIZE_H; ffr_sr_size_v = DEFAULT_FFR_SR_SIZE_V; eeprom_update_byte((uint8_t*)ADDRESS_FFR_FR_POSITION, ffr_fr_position); eeprom_update_byte((uint8_t*)ADDRESS_FFR_FR_PERIOD, ffr_fr_period); eeprom_update_word((uint16_t*)ADDRESS_FFR_FR_FRAMES_PER_VISIBLE_PART, ffr_fr_frames_per_visible_part); eeprom_update_byte((uint8_t*)ADDRESS_FFR_FR_ON_FLAG, ffr_fr_on_flag); eeprom_update_word((uint16_t*)ADDRESS_FFR_FR_POSITION_H, ffr_fr_position_h); eeprom_update_word((uint16_t*)ADDRESS_FFR_FR_POSITION_V, ffr_fr_position_v); eeprom_update_word((uint16_t*)ADDRESS_FFR_FR_SIZE_H, ffr_fr_size_h); eeprom_update_word((uint16_t*)ADDRESS_FFR_FR_SIZE_V, ffr_fr_size_v); eeprom_update_byte((uint8_t*)ADDRESS_FFR_SR_POSITION, ffr_sr_position); eeprom_update_byte((uint8_t*)ADDRESS_FFR_SR_PERIOD, ffr_sr_period); eeprom_update_word((uint16_t*)ADDRESS_FFR_SR_FRAMES_PER_VISIBLE_PART, ffr_sr_frames_per_visible_part); eeprom_update_byte((uint8_t*)ADDRESS_FFR_SR_ON_FLAG, ffr_sr_on_flag); eeprom_update_word((uint16_t*)ADDRESS_FFR_SR_POSITION_H, ffr_sr_position_h); eeprom_update_word((uint16_t*)ADDRESS_FFR_SR_POSITION_V, ffr_sr_position_v); eeprom_update_word((uint16_t*)ADDRESS_FFR_SR_SIZE_H, ffr_sr_size_h); eeprom_update_word((uint16_t*)ADDRESS_FFR_SR_SIZE_V, ffr_sr_size_v); frames_per_keyboard_read_target = 20; } } if( !(KEYBOARD_PORT_IN &= (1 << PAGE_KEY)) ) { // if PAGE_KEY is pressed... if(KEYBOARD_PORT_IN &= (1 << SHIFT_KEY)) { page++; if(page >= 6) page = 0; } // and SHIFT_KEY is not, change page to next one else { page--; if(page > 240) page = 5; } // if PAGE_KEY and SHIFT_KEY are both pressed, change page to previous one frames_per_keyboard_read_target = 10; // 10 frames till next keyboard read } /* Store information about other keys in keyboard_state */ if( !(KEYBOARD_PORT_IN &= (1 << SHIFT_KEY)) ) keyboard_state |= (1 << 4); else keyboard_state &= ~(1 << 4); if( !(KEYBOARD_PORT_IN &= (1 << LEFT_KEY)) ) keyboard_state |= (1 << 3); else keyboard_state &= ~(1 << 3); if( !(KEYBOARD_PORT_IN &= (1 << UP_KEY)) ) keyboard_state |= (1 << 2); else keyboard_state &= ~(1 << 2); if( !(KEYBOARD_PORT_IN &= (1 << DOWN_KEY)) ) keyboard_state |= (1 << 1); else keyboard_state &= ~(1 << 1); if( !(KEYBOARD_PORT_IN &= (1 << RIGHT_KEY)) ) keyboard_state |= (1 << 0); else keyboard_state &= ~(1 << 0); switch(page) { /* Alternating Occlusions Settings */ case 0: switch(keyboard_state) { /* Without the SHIFT_KEY pressed. */ case 0x01: if(tb_ao_frequency==0) tb_ao_frames_per_upper_part = tb_ao_frames_per_upper_part + 2; else tb_ao_frames_per_upper_part++; if(tb_ao_frames_per_upper_part > tb_ao_frames_target) tb_ao_frames_per_upper_part = tb_ao_frames_target; frames_per_keyboard_read_target = 10; break; case 0x02: tb_ao_frequency--; if(tb_ao_frequency > 240) tb_ao_frequency = 0; tb_ao_frequency_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x04: tb_ao_frequency++; if(tb_ao_frequency > MAX_TB_AO_FREQUENCY) tb_ao_frequency = MAX_TB_AO_FREQUENCY; tb_ao_frequency_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x08: if(tb_ao_frequency==0) tb_ao_frames_per_upper_part = tb_ao_frames_per_upper_part - 2; else tb_ao_frames_per_upper_part--; if(tb_ao_frames_per_upper_part > 240) tb_ao_frames_per_upper_part = 0; frames_per_keyboard_read_target = 10; break; /* With the SHIFT_KEY pressed. */ case 0x11: tb_ao_on_flag ^= 0x01; frames_per_keyboard_read_target = 10; break; case 0x12: tb_ao_gap--; if(tb_ao_gap > 240) tb_ao_gap = 0; frames_per_keyboard_read_target = 10; break; case 0x14: tb_ao_gap++; if(tb_ao_gap > MAX_TB_AO_GAP) tb_ao_gap = MAX_TB_AO_GAP; frames_per_keyboard_read_target = 10; break; case 0x18: tb_ao_on_flag ^= 0x01; frames_per_keyboard_read_target = 10; break; /* Restoring default settings by pressing 2, 4 or 5 buttons at the same time. */ case 0x09: tb_ao_frequency_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x06: tb_ao_frequency = DEFAULT_TB_AO_FREQUENCY; tb_ao_frequency_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x19: tb_ao_on_flag = DEFAULT_TB_AO_ON_FLAG; frames_per_keyboard_read_target = 10; break; case 0x16: tb_ao_gap = DEFAULT_TB_AO_GAP; frames_per_keyboard_read_target = 10; break; case 0x0f: tb_ao_frames_per_upper_part = DEFAULT_TB_AO_FRAMES_PER_UPPER_PART; tb_ao_frequency = DEFAULT_TB_AO_FREQUENCY; tb_ao_on_flag = DEFAULT_TB_AO_ON_FLAG; tb_ao_gap = DEFAULT_TB_AO_GAP; tb_ao_frequency_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x1f: tb_ao_frames_per_upper_part = DEFAULT_TB_AO_FRAMES_PER_UPPER_PART; tb_ao_frequency = DEFAULT_TB_AO_FREQUENCY; tb_ao_on_flag = DEFAULT_TB_AO_ON_FLAG; tb_ao_gap = DEFAULT_TB_AO_GAP; tb_ao_frequency_change_flag = 1; tb_ao_position_h = DEFAULT_TB_AO_POSITION_H; tb_ao_position_v = DEFAULT_TB_AO_POSITION_V; tb_ao_size_h = DEFAULT_TB_AO_SIZE_H; tb_ao_size_v = DEFAULT_TB_AO_SIZE_V; tb_di_frames_per_upper_part = DEFAULT_TB_DI_FRAMES_PER_UPPER_PART; tb_di_period = DEFAULT_TB_DI_PERIOD; tb_di_offset = DEFAULT_TB_DI_OFFSET; tb_di_on_flag = DEFAULT_TB_DI_ON_FLAG; tb_di_break = DEFAULT_TB_DI_BREAK; tb_di_period_change_flag = 1; tb_di_position_h = DEFAULT_TB_DI_POSITION_H; tb_di_position_v = DEFAULT_TB_DI_POSITION_V; tb_di_size_h = DEFAULT_TB_DI_SIZE_H; tb_di_size_v = DEFAULT_TB_DI_SIZE_V; page = 0; frames_per_keyboard_read_target = 20; break; } break; /* Alternating Occlusions Position */ case 1: switch(keyboard_state) { /* Without the SHIFT_KEY pressed. */ case 0x01: tb_ao_position_h++; if(tb_ao_position_h > MAX_TB_AO_POSITION_H) tb_ao_position_h = MAX_TB_AO_POSITION_H; frames_per_keyboard_read_target = 10; break; case 0x02: tb_ao_position_v++; if(tb_ao_position_v > MAX_TB_AO_POSITION_V) tb_ao_position_v = MAX_TB_AO_POSITION_V; frames_per_keyboard_read_target = 10; break; case 0x04: tb_ao_position_v--; if(tb_ao_position_v > 240) tb_ao_position_v = 0; frames_per_keyboard_read_target = 10; break; case 0x08: tb_ao_position_h--; if(tb_ao_position_h < MIN_TB_AO_POSITION_H) tb_ao_position_h = MIN_TB_AO_POSITION_H; frames_per_keyboard_read_target = 10; break; /* With the SHIFT_KEY pressed. */ case 0x11: tb_ao_position_h = tb_ao_position_h + 10; if(tb_ao_position_h > MAX_TB_AO_POSITION_H) tb_ao_position_h = MAX_TB_AO_POSITION_H; frames_per_keyboard_read_target = 10; break; case 0x12: tb_ao_position_v = tb_ao_position_v + 5; if(tb_ao_position_v > MAX_TB_AO_POSITION_V) tb_ao_position_v = MAX_TB_AO_POSITION_V; frames_per_keyboard_read_target = 10; break; case 0x14: tb_ao_position_v = tb_ao_position_v - 5; if(tb_ao_position_v > 240) tb_ao_position_v = 0; frames_per_keyboard_read_target = 10; break; case 0x18: tb_ao_position_h = tb_ao_position_h - 10; if( (tb_ao_position_h < MIN_TB_AO_POSITION_H) || (tb_ao_position_h > 240) ) tb_ao_position_h = MIN_TB_AO_POSITION_H; frames_per_keyboard_read_target = 10; break; /* Restoring default settings by pressing 2, 4 or 5 buttons at the same time. */ case 0x09: tb_ao_position_h = DEFAULT_TB_AO_POSITION_H; frames_per_keyboard_read_target = 10; break; case 0x06: tb_ao_position_v = DEFAULT_TB_AO_POSITION_V; frames_per_keyboard_read_target = 10; break; case 0x19: tb_ao_position_h = DEFAULT_TB_AO_POSITION_H; frames_per_keyboard_read_target = 10; break; case 0x16: tb_ao_position_v = DEFAULT_TB_AO_POSITION_V; frames_per_keyboard_read_target = 10; break; case 0x0f: tb_ao_position_h = DEFAULT_TB_AO_POSITION_H; tb_ao_position_v = DEFAULT_TB_AO_POSITION_V; frames_per_keyboard_read_target = 10; break; case 0x1f: tb_ao_frames_per_upper_part = DEFAULT_TB_AO_FRAMES_PER_UPPER_PART; tb_ao_frequency = DEFAULT_TB_AO_FREQUENCY; tb_ao_on_flag = DEFAULT_TB_AO_ON_FLAG; tb_ao_gap = DEFAULT_TB_AO_GAP; tb_ao_frequency_change_flag = 1; tb_ao_position_h = DEFAULT_TB_AO_POSITION_H; tb_ao_position_v = DEFAULT_TB_AO_POSITION_V; tb_ao_size_h = DEFAULT_TB_AO_SIZE_H; tb_ao_size_v = DEFAULT_TB_AO_SIZE_V; tb_di_frames_per_upper_part = DEFAULT_TB_DI_FRAMES_PER_UPPER_PART; tb_di_period = DEFAULT_TB_DI_PERIOD; tb_di_offset = DEFAULT_TB_DI_OFFSET; tb_di_on_flag = DEFAULT_TB_DI_ON_FLAG; tb_di_break = DEFAULT_TB_DI_BREAK; tb_di_period_change_flag = 1; tb_di_position_h = DEFAULT_TB_DI_POSITION_H; tb_di_position_v = DEFAULT_TB_DI_POSITION_V; tb_di_size_h = DEFAULT_TB_DI_SIZE_H; tb_di_size_v = DEFAULT_TB_DI_SIZE_V; page = 0; frames_per_keyboard_read_target = 20; break; } break; /* Alternating Occlusions Size */ case 2: switch(keyboard_state) { /* Without the SHIFT_KEY pressed. */ case 0x01: tb_ao_size_h++; if(tb_ao_size_h > MAX_TB_AO_SIZE_H) tb_ao_size_h = MAX_TB_AO_SIZE_H; frames_per_keyboard_read_target = 10; break; case 0x02: tb_ao_size_v++; if(tb_ao_size_v > MAX_TB_AO_SIZE_V) tb_ao_size_v = MAX_TB_AO_SIZE_V; frames_per_keyboard_read_target = 10; break; case 0x04: tb_ao_size_v--; if(tb_ao_size_v < MIN_TB_AO_SIZE_V) tb_ao_size_v = MIN_TB_AO_SIZE_V; frames_per_keyboard_read_target = 10; if(tb_ao_size_v < (tb_di_position_v+tb_di_size_v) ) { tb_di_size_v--; if(tb_di_size_v < MIN_TB_DI_SIZE_V) { tb_di_size_v = MIN_TB_DI_SIZE_V; tb_di_position_v--; } } break; case 0x08: tb_ao_size_h--; if(tb_ao_size_h < MIN_TB_AO_SIZE_H) tb_ao_size_h = MIN_TB_AO_SIZE_H; frames_per_keyboard_read_target = 10; break; /* With the SHIFT_KEY pressed. */ case 0x11: tb_ao_size_h = tb_ao_size_h + 10; if(tb_ao_size_h > MAX_TB_AO_SIZE_H) tb_ao_size_h = MAX_TB_AO_SIZE_H; frames_per_keyboard_read_target = 10; break; case 0x12: tb_ao_size_v = tb_ao_size_v + 5; if(tb_ao_size_v > MAX_TB_AO_SIZE_V) tb_ao_size_v = MAX_TB_AO_SIZE_V; frames_per_keyboard_read_target = 10; break; case 0x14: tb_ao_size_v = tb_ao_size_v - 5; if(tb_ao_size_v < MIN_TB_AO_SIZE_V) tb_ao_size_v = MIN_TB_AO_SIZE_V; frames_per_keyboard_read_target = 10; if(tb_ao_size_v < (tb_di_position_v+tb_di_size_v) ) { tb_di_size_v=tb_di_size_v-5; if(tb_di_size_v < MIN_TB_DI_SIZE_V) { tb_di_size_v = MIN_TB_DI_SIZE_V; tb_di_position_v=tb_di_position_v-5; } } break; case 0x18: tb_ao_size_h = tb_ao_size_h - 10; if(tb_ao_size_h < MIN_TB_AO_SIZE_H) tb_ao_size_h = MIN_TB_AO_SIZE_H; frames_per_keyboard_read_target = 10; break; /* Restoring default settings by pressing 2, 4 or 5 buttons at the same time. */ case 0x09: tb_ao_size_h = DEFAULT_TB_AO_SIZE_H; frames_per_keyboard_read_target = 10; break; case 0x06: tb_ao_size_v = DEFAULT_TB_AO_SIZE_V; frames_per_keyboard_read_target = 10; break; case 0x19: tb_ao_size_h = DEFAULT_TB_AO_SIZE_H; frames_per_keyboard_read_target = 10; break; case 0x16: tb_ao_size_v = DEFAULT_TB_AO_SIZE_V; frames_per_keyboard_read_target = 10; break; case 0x0f: tb_ao_size_h = DEFAULT_TB_AO_SIZE_H; tb_ao_size_v = DEFAULT_TB_AO_SIZE_V; frames_per_keyboard_read_target = 10; break; case 0x1f: tb_ao_frames_per_upper_part = DEFAULT_TB_AO_FRAMES_PER_UPPER_PART; tb_ao_frequency = DEFAULT_TB_AO_FREQUENCY; tb_ao_on_flag = DEFAULT_TB_AO_ON_FLAG; tb_ao_gap = DEFAULT_TB_AO_GAP; tb_ao_frequency_change_flag = 1; tb_ao_position_h = DEFAULT_TB_AO_POSITION_H; tb_ao_position_v = DEFAULT_TB_AO_POSITION_V; tb_ao_size_h = DEFAULT_TB_AO_SIZE_H; tb_ao_size_v = DEFAULT_TB_AO_SIZE_V; tb_di_frames_per_upper_part = DEFAULT_TB_DI_FRAMES_PER_UPPER_PART; tb_di_period = DEFAULT_TB_DI_PERIOD; tb_di_offset = DEFAULT_TB_DI_OFFSET; tb_di_on_flag = DEFAULT_TB_DI_ON_FLAG; tb_di_break = DEFAULT_TB_DI_BREAK; tb_di_period_change_flag = 1; tb_di_position_h = DEFAULT_TB_DI_POSITION_H; tb_di_position_v = DEFAULT_TB_DI_POSITION_V; tb_di_size_h = DEFAULT_TB_DI_SIZE_H; tb_di_size_v = DEFAULT_TB_DI_SIZE_V; page = 0; frames_per_keyboard_read_target = 20; break; } break; /* Dichoptic Settings */ case 3: switch(keyboard_state) { /* Without the SHIFT_KEY pressed. */ case 0x01: if(tb_di_period==0) tb_di_frames_per_upper_part = tb_di_frames_per_upper_part + 40; else if(tb_di_period==5) tb_di_frames_per_upper_part = tb_di_frames_per_upper_part + 10; else tb_di_frames_per_upper_part = tb_di_frames_per_upper_part + 20; if(tb_di_frames_per_upper_part > tb_di_frames_target) tb_di_frames_per_upper_part = tb_di_frames_target; frames_per_keyboard_read_target = 10; break; case 0x02: tb_di_period--; if(tb_di_period > 240) tb_di_period = 0; tb_di_period_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x04: tb_di_period++; if(tb_di_period > MAX_TB_DI_PERIOD) tb_di_period = MAX_TB_DI_PERIOD; tb_di_period_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x08: if(tb_di_period==0) tb_di_frames_per_upper_part = tb_di_frames_per_upper_part - 40; else if(tb_di_period==5) tb_di_frames_per_upper_part = tb_di_frames_per_upper_part - 10; else tb_di_frames_per_upper_part = tb_di_frames_per_upper_part - 20; if(tb_di_frames_per_upper_part > 65000) tb_di_frames_per_upper_part = 0; frames_per_keyboard_read_target = 10; break; /* With the SHIFT_KEY pressed. */ case 0x11: tb_di_offset++; if(tb_di_offset > MAX_TB_DI_OFFSET) tb_di_offset = MAX_TB_DI_OFFSET; frames_per_keyboard_read_target = 10; break; case 0x12: if(tb_di_period==0) { tb_di_break = tb_di_break + 40; if(tb_di_break > 160) tb_di_break = 0; break; } else { tb_di_break = tb_di_break + 20; if(tb_di_break > 80) tb_di_break = 0; break; } frames_per_keyboard_read_target = 10; case 0x14: tb_di_on_flag ^= 0x01; frames_per_keyboard_read_target = 10; break; case 0x18: tb_di_offset--; if(tb_di_offset < MIN_TB_DI_OFFSET) tb_di_offset = MIN_TB_DI_OFFSET; frames_per_keyboard_read_target = 10; break; /* Restoring default settings by pressing 2, 4 or 5 buttons at the same time. */ case 0x09: tb_di_period_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x06: tb_di_period = DEFAULT_TB_DI_PERIOD; tb_di_period_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x19: tb_di_offset = DEFAULT_TB_DI_OFFSET; frames_per_keyboard_read_target = 10; break; case 0x16: tb_di_on_flag = DEFAULT_TB_DI_ON_FLAG; tb_di_break = DEFAULT_TB_DI_BREAK; frames_per_keyboard_read_target = 10; break; case 0x0f: tb_di_frames_per_upper_part = DEFAULT_TB_DI_FRAMES_PER_UPPER_PART; tb_di_period = DEFAULT_TB_DI_PERIOD; tb_di_offset = DEFAULT_TB_DI_OFFSET; tb_di_on_flag = DEFAULT_TB_DI_ON_FLAG; tb_di_break = DEFAULT_TB_DI_BREAK; tb_di_period_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x1f: tb_ao_frames_per_upper_part = DEFAULT_TB_AO_FRAMES_PER_UPPER_PART; tb_ao_frequency = DEFAULT_TB_AO_FREQUENCY; tb_ao_on_flag = DEFAULT_TB_AO_ON_FLAG; tb_ao_gap = DEFAULT_TB_AO_GAP; tb_ao_frequency_change_flag = 1; tb_ao_position_h = DEFAULT_TB_AO_POSITION_H; tb_ao_position_v = DEFAULT_TB_AO_POSITION_V; tb_ao_size_h = DEFAULT_TB_AO_SIZE_H; tb_ao_size_v = DEFAULT_TB_AO_SIZE_V; tb_di_frames_per_upper_part = DEFAULT_TB_DI_FRAMES_PER_UPPER_PART; tb_di_period = DEFAULT_TB_DI_PERIOD; tb_di_offset = DEFAULT_TB_DI_OFFSET; tb_di_on_flag = DEFAULT_TB_DI_ON_FLAG; tb_di_break = DEFAULT_TB_DI_BREAK; tb_di_period_change_flag = 1; tb_di_position_h = DEFAULT_TB_DI_POSITION_H; tb_di_position_v = DEFAULT_TB_DI_POSITION_V; tb_di_size_h = DEFAULT_TB_DI_SIZE_H; tb_di_size_v = DEFAULT_TB_DI_SIZE_V; page = 0; frames_per_keyboard_read_target = 20; break; } break; /* Dichoptic Position */ case 4: switch(keyboard_state) { /* Without the SHIFT_KEY pressed. */ case 0x01: tb_di_position_h++; if( (tb_di_position_h + tb_di_size_h) > tb_ao_size_h ) tb_di_position_h--; frames_per_keyboard_read_target = 10; break; case 0x02: tb_di_position_v++; if( (tb_di_position_v + tb_di_size_v) > tb_ao_size_v_minus_gap ) tb_di_position_v--; frames_per_keyboard_read_target = 10; break; case 0x04: tb_di_position_v--; if(tb_di_position_v > 240) tb_di_position_v = 0; frames_per_keyboard_read_target = 10; break; case 0x08: tb_di_position_h--; if(tb_di_position_h > 65000) tb_di_position_h = MIN_TB_DI_POSITION_H; frames_per_keyboard_read_target = 10; break; /* With the SHIFT_KEY pressed. */ case 0x11: tb_di_position_h = tb_di_position_h + 10; if( (tb_di_position_h + tb_di_size_h) > tb_ao_size_h ) tb_di_position_h = tb_ao_size_h - tb_di_size_h; frames_per_keyboard_read_target = 10; break; case 0x12: tb_di_position_v = tb_di_position_v + 5; if( (tb_di_position_v + tb_di_size_v) > tb_ao_size_v_minus_gap ) tb_di_position_v = tb_ao_size_v_minus_gap - tb_di_size_v; frames_per_keyboard_read_target = 10; break; case 0x14: tb_di_position_v = tb_di_position_v - 5; if(tb_di_position_v > 240) tb_di_position_v = 0; frames_per_keyboard_read_target = 10; break; case 0x18: tb_di_position_h = tb_di_position_h - 10; if(tb_di_position_h > 65000) tb_di_position_h = MIN_TB_DI_POSITION_H; frames_per_keyboard_read_target = 10; break; /* Restoring default settings by pressing 2, 4 or 5 buttons at the same time. */ case 0x09: tb_di_position_h = DEFAULT_TB_DI_POSITION_H; frames_per_keyboard_read_target = 10; break; case 0x06: tb_di_position_v = DEFAULT_TB_DI_POSITION_V; frames_per_keyboard_read_target = 10; break; case 0x19: tb_di_position_h = DEFAULT_TB_DI_POSITION_H; frames_per_keyboard_read_target = 10; break; case 0x16: tb_di_position_v = DEFAULT_TB_DI_POSITION_V; frames_per_keyboard_read_target = 10; break; case 0x0f: tb_di_position_h = DEFAULT_TB_DI_POSITION_H; tb_di_position_v = DEFAULT_TB_DI_POSITION_V; frames_per_keyboard_read_target = 10; break; case 0x1f: tb_ao_frames_per_upper_part = DEFAULT_TB_AO_FRAMES_PER_UPPER_PART; tb_ao_frequency = DEFAULT_TB_AO_FREQUENCY; tb_ao_on_flag = DEFAULT_TB_AO_ON_FLAG; tb_ao_gap = DEFAULT_TB_AO_GAP; tb_ao_frequency_change_flag = 1; tb_ao_position_h = DEFAULT_TB_AO_POSITION_H; tb_ao_position_v = DEFAULT_TB_AO_POSITION_V; tb_ao_size_h = DEFAULT_TB_AO_SIZE_H; tb_ao_size_v = DEFAULT_TB_AO_SIZE_V; tb_di_frames_per_upper_part = DEFAULT_TB_DI_FRAMES_PER_UPPER_PART; tb_di_period = DEFAULT_TB_DI_PERIOD; tb_di_offset = DEFAULT_TB_DI_OFFSET; tb_di_on_flag = DEFAULT_TB_DI_ON_FLAG; tb_di_break = DEFAULT_TB_DI_BREAK; tb_di_period_change_flag = 1; tb_di_position_h = DEFAULT_TB_DI_POSITION_H; tb_di_position_v = DEFAULT_TB_DI_POSITION_V; tb_di_size_h = DEFAULT_TB_DI_SIZE_H; tb_di_size_v = DEFAULT_TB_DI_SIZE_V; page = 0; frames_per_keyboard_read_target = 20; break; } break; /* Dichoptic Size */ case 5: switch(keyboard_state) { /* Without the SHIFT_KEY pressed. */ case 0x01: tb_di_size_h++; if( (tb_di_position_h + tb_di_size_h) > tb_ao_size_h ) tb_di_size_h--; frames_per_keyboard_read_target = 10; break; case 0x02: tb_di_size_v++; if( (tb_di_position_v + tb_di_size_v) > tb_ao_size_v_minus_gap ) tb_di_size_v--; frames_per_keyboard_read_target = 10; break; case 0x04: tb_di_size_v--; if(tb_di_size_v < MIN_TB_DI_SIZE_V) tb_di_size_v = MIN_TB_DI_SIZE_V; frames_per_keyboard_read_target = 10; break; case 0x08: tb_di_size_h--; if(tb_di_size_h < MIN_TB_DI_SIZE_H) tb_di_size_h = MIN_TB_DI_SIZE_H; frames_per_keyboard_read_target = 10; break; /* With the SHIFT_KEY pressed. */ case 0x11: tb_di_size_h = tb_di_size_h + 10; if( (tb_di_position_h + tb_di_size_h) > tb_ao_size_h ) tb_di_size_h = tb_ao_size_h - tb_di_position_h; frames_per_keyboard_read_target = 10; break; case 0x12: tb_di_size_v = tb_di_size_v + 5; if( (tb_di_position_v + tb_di_size_v) > tb_ao_size_v_minus_gap ) tb_di_size_v = tb_ao_size_v_minus_gap - tb_di_position_v; frames_per_keyboard_read_target = 10; break; case 0x14: tb_di_size_v = tb_di_size_v - 5; if(tb_di_size_v < MIN_TB_DI_SIZE_V) tb_di_size_v = MIN_TB_DI_SIZE_V; frames_per_keyboard_read_target = 10; break; case 0x18: tb_di_size_h = tb_di_size_h - 10; if( (tb_di_size_h < MIN_TB_DI_SIZE_H) || (tb_di_size_h > 65000) ) tb_di_size_h = MIN_TB_DI_SIZE_H; frames_per_keyboard_read_target = 10; break; /* Restoring default settings by pressing 2, 4 or 5 buttons at the same time. */ case 0x09: tb_di_size_h = DEFAULT_TB_DI_SIZE_H; frames_per_keyboard_read_target = 10; break; case 0x06: tb_di_size_v = DEFAULT_TB_DI_SIZE_V; frames_per_keyboard_read_target = 10; break; case 0x19: tb_di_size_h = DEFAULT_TB_DI_SIZE_H; frames_per_keyboard_read_target = 10; break; case 0x16: tb_di_size_v = DEFAULT_TB_DI_SIZE_V; frames_per_keyboard_read_target = 10; break; case 0x0f: tb_di_size_h = DEFAULT_TB_DI_SIZE_H; tb_di_size_v = DEFAULT_TB_DI_SIZE_V; frames_per_keyboard_read_target = 10; break; case 0x1f: tb_ao_frames_per_upper_part = DEFAULT_TB_AO_FRAMES_PER_UPPER_PART; tb_ao_frequency = DEFAULT_TB_AO_FREQUENCY; tb_ao_on_flag = DEFAULT_TB_AO_ON_FLAG; tb_ao_gap = DEFAULT_TB_AO_GAP; tb_ao_frequency_change_flag = 1; tb_ao_position_h = DEFAULT_TB_AO_POSITION_H; tb_ao_position_v = DEFAULT_TB_AO_POSITION_V; tb_ao_size_h = DEFAULT_TB_AO_SIZE_H; tb_ao_size_v = DEFAULT_TB_AO_SIZE_V; tb_di_frames_per_upper_part = DEFAULT_TB_DI_FRAMES_PER_UPPER_PART; tb_di_period = DEFAULT_TB_DI_PERIOD; tb_di_offset = DEFAULT_TB_DI_OFFSET; tb_di_on_flag = DEFAULT_TB_DI_ON_FLAG; tb_di_break = DEFAULT_TB_DI_BREAK; tb_di_period_change_flag = 1; tb_di_position_h = DEFAULT_TB_DI_POSITION_H; tb_di_position_v = DEFAULT_TB_DI_POSITION_V; tb_di_size_h = DEFAULT_TB_DI_SIZE_H; tb_di_size_v = DEFAULT_TB_DI_SIZE_V; page = 0; frames_per_keyboard_read_target = 20; break; } break; } /* Make sure that dihoptic rectangle stays inside alternately occluding rectangle, horizontally. */ if( (tb_di_position_h + tb_di_size_h) > tb_ao_size_h ) { tb_di_size_h = tb_ao_size_h - tb_di_position_h; if( (tb_di_size_h > 65000) || (tb_di_size_h < MIN_TB_DI_SIZE_H) ) { tb_di_size_h = MIN_TB_DI_SIZE_H; if( (tb_di_position_h + tb_di_size_h) > tb_ao_size_h ) tb_di_position_h = tb_ao_size_h - MIN_TB_DI_SIZE_H; } } /* Make sure that maximum number of lines is not exceeded. */ if( (tb_ao_position_v + 2*tb_ao_size_v) > 2*MAX_TB_AO_SIZE_V ) tb_ao_size_v = (2*MAX_TB_AO_SIZE_V - tb_ao_position_v)/2; tb_ao_size_v_minus_gap = tb_ao_size_v - tb_ao_gap; tb_ao_size_v_plus_gap = tb_ao_size_v + tb_ao_gap; /* Make sure that dihoptic rectangle stays inside alternately occluding rectangle, vertically. */ if( (tb_di_position_v + tb_di_size_v) > tb_ao_size_v_minus_gap ) { temp_tb_di_size_v = tb_ao_size_v_minus_gap - tb_di_position_v; tb_di_size_v = temp_tb_di_size_v; if(temp_tb_di_size_v < MIN_TB_DI_SIZE_V) { tb_di_size_v = MIN_TB_DI_SIZE_V; if( (tb_di_position_v + tb_di_size_v) > tb_ao_size_v_minus_gap ) tb_di_position_v = tb_ao_size_v_minus_gap - MIN_TB_DI_SIZE_V; } } /* Set total number of frames in a cycle according to tb_ao_frequency. */ switch(tb_ao_frequency) { case 0: tb_ao_frames_target=24; break; // 2.5 Hz case 1: tb_ao_frames_target=12; break; // 5 Hz case 2: tb_ao_frames_target=8; break; // 7.5 Hz case 3: tb_ao_frames_target=6; break; // 10 Hz case 4: tb_ao_frames_target=5; break; // 12 Hz case 5: tb_ao_frames_target=4; break; // 15 Hz } if(tb_ao_frequency_change_flag==1) { // if change of tb_ao_frequency occurred, set default number of frames during with alternately occluding rectangle occupies upper part of the picture switch(tb_ao_frequency) { case 0: tb_ao_frames_per_upper_part=12; break; case 1: tb_ao_frames_per_upper_part=6; break; case 2: tb_ao_frames_per_upper_part=4; break; case 3: tb_ao_frames_per_upper_part=3; break; case 4: tb_ao_frames_per_upper_part=3; break; case 5: tb_ao_frames_per_upper_part=2; break; } tb_ao_frequency_change_flag = 0; } /* Set total number of frames in a cycle according to tb_di_period. */ switch(tb_di_period) { case 0: tb_di_frames_target=480; break; // 8s case 1: tb_di_frames_target=280; break; // 4.67s case 2: tb_di_frames_target=200; break; // 3.33s case 3: tb_di_frames_target=120; break; // 2s case 4: tb_di_frames_target=80; break; // 1.33s case 5: tb_di_frames_target=40; break; // 0.67s } if(tb_di_period_change_flag==1) { // if change of tb_di_period occurred, set default number of frames during with dihoptic rectangle occupies upper part of the picture switch(tb_di_period) { case 0: tb_di_frames_per_upper_part=240; break; case 1: tb_di_frames_per_upper_part=140; break; case 2: tb_di_frames_per_upper_part=100; break; case 3: tb_di_frames_per_upper_part=60; break; case 4: tb_di_frames_per_upper_part=40; break; case 5: tb_di_frames_per_upper_part=20; break; } tb_di_period_change_flag = 0; } } frames_per_keyboard_read++; /* --- Timing and Rendering --- */ /* Determine where alternately occluding rectangle should appear. */ tb_ao_frames_count++; if(tb_ao_frames_count >= tb_ao_frames_target) tb_ao_frames_count = 0; if(tb_ao_frames_count < tb_ao_frames_per_upper_part) tb_ao_position = 1; // up else tb_ao_position = 2; // down /* Determine where dihoptic rectangle should appear. */ tb_di_frames_count++; if( tb_di_frames_count >= (tb_di_frames_target + 2*tb_di_break) ) tb_di_frames_count = 0; if(tb_di_frames_count < tb_di_frames_per_upper_part) tb_di_position = 1; // up else if( tb_di_frames_count < (tb_di_frames_per_upper_part + tb_di_break) ) tb_di_position = 0; // not visible during the brake else if(tb_di_frames_count < (tb_di_frames_target + tb_di_break) ) tb_di_position = 2; // down else tb_di_position = 0; /* Calculate where edges of alternately occluding rectangle are. */ tb_ao_right_edge = tb_ao_position_h + tb_ao_size_h; tb_ao_left_edge = tb_ao_position_h; /* Calculate where edges of dihoptic rectangle are. */ if(tb_di_position == 2) tb_di_left_edge = tb_ao_position_h + tb_di_position_h + tb_di_offset; else tb_di_left_edge = tb_ao_position_h + tb_di_position_h; tb_di_right_edge = tb_di_left_edge + tb_di_size_h; /* Make sure that edges of dihoptic rectangle stay inside alternately occluding rectangle (applying tb_di_offset might have move dihoptic rectangle too far). */ if( (tb_di_left_edge65000) ) tb_di_left_edge = tb_ao_position_h; if(tb_di_right_edge>tb_ao_right_edge) tb_di_right_edge = tb_ao_right_edge; /* Calculate number of lines that separate bottom edge of dihoptic rectangle from line that lies exacatly between alternately occluding rectangles. */ tb_di_gap = tb_ao_size_v - ( tb_di_position_v + tb_di_size_v); /* Determine order in with rectangles will be displayed, while taking into account that some rectangles may not be visible or they may be turned off. */ tb_objects = ( tb_di_on_flag << 5 ) | ( tb_ao_on_flag << 4 ) | ( tb_di_position << 2 ) | tb_ao_position; switch(tb_objects) { case 0x01: tb_objects_order = 0x00; break; // EMPTY, EMPTY case 0x02: tb_objects_order = 0x00; break; // EMPTY, EMPTY case 0x05: tb_objects_order = 0x00; break; // EMPTY, EMPTY case 0x06: tb_objects_order = 0x00; break; // EMPTY, EMPTY case 0x09: tb_objects_order = 0x00; break; // EMPTY, EMPTY case 0x0a: tb_objects_order = 0x00; break; // EMPTY, EMPTY case 0x11: tb_objects_order = 0x10; break; // AO, EMPTY case 0x12: tb_objects_order = 0x01; break; // EMPTY, AO case 0x15: tb_objects_order = 0x10; break; // AO, EMPTY case 0x16: tb_objects_order = 0x01; break; // EMPTY, AO case 0x19: tb_objects_order = 0x10; break; // AO, EMPTY case 0x1a: tb_objects_order = 0x01; break; // EMPTY, AO case 0x21: tb_objects_order = 0x00; break; // EMPTY, EMPTY case 0x22: tb_objects_order = 0x00; break; // EMPTY, EMPTY case 0x25: tb_objects_order = 0x20; break; // DI, EMPTY case 0x26: tb_objects_order = 0x20; break; // DI, EMPTY case 0x29: tb_objects_order = 0x02; break; // EMPTY, DI case 0x2a: tb_objects_order = 0x02; break; // EMPTY, DI case 0x31: tb_objects_order = 0x10; break; // AO, EMPTY case 0x32: tb_objects_order = 0x01; break; // EMPTY, AO case 0x35: tb_objects_order = 0x10; break; // AO, EMPTY case 0x36: tb_objects_order = 0x21; break; // DI, AO case 0x39: tb_objects_order = 0x12; break; // AO, DI case 0x3a: tb_objects_order = 0x01; break; // EMPTY, AO } /* Determine every rendered line content (which rectangle it contains). */ switch(tb_objects_order) { case 0x01: for(i = 0; i < tb_ao_position_v; i++) rendered_line[line_count++] = 0; for(i = 0; i < tb_ao_size_v_plus_gap; i++) rendered_line[line_count++] = 0; for(i = 0; i < tb_ao_size_v_minus_gap; i++) rendered_line[line_count++] = 1; break; case 0x02: for(i = 0; i < tb_ao_position_v; i++) rendered_line[line_count++] = 0; for(i = 0; i < tb_ao_size_v; i++) rendered_line[line_count++] = 0; for(i = 0; i < tb_ao_gap; i++) rendered_line[line_count++] = 0; for(i = 0; i < tb_di_position_v; i++) rendered_line[line_count++] = 0; for(i = 0; i < tb_di_size_v; i++) rendered_line[line_count++] = 2; break; case 0x10: for(i = 0; i < tb_ao_position_v; i++) rendered_line[line_count++] = 0; for(i = 0; i < tb_ao_size_v_minus_gap; i++) rendered_line[line_count++] = 1; for(i = 0; i < tb_ao_size_v_plus_gap; i++) rendered_line[line_count++] = 0; break; case 0x12: for(i = 0; i < tb_ao_position_v; i++) rendered_line[line_count++] = 0; for(i = 0; i < tb_ao_size_v_minus_gap; i++) rendered_line[line_count++] = 1; for(i = 0; i < tb_ao_gap; i++) rendered_line[line_count++] = 0; for(i = 0; i < tb_ao_gap; i++) rendered_line[line_count++] = 0; for(i = 0; i < tb_di_position_v; i++) rendered_line[line_count++] = 0; for(i = 0; i < tb_di_size_v; i++) rendered_line[line_count++] = 2; break; case 0x20: for(i = 0; i < tb_ao_position_v; i++) rendered_line[line_count++] = 0; for(i = 0; i < tb_di_position_v; i++) rendered_line[line_count++] = 0; for(i = 0; i < tb_di_size_v; i++) rendered_line[line_count++] = 2; break; case 0x21: for(i = 0; i < tb_ao_position_v; i++) rendered_line[line_count++] = 0; for(i = 0; i < tb_di_position_v; i++) rendered_line[line_count++] = 0; for(i = 0; i < tb_di_size_v; i++) rendered_line[line_count++] = 2; for(i = 0; i < tb_di_gap; i++) rendered_line[line_count++] = 0; for(i = 0; i < tb_ao_gap; i++) rendered_line[line_count++] = 0; for(i = 0; i < tb_ao_size_v_minus_gap; i++) rendered_line[line_count++] = 1; break; } break; /* --- SIDE BY SIDE --- */ case 2: /* Read keyboard. */ if(frames_per_keyboard_read == frames_per_keyboard_read_target) { // read keyboard every frames_per_keyboard_read_target frames_per_keyboard_read_target = 5; // by default every 5 frames (changes when button is pressed) frames_per_keyboard_read = 0; if( !(MODE_KEY_PORT_IN &= (1 << MODE_KEY)) ) { // if MODE_KEY is pressed... if(KEYBOARD_PORT_IN &= (1 << PAGE_KEY)) { mode++; if(mode >= 4) mode = 0; frames_per_keyboard_read_target = 10; } // and PAGE_KEY is not, change mode to next one else { // if MODE_KEY and PAGE_KEY are both pressed, set default settings mode = 0; page = 5; tb_ao_frequency = DEFAULT_TB_AO_FREQUENCY; tb_ao_frames_per_upper_part = DEFAULT_TB_AO_FRAMES_PER_UPPER_PART; tb_ao_on_flag = DEFAULT_TB_AO_ON_FLAG; tb_ao_gap = DEFAULT_TB_AO_GAP; tb_ao_position_h = DEFAULT_TB_AO_POSITION_H; tb_ao_position_v = DEFAULT_TB_AO_POSITION_V; tb_ao_size_h = DEFAULT_TB_AO_SIZE_H; tb_ao_size_v = DEFAULT_TB_AO_SIZE_V; tb_di_period = DEFAULT_TB_DI_PERIOD; tb_di_frames_per_upper_part = DEFAULT_TB_DI_FRAMES_PER_UPPER_PART; tb_di_on_flag = DEFAULT_TB_DI_ON_FLAG; tb_di_offset = DEFAULT_TB_DI_OFFSET; tb_di_break = DEFAULT_TB_DI_BREAK; tb_di_position_h = DEFAULT_TB_DI_POSITION_H; tb_di_position_v = DEFAULT_TB_DI_POSITION_V; tb_di_size_h = DEFAULT_TB_DI_SIZE_H; tb_di_size_v = DEFAULT_TB_DI_SIZE_V; eeprom_update_byte((uint8_t*)ADDRESS_TB_AO_FREQUENCY, tb_ao_frequency); eeprom_update_byte((uint8_t*)ADDRESS_TB_AO_FRAMES_PER_UPPER_PART, tb_ao_frames_per_upper_part); eeprom_update_byte((uint8_t*)ADDRESS_TB_AO_ON_FLAG, tb_ao_on_flag); eeprom_update_byte((uint8_t*)ADDRESS_TB_AO_GAP, tb_ao_gap); eeprom_update_byte((uint8_t*)ADDRESS_TB_AO_POSITION_H, tb_ao_position_h); eeprom_update_byte((uint8_t*)ADDRESS_TB_AO_POSITION_V, tb_ao_position_v); eeprom_update_word((uint16_t*)ADDRESS_TB_AO_SIZE_H, tb_ao_size_h); eeprom_update_byte((uint8_t*)ADDRESS_TB_AO_SIZE_V, tb_ao_size_v); eeprom_update_byte((uint8_t*)ADDRESS_TB_DI_PERIOD, tb_di_period); eeprom_update_word((uint16_t*)ADDRESS_TB_DI_FRAMES_PER_UPPER_PART, tb_di_frames_per_upper_part); eeprom_update_byte((uint8_t*)ADDRESS_TB_DI_ON_FLAG, tb_di_on_flag); eeprom_update_byte((uint8_t*)ADDRESS_TB_DI_OFFSET, tb_di_offset); eeprom_update_byte((uint8_t*)ADDRESS_TB_DI_BREAK, tb_di_break); eeprom_update_word((uint16_t*)ADDRESS_TB_DI_POSITION_H, tb_di_position_h); eeprom_update_byte((uint8_t*)ADDRESS_TB_DI_POSITION_V, tb_di_position_v); eeprom_update_word((uint16_t*)ADDRESS_TB_DI_SIZE_H, tb_di_size_h); eeprom_update_byte((uint8_t*)ADDRESS_TB_DI_SIZE_V, tb_di_size_v); sbs_ao_frequency = DEFAULT_SBS_AO_FREQUENCY; sbs_ao_frames_per_left_part = DEFAULT_SBS_AO_FRAMES_PER_LEFT_PART; sbs_ao_on_flag = DEFAULT_SBS_AO_ON_FLAG; sbs_ao_gap = DEFAULT_SBS_AO_GAP; sbs_ao_position_h = DEFAULT_SBS_AO_POSITION_H; sbs_ao_position_v = DEFAULT_SBS_AO_POSITION_V; sbs_ao_right_edge = DEFAULT_SBS_AO_RIGHT_EDGE; sbs_ao_size_v = DEFAULT_SBS_AO_SIZE_V; sbs_di_period = DEFAULT_SBS_DI_PERIOD; sbs_di_frames_per_left_part = DEFAULT_SBS_DI_FRAMES_PER_LEFT_PART; sbs_di_on_flag = DEFAULT_SBS_DI_ON_FLAG; sbs_di_offset = DEFAULT_SBS_DI_OFFSET; sbs_di_break = DEFAULT_SBS_DI_BREAK; sbs_di_position_h = DEFAULT_SBS_DI_POSITION_H; sbs_di_position_v = DEFAULT_SBS_DI_POSITION_V; sbs_di_size_h = DEFAULT_SBS_DI_SIZE_H; sbs_di_size_v = DEFAULT_SBS_DI_SIZE_V; eeprom_update_byte((uint8_t*)ADDRESS_SBS_AO_FREQUENCY, sbs_ao_frequency); eeprom_update_byte((uint8_t*)ADDRESS_SBS_AO_FRAMES_PER_LEFT_PART, sbs_ao_frames_per_left_part); eeprom_update_byte((uint8_t*)ADDRESS_SBS_AO_ON_FLAG, sbs_ao_on_flag); eeprom_update_byte((uint8_t*)ADDRESS_SBS_AO_GAP, sbs_ao_gap); eeprom_update_byte((uint8_t*)ADDRESS_SBS_AO_POSITION_H, sbs_ao_position_h); eeprom_update_byte((uint8_t*)ADDRESS_SBS_AO_POSITION_V, sbs_ao_position_v); eeprom_update_byte((uint8_t*)ADDRESS_SBS_AO_RIGHT_EDGE, sbs_ao_right_edge); eeprom_update_word((uint16_t*)ADDRESS_SBS_AO_SIZE_V, sbs_ao_size_v); eeprom_update_byte((uint8_t*)ADDRESS_SBS_DI_PERIOD, sbs_di_period); eeprom_update_word((uint16_t*)ADDRESS_SBS_DI_FRAMES_PER_LEFT_PART, sbs_di_frames_per_left_part); eeprom_update_byte((uint8_t*)ADDRESS_SBS_DI_ON_FLAG, sbs_di_on_flag); eeprom_update_byte((uint8_t*)ADDRESS_SBS_DI_OFFSET, sbs_di_offset); eeprom_update_byte((uint8_t*)ADDRESS_SBS_DI_BREAK, sbs_di_break); eeprom_update_byte((uint8_t*)ADDRESS_SBS_DI_POSITION_H, sbs_di_position_h); eeprom_update_word((uint16_t*)ADDRESS_SBS_DI_POSITION_V, sbs_di_position_v); eeprom_update_byte((uint8_t*)ADDRESS_SBS_DI_SIZE_H, sbs_di_size_h); eeprom_update_word((uint16_t*)ADDRESS_SBS_DI_SIZE_V, sbs_di_size_v); ffr_fr_position = DEFAULT_FFR_FR_POSITION; ffr_fr_period = DEFAULT_FFR_FR_PERIOD; ffr_fr_frames_per_visible_part = DEFAULT_FFR_FR_FRAMES_PER_VISIBLE_PART; ffr_fr_on_flag = DEFAULT_FFR_FR_ON_FLAG; ffr_fr_position_h = DEFAULT_FFR_FR_POSITION_H; ffr_fr_position_v = DEFAULT_FFR_FR_POSITION_V; ffr_fr_size_h = DEFAULT_FFR_FR_SIZE_H; ffr_fr_size_v = DEFAULT_FFR_FR_SIZE_V; ffr_sr_position = DEFAULT_FFR_SR_POSITION; ffr_sr_period = DEFAULT_FFR_SR_PERIOD; ffr_sr_frames_per_visible_part = DEFAULT_FFR_SR_FRAMES_PER_VISIBLE_PART; ffr_sr_on_flag = DEFAULT_FFR_SR_ON_FLAG; ffr_sr_position_h = DEFAULT_FFR_SR_POSITION_H; ffr_sr_position_v = DEFAULT_FFR_SR_POSITION_V; ffr_sr_size_h = DEFAULT_FFR_SR_SIZE_H; ffr_sr_size_v = DEFAULT_FFR_SR_SIZE_V; eeprom_update_byte((uint8_t*)ADDRESS_FFR_FR_POSITION, ffr_fr_position); eeprom_update_byte((uint8_t*)ADDRESS_FFR_FR_PERIOD, ffr_fr_period); eeprom_update_word((uint16_t*)ADDRESS_FFR_FR_FRAMES_PER_VISIBLE_PART, ffr_fr_frames_per_visible_part); eeprom_update_byte((uint8_t*)ADDRESS_FFR_FR_ON_FLAG, ffr_fr_on_flag); eeprom_update_word((uint16_t*)ADDRESS_FFR_FR_POSITION_H, ffr_fr_position_h); eeprom_update_word((uint16_t*)ADDRESS_FFR_FR_POSITION_V, ffr_fr_position_v); eeprom_update_word((uint16_t*)ADDRESS_FFR_FR_SIZE_H, ffr_fr_size_h); eeprom_update_word((uint16_t*)ADDRESS_FFR_FR_SIZE_V, ffr_fr_size_v); eeprom_update_byte((uint8_t*)ADDRESS_FFR_SR_POSITION, ffr_sr_position); eeprom_update_byte((uint8_t*)ADDRESS_FFR_SR_PERIOD, ffr_sr_period); eeprom_update_word((uint16_t*)ADDRESS_FFR_SR_FRAMES_PER_VISIBLE_PART, ffr_sr_frames_per_visible_part); eeprom_update_byte((uint8_t*)ADDRESS_FFR_SR_ON_FLAG, ffr_sr_on_flag); eeprom_update_word((uint16_t*)ADDRESS_FFR_SR_POSITION_H, ffr_sr_position_h); eeprom_update_word((uint16_t*)ADDRESS_FFR_SR_POSITION_V, ffr_sr_position_v); eeprom_update_word((uint16_t*)ADDRESS_FFR_SR_SIZE_H, ffr_sr_size_h); eeprom_update_word((uint16_t*)ADDRESS_FFR_SR_SIZE_V, ffr_sr_size_v); frames_per_keyboard_read_target = 20; } } if( !(KEYBOARD_PORT_IN &= (1 << PAGE_KEY)) ) { // if PAGE_KEY is pressed... if(KEYBOARD_PORT_IN &= (1 << SHIFT_KEY)) { page++; if(page >= 6) page = 0; } // and SHIFT_KEY is not, change page to next one else { page--; if(page > 240) page = 5; } // if PAGE_KEY and SHIFT_KEY are both pressed, change page to previous one frames_per_keyboard_read_target = 10; // 10 frames till next keyboard read } /* Store information about other keys in keyboard_state */ if( !(KEYBOARD_PORT_IN &= (1 << SHIFT_KEY)) ) keyboard_state |= (1 << 4); else keyboard_state &= ~(1 << 4); if( !(KEYBOARD_PORT_IN &= (1 << LEFT_KEY)) ) keyboard_state |= (1 << 3); else keyboard_state &= ~(1 << 3); if( !(KEYBOARD_PORT_IN &= (1 << UP_KEY)) ) keyboard_state |= (1 << 2); else keyboard_state &= ~(1 << 2); if( !(KEYBOARD_PORT_IN &= (1 << DOWN_KEY)) ) keyboard_state |= (1 << 1); else keyboard_state &= ~(1 << 1); if( !(KEYBOARD_PORT_IN &= (1 << RIGHT_KEY)) ) keyboard_state |= (1 << 0); else keyboard_state &= ~(1 << 0); switch(page) { /* Alternating Occlusions Settings */ case 0: switch(keyboard_state) { /* Without the SHIFT_KEY pressed. */ case 0x01: if(sbs_ao_frequency==0) sbs_ao_frames_per_left_part = sbs_ao_frames_per_left_part + 2; else sbs_ao_frames_per_left_part++; if(sbs_ao_frames_per_left_part > sbs_ao_frames_target) sbs_ao_frames_per_left_part = sbs_ao_frames_target; frames_per_keyboard_read_target = 10; break; case 0x02: sbs_ao_frequency--; if(sbs_ao_frequency > 240) sbs_ao_frequency = 0; sbs_ao_frequency_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x04: sbs_ao_frequency++; if(sbs_ao_frequency > MAX_SBS_AO_FREQUENCY) sbs_ao_frequency = MAX_SBS_AO_FREQUENCY; sbs_ao_frequency_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x08: if(sbs_ao_frequency==0) sbs_ao_frames_per_left_part = sbs_ao_frames_per_left_part - 2; else sbs_ao_frames_per_left_part--; if(sbs_ao_frames_per_left_part > 240) sbs_ao_frames_per_left_part = 0; frames_per_keyboard_read_target = 10; break; /* With the SHIFT_KEY pressed. */ case 0x11: sbs_ao_on_flag ^= 0x01; frames_per_keyboard_read_target = 10; break; case 0x12: sbs_ao_gap--; if(sbs_ao_gap < MIN_SBS_AO_GAP) sbs_ao_gap = MIN_SBS_AO_GAP; frames_per_keyboard_read_target = 10; break; case 0x14: sbs_ao_gap++; if(sbs_ao_gap > MAX_SBS_AO_GAP) sbs_ao_gap = MAX_SBS_AO_GAP; frames_per_keyboard_read_target = 10; break; case 0x18: sbs_ao_on_flag ^= 0x01; frames_per_keyboard_read_target = 10; break; /* Restoring default settings by pressing 2, 4 or 5 buttons at the same time. */ case 0x09: sbs_ao_frequency_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x06: sbs_ao_frequency = DEFAULT_SBS_AO_FREQUENCY; sbs_ao_frequency_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x19: sbs_ao_on_flag = DEFAULT_SBS_AO_ON_FLAG; frames_per_keyboard_read_target = 10; break; case 0x16: sbs_ao_gap = DEFAULT_SBS_AO_GAP; frames_per_keyboard_read_target = 10; break; case 0x0f: sbs_ao_frames_per_left_part = DEFAULT_SBS_AO_FRAMES_PER_LEFT_PART; sbs_ao_frequency = DEFAULT_SBS_AO_FREQUENCY; sbs_ao_on_flag = DEFAULT_SBS_AO_ON_FLAG; sbs_ao_gap = DEFAULT_SBS_AO_GAP; sbs_ao_frequency_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x1f: sbs_ao_frames_per_left_part = DEFAULT_SBS_AO_FRAMES_PER_LEFT_PART; sbs_ao_frequency = DEFAULT_SBS_AO_FREQUENCY; sbs_ao_on_flag = DEFAULT_SBS_AO_ON_FLAG; sbs_ao_gap = DEFAULT_SBS_AO_GAP; sbs_ao_frequency_change_flag = 1; sbs_ao_position_h = DEFAULT_SBS_AO_POSITION_H; sbs_ao_position_v = DEFAULT_SBS_AO_POSITION_V; sbs_ao_right_edge = DEFAULT_SBS_AO_RIGHT_EDGE; sbs_ao_size_v = DEFAULT_SBS_AO_SIZE_V; sbs_di_frames_per_left_part = DEFAULT_SBS_DI_FRAMES_PER_LEFT_PART; sbs_di_period = DEFAULT_SBS_DI_PERIOD; sbs_di_offset = DEFAULT_SBS_DI_OFFSET; sbs_di_on_flag = DEFAULT_SBS_DI_ON_FLAG; sbs_di_break = DEFAULT_SBS_DI_BREAK; sbs_di_period_change_flag = 1; sbs_di_position_h = DEFAULT_SBS_DI_POSITION_H; sbs_di_position_v = DEFAULT_SBS_DI_POSITION_V; sbs_di_size_h = DEFAULT_SBS_DI_SIZE_H; sbs_di_size_v = DEFAULT_SBS_DI_SIZE_V; page = 0; frames_per_keyboard_read_target = 20; break; } break; /* Alternating Occlusions Position */ case 1: switch(keyboard_state) { /* Without the SHIFT_KEY pressed. */ case 0x01: sbs_ao_position_h++; if(sbs_ao_position_h > MAX_SBS_AO_POSITION_H) sbs_ao_position_h = MAX_SBS_AO_POSITION_H; frames_per_keyboard_read_target = 10; break; case 0x02: sbs_ao_position_v++; if(sbs_ao_position_v > MAX_SBS_AO_POSITION_V) sbs_ao_position_v = MAX_SBS_AO_POSITION_V; frames_per_keyboard_read_target = 10; break; case 0x04: sbs_ao_position_v--; if(sbs_ao_position_v > 240) sbs_ao_position_v = 0; frames_per_keyboard_read_target = 10; break; case 0x08: sbs_ao_position_h--; if(sbs_ao_position_h < MIN_SBS_AO_POSITION_H) sbs_ao_position_h = MIN_SBS_AO_POSITION_H; frames_per_keyboard_read_target = 10; break; /* With the SHIFT_KEY pressed. */ case 0x11: sbs_ao_position_h = sbs_ao_position_h + 10; if(sbs_ao_position_h > MAX_SBS_AO_POSITION_H) sbs_ao_position_h = MAX_SBS_AO_POSITION_H; frames_per_keyboard_read_target = 10; break; case 0x12: sbs_ao_position_v = sbs_ao_position_v + 10; if(sbs_ao_position_v > MAX_SBS_AO_POSITION_V) sbs_ao_position_v = MAX_SBS_AO_POSITION_V; frames_per_keyboard_read_target = 10; break; case 0x14: sbs_ao_position_v = sbs_ao_position_v - 10; if(sbs_ao_position_v > 240) sbs_ao_position_v = 0; frames_per_keyboard_read_target = 10; break; case 0x18: sbs_ao_position_h = sbs_ao_position_h - 10; if( (sbs_ao_position_h < MIN_SBS_AO_POSITION_H) || (sbs_ao_position_h > 240) ) sbs_ao_position_h = MIN_SBS_AO_POSITION_H; frames_per_keyboard_read_target = 10; break; /* Restoring default settings by pressing 2, 4 or 5 buttons at the same time. */ case 0x09: sbs_ao_position_h = DEFAULT_SBS_AO_POSITION_H; frames_per_keyboard_read_target = 10; break; case 0x06: sbs_ao_position_v = DEFAULT_SBS_AO_POSITION_V; frames_per_keyboard_read_target = 10; break; case 0x19: sbs_ao_position_h = DEFAULT_SBS_AO_POSITION_H; frames_per_keyboard_read_target = 10; break; case 0x16: sbs_ao_position_v = DEFAULT_SBS_AO_POSITION_V; frames_per_keyboard_read_target = 10; break; case 0x0f: sbs_ao_position_h = DEFAULT_SBS_AO_POSITION_H; sbs_ao_position_v = DEFAULT_SBS_AO_POSITION_V; frames_per_keyboard_read_target = 10; break; case 0x1f: sbs_ao_frames_per_left_part = DEFAULT_SBS_AO_FRAMES_PER_LEFT_PART; sbs_ao_frequency = DEFAULT_SBS_AO_FREQUENCY; sbs_ao_on_flag = DEFAULT_SBS_AO_ON_FLAG; sbs_ao_gap = DEFAULT_SBS_AO_GAP; sbs_ao_frequency_change_flag = 1; sbs_ao_position_h = DEFAULT_SBS_AO_POSITION_H; sbs_ao_position_v = DEFAULT_SBS_AO_POSITION_V; sbs_ao_right_edge = DEFAULT_SBS_AO_RIGHT_EDGE; sbs_ao_size_v = DEFAULT_SBS_AO_SIZE_V; sbs_di_frames_per_left_part = DEFAULT_SBS_DI_FRAMES_PER_LEFT_PART; sbs_di_period = DEFAULT_SBS_DI_PERIOD; sbs_di_offset = DEFAULT_SBS_DI_OFFSET; sbs_di_on_flag = DEFAULT_SBS_DI_ON_FLAG; sbs_di_break = DEFAULT_SBS_DI_BREAK; sbs_di_period_change_flag = 1; sbs_di_position_h = DEFAULT_SBS_DI_POSITION_H; sbs_di_position_v = DEFAULT_SBS_DI_POSITION_V; sbs_di_size_h = DEFAULT_SBS_DI_SIZE_H; sbs_di_size_v = DEFAULT_SBS_DI_SIZE_V; page = 0; frames_per_keyboard_read_target = 20; break; } break; /* Alternating Occlusions Size */ case 2: switch(keyboard_state) { /* Without the SHIFT_KEY pressed. */ case 0x01: sbs_ao_right_edge++; if(sbs_ao_right_edge > MAX_SBS_RIGHT_EDGE) sbs_ao_right_edge = MAX_SBS_RIGHT_EDGE; frames_per_keyboard_read_target = 10; break; case 0x02: sbs_ao_size_v++; if(sbs_ao_size_v > MAX_SBS_AO_SIZE_V) sbs_ao_size_v = MAX_SBS_AO_SIZE_V; frames_per_keyboard_read_target = 10; break; case 0x04: sbs_ao_size_v--; if(sbs_ao_size_v < MIN_SBS_AO_SIZE_V) sbs_ao_size_v = MIN_SBS_AO_SIZE_V; frames_per_keyboard_read_target = 10; break; case 0x08: sbs_ao_right_edge--; if(sbs_ao_right_edge < MIN_SBS_AO_RIGHT_EDGE) sbs_ao_right_edge = MIN_SBS_AO_RIGHT_EDGE; frames_per_keyboard_read_target = 10; break; /* With the SHIFT_KEY pressed. */ case 0x11: sbs_ao_right_edge = sbs_ao_right_edge + 5; if(sbs_ao_right_edge > MAX_SBS_RIGHT_EDGE) sbs_ao_right_edge = MAX_SBS_RIGHT_EDGE; frames_per_keyboard_read_target = 10; break; case 0x12: sbs_ao_size_v = sbs_ao_size_v + 10; if(sbs_ao_size_v > MAX_SBS_AO_SIZE_V) sbs_ao_size_v = MAX_SBS_AO_SIZE_V; frames_per_keyboard_read_target = 10; break; case 0x14: sbs_ao_size_v = sbs_ao_size_v - 10; if(sbs_ao_size_v < MIN_SBS_AO_SIZE_V) sbs_ao_size_v = MIN_SBS_AO_SIZE_V; frames_per_keyboard_read_target = 10; break; case 0x18: sbs_ao_right_edge = sbs_ao_right_edge - 5; if(sbs_ao_right_edge < MIN_SBS_AO_RIGHT_EDGE) sbs_ao_right_edge = MIN_SBS_AO_RIGHT_EDGE; frames_per_keyboard_read_target = 10; break; /* Restoring default settings by pressing 2, 4 or 5 buttons at the same time. */ case 0x09: sbs_ao_right_edge = DEFAULT_SBS_AO_RIGHT_EDGE; frames_per_keyboard_read_target = 10; break; case 0x06: sbs_ao_size_v = DEFAULT_SBS_AO_SIZE_V; frames_per_keyboard_read_target = 10; break; case 0x19: sbs_ao_right_edge = DEFAULT_SBS_AO_RIGHT_EDGE; frames_per_keyboard_read_target = 10; break; case 0x16: sbs_ao_size_v = DEFAULT_SBS_AO_SIZE_V; frames_per_keyboard_read_target = 10; break; case 0x0f: sbs_ao_right_edge = DEFAULT_SBS_AO_RIGHT_EDGE; sbs_ao_size_v = DEFAULT_SBS_AO_SIZE_V; frames_per_keyboard_read_target = 10; break; case 0x1f: sbs_ao_frames_per_left_part = DEFAULT_SBS_AO_FRAMES_PER_LEFT_PART; sbs_ao_frequency = DEFAULT_SBS_AO_FREQUENCY; sbs_ao_on_flag = DEFAULT_SBS_AO_ON_FLAG; sbs_ao_gap = DEFAULT_SBS_AO_GAP; sbs_ao_frequency_change_flag = 1; sbs_ao_position_h = DEFAULT_SBS_AO_POSITION_H; sbs_ao_position_v = DEFAULT_SBS_AO_POSITION_V; sbs_ao_right_edge = DEFAULT_SBS_AO_RIGHT_EDGE; sbs_ao_size_v = DEFAULT_SBS_AO_SIZE_V; sbs_di_frames_per_left_part = DEFAULT_SBS_DI_FRAMES_PER_LEFT_PART; sbs_di_period = DEFAULT_SBS_DI_PERIOD; sbs_di_offset = DEFAULT_SBS_DI_OFFSET; sbs_di_on_flag = DEFAULT_SBS_DI_ON_FLAG; sbs_di_break = DEFAULT_SBS_DI_BREAK; sbs_di_period_change_flag = 1; sbs_di_position_h = DEFAULT_SBS_DI_POSITION_H; sbs_di_position_v = DEFAULT_SBS_DI_POSITION_V; sbs_di_size_h = DEFAULT_SBS_DI_SIZE_H; sbs_di_size_v = DEFAULT_SBS_DI_SIZE_V; page = 0; frames_per_keyboard_read_target = 20; break; } break; /* Dichoptic Settings */ case 3: switch(keyboard_state) { /* Without the SHIFT_KEY pressed. */ case 0x01: if(sbs_di_period==0) sbs_di_frames_per_left_part = sbs_di_frames_per_left_part + 40; else if(sbs_di_period==5) sbs_di_frames_per_left_part = sbs_di_frames_per_left_part + 10; else sbs_di_frames_per_left_part = sbs_di_frames_per_left_part + 20; if(sbs_di_frames_per_left_part > sbs_di_frames_target) sbs_di_frames_per_left_part = sbs_di_frames_target; frames_per_keyboard_read_target = 10; break; case 0x02: sbs_di_period--; if(sbs_di_period > 240) sbs_di_period = 0; sbs_di_period_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x04: sbs_di_period++; if(sbs_di_period > MAX_SBS_DI_PERIOD) sbs_di_period = MAX_SBS_DI_PERIOD; sbs_di_period_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x08: if(sbs_di_period==0) sbs_di_frames_per_left_part = sbs_di_frames_per_left_part - 40; else if(sbs_di_period==5) sbs_di_frames_per_left_part = sbs_di_frames_per_left_part - 10; else sbs_di_frames_per_left_part = sbs_di_frames_per_left_part - 20; if(sbs_di_frames_per_left_part > 65000) sbs_di_frames_per_left_part = 0; frames_per_keyboard_read_target = 10; break; /* With the SHIFT_KEY pressed. */ case 0x11: sbs_di_offset++; if(sbs_di_offset > MAX_SBS_DI_OFFSET) sbs_di_offset = MAX_SBS_DI_OFFSET; frames_per_keyboard_read_target = 10; break; case 0x12: if(sbs_di_period==0) { sbs_di_break = sbs_di_break + 40; if(sbs_di_break > 160) sbs_di_break = 0; break; } else { sbs_di_break = sbs_di_break + 20; if(sbs_di_break > 80) sbs_di_break = 0; break; } frames_per_keyboard_read_target = 10; case 0x14: sbs_di_on_flag ^= 0x01; frames_per_keyboard_read_target = 10; break; case 0x18: sbs_di_offset--; if(sbs_di_offset < MIN_SBS_DI_OFFSET) sbs_di_offset = MIN_SBS_DI_OFFSET; frames_per_keyboard_read_target = 10; break; /* Restoring default settings by pressing 2, 4 or 5 buttons at the same time. */ case 0x09: sbs_di_period_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x06: sbs_di_period = DEFAULT_SBS_DI_PERIOD; sbs_di_period_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x19: sbs_di_offset = DEFAULT_SBS_DI_OFFSET; frames_per_keyboard_read_target = 10; break; case 0x16: sbs_di_on_flag = DEFAULT_SBS_DI_ON_FLAG; sbs_di_break = DEFAULT_SBS_DI_BREAK; frames_per_keyboard_read_target = 10; break; case 0x0f: sbs_di_frames_per_left_part = DEFAULT_SBS_DI_FRAMES_PER_LEFT_PART; sbs_di_period = DEFAULT_SBS_DI_PERIOD; sbs_di_offset = DEFAULT_SBS_DI_OFFSET; sbs_di_on_flag = DEFAULT_SBS_DI_ON_FLAG; sbs_di_break = DEFAULT_SBS_DI_BREAK; sbs_di_period_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x1f: sbs_ao_frames_per_left_part = DEFAULT_SBS_AO_FRAMES_PER_LEFT_PART; sbs_ao_frequency = DEFAULT_SBS_AO_FREQUENCY; sbs_ao_on_flag = DEFAULT_SBS_AO_ON_FLAG; sbs_ao_gap = DEFAULT_SBS_AO_GAP; sbs_ao_frequency_change_flag = 1; sbs_ao_position_h = DEFAULT_SBS_AO_POSITION_H; sbs_ao_position_v = DEFAULT_SBS_AO_POSITION_V; sbs_ao_right_edge = DEFAULT_SBS_AO_RIGHT_EDGE; sbs_ao_size_v = DEFAULT_SBS_AO_SIZE_V; sbs_di_frames_per_left_part = DEFAULT_SBS_DI_FRAMES_PER_LEFT_PART; sbs_di_period = DEFAULT_SBS_DI_PERIOD; sbs_di_offset = DEFAULT_SBS_DI_OFFSET; sbs_di_on_flag = DEFAULT_SBS_DI_ON_FLAG; sbs_di_break = DEFAULT_SBS_DI_BREAK; sbs_di_period_change_flag = 1; sbs_di_position_h = DEFAULT_SBS_DI_POSITION_H; sbs_di_position_v = DEFAULT_SBS_DI_POSITION_V; sbs_di_size_h = DEFAULT_SBS_DI_SIZE_H; sbs_di_size_v = DEFAULT_SBS_DI_SIZE_V; page = 0; frames_per_keyboard_read_target = 20; break; } break; /* Dichoptic Position */ case 4: switch(keyboard_state) { /* Without the SHIFT_KEY pressed. */ case 0x01: sbs_di_position_h++; if( (sbs_di_position_h + sbs_di_size_h) > (sbs_ao_size_h-MIN_SBS_DI_POSITION_H) ) sbs_di_position_h--; frames_per_keyboard_read_target = 10; break; case 0x02: sbs_di_position_v++; if( (sbs_di_position_v + sbs_di_size_v) > sbs_ao_size_v ) sbs_di_position_v--; frames_per_keyboard_read_target = 10; break; case 0x04: sbs_di_position_v--; if(sbs_di_position_v > 65000) sbs_di_position_v = 0; frames_per_keyboard_read_target = 10; break; case 0x08: sbs_di_position_h--; if(sbs_di_position_h < MIN_SBS_DI_POSITION_H) sbs_di_position_h = MIN_SBS_DI_POSITION_H; frames_per_keyboard_read_target = 10; break; /* With the SHIFT_KEY pressed. */ case 0x11: sbs_di_position_h = sbs_di_position_h + 10; if( (sbs_di_position_h + sbs_di_size_h) > (sbs_ao_size_h-MIN_SBS_DI_POSITION_H) ) sbs_di_position_h = (sbs_ao_size_h-MIN_SBS_DI_POSITION_H) - sbs_di_size_h; frames_per_keyboard_read_target = 10; break; case 0x12: sbs_di_position_v = sbs_di_position_v + 10; if( (sbs_di_position_v + sbs_di_size_v) > sbs_ao_size_v ) sbs_di_position_v = sbs_ao_size_v - sbs_di_size_v; frames_per_keyboard_read_target = 10; break; case 0x14: sbs_di_position_v = sbs_di_position_v - 10; if(sbs_di_position_v > 65000) sbs_di_position_v = 0; frames_per_keyboard_read_target = 10; break; case 0x18: sbs_di_position_h = sbs_di_position_h - 10; if( (sbs_di_position_h < MIN_SBS_DI_POSITION_H) || (sbs_di_position_h > 240) ) sbs_di_position_h = MIN_SBS_DI_POSITION_H; frames_per_keyboard_read_target = 10; break; /* Restoring default settings by pressing 2, 4 or 5 buttons at the same time. */ case 0x09: sbs_di_position_h = DEFAULT_SBS_DI_POSITION_H; frames_per_keyboard_read_target = 10; break; case 0x06: sbs_di_position_v = DEFAULT_SBS_DI_POSITION_V; frames_per_keyboard_read_target = 10; break; case 0x19: sbs_di_position_h = DEFAULT_SBS_DI_POSITION_H; frames_per_keyboard_read_target = 10; break; case 0x16: sbs_di_position_v = DEFAULT_SBS_DI_POSITION_V; frames_per_keyboard_read_target = 10; break; case 0x0f: sbs_di_position_h = DEFAULT_SBS_DI_POSITION_H; sbs_di_position_v = DEFAULT_SBS_DI_POSITION_V; frames_per_keyboard_read_target = 10; break; case 0x1f: sbs_ao_frames_per_left_part = DEFAULT_SBS_AO_FRAMES_PER_LEFT_PART; sbs_ao_frequency = DEFAULT_SBS_AO_FREQUENCY; sbs_ao_on_flag = DEFAULT_SBS_AO_ON_FLAG; sbs_ao_gap = DEFAULT_SBS_AO_GAP; sbs_ao_frequency_change_flag = 1; sbs_ao_position_h = DEFAULT_SBS_AO_POSITION_H; sbs_ao_position_v = DEFAULT_SBS_AO_POSITION_V; sbs_ao_right_edge = DEFAULT_SBS_AO_RIGHT_EDGE; sbs_ao_size_v = DEFAULT_SBS_AO_SIZE_V; sbs_di_frames_per_left_part = DEFAULT_SBS_DI_FRAMES_PER_LEFT_PART; sbs_di_period = DEFAULT_SBS_DI_PERIOD; sbs_di_offset = DEFAULT_SBS_DI_OFFSET; sbs_di_on_flag = DEFAULT_SBS_DI_ON_FLAG; sbs_di_break = DEFAULT_SBS_DI_BREAK; sbs_di_period_change_flag = 1; sbs_di_position_h = DEFAULT_SBS_DI_POSITION_H; sbs_di_position_v = DEFAULT_SBS_DI_POSITION_V; sbs_di_size_h = DEFAULT_SBS_DI_SIZE_H; sbs_di_size_v = DEFAULT_SBS_DI_SIZE_V; page = 0; frames_per_keyboard_read_target = 20; break; } break; /* Dichoptic Size */ case 5: switch(keyboard_state) { /* Without the SHIFT_KEY pressed. */ case 0x01: sbs_di_size_h++; if( (sbs_di_position_h + sbs_di_size_h) > (sbs_ao_size_h-MIN_SBS_DI_POSITION_H) ) sbs_di_size_h--; frames_per_keyboard_read_target = 10; break; case 0x02: sbs_di_size_v++; if( (sbs_di_position_v + sbs_di_size_v) > sbs_ao_size_v ) sbs_di_size_v--; frames_per_keyboard_read_target = 10; break; case 0x04: sbs_di_size_v--; if(sbs_di_size_v < MIN_SBS_DI_SIZE_V) sbs_di_size_v = MIN_SBS_DI_SIZE_V; frames_per_keyboard_read_target = 10; break; case 0x08: sbs_di_size_h--; if(sbs_di_size_h < MIN_SBS_DI_SIZE_H) sbs_di_size_h = MIN_SBS_DI_SIZE_H; frames_per_keyboard_read_target = 10; break; /* With the SHIFT_KEY pressed. */ case 0x11: sbs_di_size_h = sbs_di_size_h + 10; if( (sbs_di_position_h + sbs_di_size_h) > (sbs_ao_size_h-MIN_SBS_DI_POSITION_H) ) sbs_di_size_h = (sbs_ao_size_h-MIN_SBS_DI_POSITION_H) - sbs_di_position_h; frames_per_keyboard_read_target = 10; break; case 0x12: sbs_di_size_v = sbs_di_size_v + 10; if( (sbs_di_position_v + sbs_di_size_v) > sbs_ao_size_v ) sbs_di_size_v = sbs_ao_size_v - sbs_di_position_v; frames_per_keyboard_read_target = 10; break; case 0x14: sbs_di_size_v = sbs_di_size_v - 10; if(sbs_di_size_v < MIN_SBS_DI_SIZE_V) sbs_di_size_v = MIN_SBS_DI_SIZE_V; frames_per_keyboard_read_target = 10; break; case 0x18: sbs_di_size_h = sbs_di_size_h - 10; if( (sbs_di_size_h < MIN_SBS_DI_SIZE_H) || (sbs_di_size_h > 240) ) sbs_di_size_h = MIN_SBS_DI_SIZE_H; frames_per_keyboard_read_target = 10; break; /* Restoring default settings by pressing 2, 4 or 5 buttons at the same time. */ case 0x09: sbs_di_size_h = DEFAULT_SBS_DI_SIZE_H; frames_per_keyboard_read_target = 10; break; case 0x06: sbs_di_size_v = DEFAULT_SBS_DI_SIZE_V; frames_per_keyboard_read_target = 10; break; case 0x19: sbs_di_size_h = DEFAULT_SBS_DI_SIZE_H; frames_per_keyboard_read_target = 10; break; case 0x16: sbs_di_size_v = DEFAULT_SBS_DI_SIZE_V; frames_per_keyboard_read_target = 10; break; case 0x0f: sbs_di_size_h = DEFAULT_SBS_DI_SIZE_H; sbs_di_size_v = DEFAULT_SBS_DI_SIZE_V; frames_per_keyboard_read_target = 10; break; case 0x1f: sbs_ao_frames_per_left_part = DEFAULT_SBS_AO_FRAMES_PER_LEFT_PART; sbs_ao_frequency = DEFAULT_SBS_AO_FREQUENCY; sbs_ao_on_flag = DEFAULT_SBS_AO_ON_FLAG; sbs_ao_gap = DEFAULT_SBS_AO_GAP; sbs_ao_frequency_change_flag = 1; sbs_ao_position_h = DEFAULT_SBS_AO_POSITION_H; sbs_ao_position_v = DEFAULT_SBS_AO_POSITION_V; sbs_ao_right_edge = DEFAULT_SBS_AO_RIGHT_EDGE; sbs_ao_size_v = DEFAULT_SBS_AO_SIZE_V; sbs_di_frames_per_left_part = DEFAULT_SBS_DI_FRAMES_PER_LEFT_PART; sbs_di_period = DEFAULT_SBS_DI_PERIOD; sbs_di_offset = DEFAULT_SBS_DI_OFFSET; sbs_di_on_flag = DEFAULT_SBS_DI_ON_FLAG; sbs_di_break = DEFAULT_SBS_DI_BREAK; sbs_di_period_change_flag = 1; sbs_di_position_h = DEFAULT_SBS_DI_POSITION_H; sbs_di_position_v = DEFAULT_SBS_DI_POSITION_V; sbs_di_size_h = DEFAULT_SBS_DI_SIZE_H; sbs_di_size_v = DEFAULT_SBS_DI_SIZE_V; page = 0; frames_per_keyboard_read_target = 20; break; } break; } sbs_ao_size_h = sbs_ao_right_edge - sbs_ao_gap; /* Make sure that dihoptic rectangle stays inside alternately occluding rectangle, horizontally. */ if( (sbs_di_position_h + sbs_di_size_h) > (sbs_ao_size_h-MIN_SBS_DI_POSITION_H) ) { temp_sbs_di_size_h = (sbs_ao_size_h-MIN_SBS_DI_POSITION_H) - sbs_di_position_h; sbs_di_size_h = temp_sbs_di_size_h; if(temp_sbs_di_size_h < MIN_SBS_DI_SIZE_H) { sbs_di_size_h = MIN_SBS_DI_SIZE_H; if( (sbs_di_position_h + sbs_di_size_h) > (sbs_ao_size_h-MIN_SBS_DI_POSITION_H) ) sbs_di_position_h = (sbs_ao_size_h-MIN_SBS_DI_POSITION_H) - sbs_di_size_h; } } /* Make sure that dihoptic rectangle stays inside alternately occluding rectangle, vertically. */ if( (sbs_di_position_v + sbs_di_size_v) > sbs_ao_size_v) { temp_sbs_di_size_v = sbs_ao_size_v - sbs_di_position_v; sbs_di_size_v = temp_sbs_di_size_v; if(temp_sbs_di_size_v < MIN_SBS_DI_SIZE_V) { sbs_di_size_v = MIN_SBS_DI_SIZE_V; if( (sbs_di_position_v + sbs_di_size_v) > sbs_ao_size_v ) sbs_di_position_v = sbs_ao_size_v - sbs_di_size_v; } } /* Make sure that maximum number of lines is not exceeded. */ if( (sbs_ao_position_v + sbs_ao_size_v) > 274 ) sbs_ao_size_v = 274 - sbs_ao_position_v; /* Set total number of frames in a cycle according to sbs_ao_frequency. */ switch(sbs_ao_frequency) { case 0: sbs_ao_frames_target=24; break; // 2.5 Hz case 1: sbs_ao_frames_target=12; break; // 5 Hz case 2: sbs_ao_frames_target=8; break; // 7.5 Hz case 3: sbs_ao_frames_target=6; break; // 10 Hz case 4: sbs_ao_frames_target=5; break; // 12 Hz case 5: sbs_ao_frames_target=4; break; // 15 Hz } if(sbs_ao_frequency_change_flag==1) { // if change of sbs_ao_frequency occurred, set default number of frames during with alternately occluding rectangle occupies left part of the picture switch(sbs_ao_frequency) { case 0: sbs_ao_frames_per_left_part=12; break; case 1: sbs_ao_frames_per_left_part=6; break; case 2: sbs_ao_frames_per_left_part=4; break; case 3: sbs_ao_frames_per_left_part=3; break; case 4: sbs_ao_frames_per_left_part=3; break; case 5: sbs_ao_frames_per_left_part=2; break; } sbs_ao_frequency_change_flag = 0; } /* Set total number of frames in a cycle according to sbs_di_period. */ switch(sbs_di_period) { case 0: sbs_di_frames_target=480; break; // 8s case 1: sbs_di_frames_target=280; break; // 4.67s case 2: sbs_di_frames_target=200; break; // 3.33s case 3: sbs_di_frames_target=120; break; // 2s case 4: sbs_di_frames_target=80; break; // 1.33s case 5: sbs_di_frames_target=40; break; // 0.67s } if(sbs_di_period_change_flag==1) { // if change of sbs_di_period occurred, set default number of frames during with dihoptic rectangle occupies left part of the picture switch(sbs_di_period) { case 0: sbs_di_frames_per_left_part=240; break; case 1: sbs_di_frames_per_left_part=140; break; case 2: sbs_di_frames_per_left_part=100; break; case 3: sbs_di_frames_per_left_part=60; break; case 4: sbs_di_frames_per_left_part=40; break; case 5: sbs_di_frames_per_left_part=20; break; } sbs_di_period_change_flag = 0; } } frames_per_keyboard_read++; /* --- Timing and Rendering --- */ /* Determine where alternately occluding rectangle should appear. */ sbs_ao_frames_count++; if(sbs_ao_frames_count >= sbs_ao_frames_target) sbs_ao_frames_count = 0; if(sbs_ao_frames_count < sbs_ao_frames_per_left_part) sbs_ao_position = 1; // left else sbs_ao_position = 2; // right /* Determine where dihoptic rectangle should appear. */ sbs_di_frames_count++; if( sbs_di_frames_count >= (sbs_di_frames_target + 2*sbs_di_break) ) sbs_di_frames_count = 0; if(sbs_di_frames_count < sbs_di_frames_per_left_part) sbs_di_position = 1; // left else if( sbs_di_frames_count < (sbs_di_frames_per_left_part + sbs_di_break) ) sbs_di_position = 0; // not visible during the brake else if(sbs_di_frames_count < (sbs_di_frames_target + sbs_di_break) ) sbs_di_position = 2; // right else sbs_di_position = 0; /* Calculate where left edge of alternately occluding rectangle is. */ if(sbs_ao_position == 2) sbs_ao_left_edge = sbs_ao_gap; else sbs_ao_left_edge = 0; /* Calculate where edges of dihoptic rectangle are, while making sure they are kept at safe distance from alternately occluding rectangle edges. */ if(sbs_di_position == 2) { sbs_di_left_edge = sbs_di_position_h + sbs_di_offset; if( (sbs_di_left_edge250) ) sbs_di_left_edge = MIN_SBS_DI_POSITION_H; sbs_di_right_edge = sbs_di_position_h + sbs_di_size_h + sbs_di_offset; if(sbs_di_right_edge>(sbs_ao_size_h-MIN_SBS_DI_POSITION_H)) sbs_di_right_edge = (sbs_ao_size_h-MIN_SBS_DI_POSITION_H); if(sbs_di_right_edge= 4) mode = 0; frames_per_keyboard_read_target = 10; } // and PAGE_KEY is not, change mode to next one else { // if MODE_KEY and PAGE_KEY are both pressed, set default settings mode = 0; page = 5; tb_ao_frequency = DEFAULT_TB_AO_FREQUENCY; tb_ao_frames_per_upper_part = DEFAULT_TB_AO_FRAMES_PER_UPPER_PART; tb_ao_on_flag = DEFAULT_TB_AO_ON_FLAG; tb_ao_gap = DEFAULT_TB_AO_GAP; tb_ao_position_h = DEFAULT_TB_AO_POSITION_H; tb_ao_position_v = DEFAULT_TB_AO_POSITION_V; tb_ao_size_h = DEFAULT_TB_AO_SIZE_H; tb_ao_size_v = DEFAULT_TB_AO_SIZE_V; tb_di_period = DEFAULT_TB_DI_PERIOD; tb_di_frames_per_upper_part = DEFAULT_TB_DI_FRAMES_PER_UPPER_PART; tb_di_on_flag = DEFAULT_TB_DI_ON_FLAG; tb_di_offset = DEFAULT_TB_DI_OFFSET; tb_di_break = DEFAULT_TB_DI_BREAK; tb_di_position_h = DEFAULT_TB_DI_POSITION_H; tb_di_position_v = DEFAULT_TB_DI_POSITION_V; tb_di_size_h = DEFAULT_TB_DI_SIZE_H; tb_di_size_v = DEFAULT_TB_DI_SIZE_V; eeprom_update_byte((uint8_t*)ADDRESS_TB_AO_FREQUENCY, tb_ao_frequency); eeprom_update_byte((uint8_t*)ADDRESS_TB_AO_FRAMES_PER_UPPER_PART, tb_ao_frames_per_upper_part); eeprom_update_byte((uint8_t*)ADDRESS_TB_AO_ON_FLAG, tb_ao_on_flag); eeprom_update_byte((uint8_t*)ADDRESS_TB_AO_GAP, tb_ao_gap); eeprom_update_byte((uint8_t*)ADDRESS_TB_AO_POSITION_H, tb_ao_position_h); eeprom_update_byte((uint8_t*)ADDRESS_TB_AO_POSITION_V, tb_ao_position_v); eeprom_update_word((uint16_t*)ADDRESS_TB_AO_SIZE_H, tb_ao_size_h); eeprom_update_byte((uint8_t*)ADDRESS_TB_AO_SIZE_V, tb_ao_size_v); eeprom_update_byte((uint8_t*)ADDRESS_TB_DI_PERIOD, tb_di_period); eeprom_update_word((uint16_t*)ADDRESS_TB_DI_FRAMES_PER_UPPER_PART, tb_di_frames_per_upper_part); eeprom_update_byte((uint8_t*)ADDRESS_TB_DI_ON_FLAG, tb_di_on_flag); eeprom_update_byte((uint8_t*)ADDRESS_TB_DI_OFFSET, tb_di_offset); eeprom_update_byte((uint8_t*)ADDRESS_TB_DI_BREAK, tb_di_break); eeprom_update_word((uint16_t*)ADDRESS_TB_DI_POSITION_H, tb_di_position_h); eeprom_update_byte((uint8_t*)ADDRESS_TB_DI_POSITION_V, tb_di_position_v); eeprom_update_word((uint16_t*)ADDRESS_TB_DI_SIZE_H, tb_di_size_h); eeprom_update_byte((uint8_t*)ADDRESS_TB_DI_SIZE_V, tb_di_size_v); sbs_ao_frequency = DEFAULT_SBS_AO_FREQUENCY; sbs_ao_frames_per_left_part = DEFAULT_SBS_AO_FRAMES_PER_LEFT_PART; sbs_ao_on_flag = DEFAULT_SBS_AO_ON_FLAG; sbs_ao_gap = DEFAULT_SBS_AO_GAP; sbs_ao_position_h = DEFAULT_SBS_AO_POSITION_H; sbs_ao_position_v = DEFAULT_SBS_AO_POSITION_V; sbs_ao_right_edge = DEFAULT_SBS_AO_RIGHT_EDGE; sbs_ao_size_v = DEFAULT_SBS_AO_SIZE_V; sbs_di_period = DEFAULT_SBS_DI_PERIOD; sbs_di_frames_per_left_part = DEFAULT_SBS_DI_FRAMES_PER_LEFT_PART; sbs_di_on_flag = DEFAULT_SBS_DI_ON_FLAG; sbs_di_offset = DEFAULT_SBS_DI_OFFSET; sbs_di_break = DEFAULT_SBS_DI_BREAK; sbs_di_position_h = DEFAULT_SBS_DI_POSITION_H; sbs_di_position_v = DEFAULT_SBS_DI_POSITION_V; sbs_di_size_h = DEFAULT_SBS_DI_SIZE_H; sbs_di_size_v = DEFAULT_SBS_DI_SIZE_V; eeprom_update_byte((uint8_t*)ADDRESS_SBS_AO_FREQUENCY, sbs_ao_frequency); eeprom_update_byte((uint8_t*)ADDRESS_SBS_AO_FRAMES_PER_LEFT_PART, sbs_ao_frames_per_left_part); eeprom_update_byte((uint8_t*)ADDRESS_SBS_AO_ON_FLAG, sbs_ao_on_flag); eeprom_update_byte((uint8_t*)ADDRESS_SBS_AO_GAP, sbs_ao_gap); eeprom_update_byte((uint8_t*)ADDRESS_SBS_AO_POSITION_H, sbs_ao_position_h); eeprom_update_byte((uint8_t*)ADDRESS_SBS_AO_POSITION_V, sbs_ao_position_v); eeprom_update_byte((uint8_t*)ADDRESS_SBS_AO_RIGHT_EDGE, sbs_ao_right_edge); eeprom_update_word((uint16_t*)ADDRESS_SBS_AO_SIZE_V, sbs_ao_size_v); eeprom_update_byte((uint8_t*)ADDRESS_SBS_DI_PERIOD, sbs_di_period); eeprom_update_word((uint16_t*)ADDRESS_SBS_DI_FRAMES_PER_LEFT_PART, sbs_di_frames_per_left_part); eeprom_update_byte((uint8_t*)ADDRESS_SBS_DI_ON_FLAG, sbs_di_on_flag); eeprom_update_byte((uint8_t*)ADDRESS_SBS_DI_OFFSET, sbs_di_offset); eeprom_update_byte((uint8_t*)ADDRESS_SBS_DI_BREAK, sbs_di_break); eeprom_update_byte((uint8_t*)ADDRESS_SBS_DI_POSITION_H, sbs_di_position_h); eeprom_update_word((uint16_t*)ADDRESS_SBS_DI_POSITION_V, sbs_di_position_v); eeprom_update_byte((uint8_t*)ADDRESS_SBS_DI_SIZE_H, sbs_di_size_h); eeprom_update_word((uint16_t*)ADDRESS_SBS_DI_SIZE_V, sbs_di_size_v); ffr_fr_position = DEFAULT_FFR_FR_POSITION; ffr_fr_period = DEFAULT_FFR_FR_PERIOD; ffr_fr_frames_per_visible_part = DEFAULT_FFR_FR_FRAMES_PER_VISIBLE_PART; ffr_fr_on_flag = DEFAULT_FFR_FR_ON_FLAG; ffr_fr_position_h = DEFAULT_FFR_FR_POSITION_H; ffr_fr_position_v = DEFAULT_FFR_FR_POSITION_V; ffr_fr_size_h = DEFAULT_FFR_FR_SIZE_H; ffr_fr_size_v = DEFAULT_FFR_FR_SIZE_V; ffr_sr_position = DEFAULT_FFR_SR_POSITION; ffr_sr_period = DEFAULT_FFR_SR_PERIOD; ffr_sr_frames_per_visible_part = DEFAULT_FFR_SR_FRAMES_PER_VISIBLE_PART; ffr_sr_on_flag = DEFAULT_FFR_SR_ON_FLAG; ffr_sr_position_h = DEFAULT_FFR_SR_POSITION_H; ffr_sr_position_v = DEFAULT_FFR_SR_POSITION_V; ffr_sr_size_h = DEFAULT_FFR_SR_SIZE_H; ffr_sr_size_v = DEFAULT_FFR_SR_SIZE_V; eeprom_update_byte((uint8_t*)ADDRESS_FFR_FR_POSITION, ffr_fr_position); eeprom_update_byte((uint8_t*)ADDRESS_FFR_FR_PERIOD, ffr_fr_period); eeprom_update_word((uint16_t*)ADDRESS_FFR_FR_FRAMES_PER_VISIBLE_PART, ffr_fr_frames_per_visible_part); eeprom_update_byte((uint8_t*)ADDRESS_FFR_FR_ON_FLAG, ffr_fr_on_flag); eeprom_update_word((uint16_t*)ADDRESS_FFR_FR_POSITION_H, ffr_fr_position_h); eeprom_update_word((uint16_t*)ADDRESS_FFR_FR_POSITION_V, ffr_fr_position_v); eeprom_update_word((uint16_t*)ADDRESS_FFR_FR_SIZE_H, ffr_fr_size_h); eeprom_update_word((uint16_t*)ADDRESS_FFR_FR_SIZE_V, ffr_fr_size_v); eeprom_update_byte((uint8_t*)ADDRESS_FFR_SR_POSITION, ffr_sr_position); eeprom_update_byte((uint8_t*)ADDRESS_FFR_SR_PERIOD, ffr_sr_period); eeprom_update_word((uint16_t*)ADDRESS_FFR_SR_FRAMES_PER_VISIBLE_PART, ffr_sr_frames_per_visible_part); eeprom_update_byte((uint8_t*)ADDRESS_FFR_SR_ON_FLAG, ffr_sr_on_flag); eeprom_update_word((uint16_t*)ADDRESS_FFR_SR_POSITION_H, ffr_sr_position_h); eeprom_update_word((uint16_t*)ADDRESS_FFR_SR_POSITION_V, ffr_sr_position_v); eeprom_update_word((uint16_t*)ADDRESS_FFR_SR_SIZE_H, ffr_sr_size_h); eeprom_update_word((uint16_t*)ADDRESS_FFR_SR_SIZE_V, ffr_sr_size_v); frames_per_keyboard_read_target = 20; } } if( !(KEYBOARD_PORT_IN &= (1 << PAGE_KEY)) ) { // if PAGE_KEY is pressed... if(KEYBOARD_PORT_IN &= (1 << SHIFT_KEY)) { page++; if(page >= 6) page = 0; } // and SHIFT_KEY is not, change page to next one else { page--; if(page > 240) page = 5; } // if PAGE_KEY and SHIFT_KEY are both pressed, change page to previous one frames_per_keyboard_read_target = 10; // 10 frames till next keyboard read } /* Store information about other keys in keyboard_state */ if( !(KEYBOARD_PORT_IN &= (1 << SHIFT_KEY)) ) keyboard_state |= (1 << 4); else keyboard_state &= ~(1 << 4); if( !(KEYBOARD_PORT_IN &= (1 << LEFT_KEY)) ) keyboard_state |= (1 << 3); else keyboard_state &= ~(1 << 3); if( !(KEYBOARD_PORT_IN &= (1 << UP_KEY)) ) keyboard_state |= (1 << 2); else keyboard_state &= ~(1 << 2); if( !(KEYBOARD_PORT_IN &= (1 << DOWN_KEY)) ) keyboard_state |= (1 << 1); else keyboard_state &= ~(1 << 1); if( !(KEYBOARD_PORT_IN &= (1 << RIGHT_KEY)) ) keyboard_state |= (1 << 0); else keyboard_state &= ~(1 << 0); switch(page) { /* First Rectangle Settings */ case 0: switch(keyboard_state) { /* Without the SHIFT_KEY pressed. */ case 0x01: if(ffr_fr_period<=2) ffr_fr_frames_per_visible_part = ffr_fr_frames_per_visible_part + 20; else if(ffr_fr_period==3) ffr_fr_frames_per_visible_part = ffr_fr_frames_per_visible_part + 10; else if(ffr_fr_period==4) ffr_fr_frames_per_visible_part = ffr_fr_frames_per_visible_part + 2; else ffr_fr_frames_per_visible_part++; if(ffr_fr_frames_per_visible_part > ffr_fr_frames_target) ffr_fr_frames_per_visible_part = ffr_fr_frames_target; frames_per_keyboard_read_target = 10; break; case 0x02: ffr_fr_period--; if(ffr_fr_period > 240) ffr_fr_period = 0; ffr_fr_period_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x04: ffr_fr_period++; if(ffr_fr_period > MAX_FFR_FR_PERIOD) ffr_fr_period = MAX_FFR_FR_PERIOD; ffr_fr_period_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x08: if(ffr_fr_period<=2) ffr_fr_frames_per_visible_part = ffr_fr_frames_per_visible_part - 20; else if(ffr_fr_period==3) ffr_fr_frames_per_visible_part = ffr_fr_frames_per_visible_part - 10; else if(ffr_fr_period==4) ffr_fr_frames_per_visible_part = ffr_fr_frames_per_visible_part - 2; else ffr_fr_frames_per_visible_part--; if(ffr_fr_frames_per_visible_part > 65000) ffr_fr_frames_per_visible_part = 0; frames_per_keyboard_read_target = 10; break; /* With the SHIFT_KEY pressed. */ case 0x11: ffr_fr_on_flag ^= 0x01; frames_per_keyboard_read_target = 10; break; case 0x12: ffr_fr_on_flag ^= 0x01; frames_per_keyboard_read_target = 10; break; case 0x14: ffr_fr_on_flag ^= 0x01; frames_per_keyboard_read_target = 10; break; case 0x18: ffr_fr_on_flag ^= 0x01; frames_per_keyboard_read_target = 10; break; /* Restoring default settings by pressing 2, 4 or 5 buttons at the same time. */ case 0x09: ffr_fr_period_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x06: ffr_fr_period = DEFAULT_FFR_FR_PERIOD; ffr_fr_period_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x19: ffr_fr_on_flag = DEFAULT_FFR_FR_ON_FLAG; frames_per_keyboard_read_target = 10; break; case 0x16: ffr_fr_on_flag = DEFAULT_FFR_FR_ON_FLAG; frames_per_keyboard_read_target = 10; break; case 0x0f: ffr_fr_frames_per_visible_part = DEFAULT_FFR_FR_FRAMES_PER_VISIBLE_PART; ffr_fr_period = DEFAULT_FFR_FR_PERIOD; ffr_fr_on_flag = DEFAULT_FFR_FR_ON_FLAG; ffr_fr_period_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x1f: ffr_fr_position = 0; ffr_fr_frames_per_visible_part = DEFAULT_FFR_FR_FRAMES_PER_VISIBLE_PART; ffr_fr_period = DEFAULT_FFR_FR_PERIOD; ffr_fr_on_flag = DEFAULT_FFR_FR_ON_FLAG; ffr_fr_period_change_flag = 1; ffr_fr_position_h = DEFAULT_FFR_FR_POSITION_H; ffr_fr_position_v = DEFAULT_FFR_FR_POSITION_V; ffr_fr_size_h = DEFAULT_FFR_FR_SIZE_H; ffr_fr_size_v = DEFAULT_FFR_FR_SIZE_V; ffr_sr_position = 1; ffr_sr_frames_per_visible_part = DEFAULT_FFR_SR_FRAMES_PER_VISIBLE_PART; ffr_sr_period = DEFAULT_FFR_SR_PERIOD; ffr_sr_on_flag = DEFAULT_FFR_SR_ON_FLAG; ffr_sr_period_change_flag = 1; ffr_sr_position_h = DEFAULT_FFR_SR_POSITION_H; ffr_sr_position_v = DEFAULT_FFR_SR_POSITION_V; ffr_sr_size_h = DEFAULT_FFR_SR_SIZE_H; ffr_sr_size_v = DEFAULT_FFR_SR_SIZE_V; page = 0; frames_per_keyboard_read_target = 20; break; } break; /* First Rectangle Position */ case 1: switch(keyboard_state) { /* Without the SHIFT_KEY pressed. */ case 0x01: ffr_fr_position_h++; frames_per_keyboard_read_target = 10; break; case 0x02: ffr_fr_position_v++; if( ((ffr_fr_position_v + ffr_fr_size_v) > ffr_sr_position_v) && (ffr_fr_position == 0) ) { ffr_fr_position_v--; ffr_fr_position_v = ffr_fr_position_v + ffr_sr_size_v; ffr_fr_position = 1; ffr_sr_position_v = ffr_sr_position_v - ffr_fr_size_v; ffr_sr_position = 0; } frames_per_keyboard_read_target = 10; break; case 0x04: ffr_fr_position_v--; if(ffr_fr_position_v > 65000) ffr_fr_position_v = 0; if( ((ffr_sr_position_v + ffr_sr_size_v) > ffr_fr_position_v) && (ffr_fr_position == 1) ) { ffr_fr_position_v++; ffr_fr_position_v = ffr_fr_position_v - ffr_sr_size_v; ffr_fr_position = 0; ffr_sr_position_v = ffr_sr_position_v + ffr_fr_size_v; ffr_sr_position = 1; } frames_per_keyboard_read_target = 10; break; case 0x08: ffr_fr_position_h--; if(ffr_fr_position_h < MIN_FFR_FR_POSITION_H) ffr_fr_position_h = MIN_FFR_FR_POSITION_H; frames_per_keyboard_read_target = 10; break; /* With the SHIFT_KEY pressed. */ case 0x11: ffr_fr_position_h = ffr_fr_position_h + 10; frames_per_keyboard_read_target = 10; break; case 0x12: ffr_fr_position_v = ffr_fr_position_v + 10; if( ((ffr_fr_position_v + ffr_fr_size_v) > ffr_sr_position_v) && (ffr_fr_position == 0) ) { ffr_fr_position_v = ffr_sr_position_v - ffr_fr_size_v; ffr_fr_position_v = ffr_fr_position_v + ffr_sr_size_v; ffr_fr_position = 1; ffr_sr_position_v = ffr_sr_position_v - ffr_fr_size_v; ffr_sr_position = 0; } frames_per_keyboard_read_target = 10; break; case 0x14: ffr_fr_position_v = ffr_fr_position_v - 10; if(ffr_fr_position_v > 65000) ffr_fr_position_v = 0; if( ((ffr_sr_position_v + ffr_sr_size_v) > ffr_fr_position_v) && (ffr_fr_position == 1) ) { ffr_fr_position_v = ffr_sr_position_v + ffr_sr_size_v; ffr_fr_position_v = ffr_fr_position_v - ffr_sr_size_v; ffr_fr_position = 0; ffr_sr_position_v = ffr_sr_position_v + ffr_fr_size_v; ffr_sr_position = 1; } frames_per_keyboard_read_target = 10; break; case 0x18: ffr_fr_position_h = ffr_fr_position_h - 10; if( (ffr_fr_position_h < MIN_FFR_FR_POSITION_H) || (ffr_fr_position_h > 65000) ) ffr_fr_position_h = MIN_FFR_FR_POSITION_H; frames_per_keyboard_read_target = 10; break; /* Restoring default settings by pressing 2, 4 or 5 buttons at the same time. */ case 0x09: ffr_fr_position_h = DEFAULT_FFR_FR_POSITION_H; frames_per_keyboard_read_target = 10; break; case 0x06: ffr_fr_position_v = DEFAULT_FFR_FR_POSITION_V; ffr_fr_v_values_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x19: ffr_fr_position_h = DEFAULT_FFR_FR_POSITION_H; frames_per_keyboard_read_target = 10; break; case 0x16: ffr_fr_position_v = DEFAULT_FFR_FR_POSITION_V; ffr_fr_v_values_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x0f: ffr_fr_position_h = DEFAULT_FFR_FR_POSITION_H; ffr_fr_position_v = DEFAULT_FFR_FR_POSITION_V; ffr_fr_v_values_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x1f: ffr_fr_position = 0; ffr_fr_frames_per_visible_part = DEFAULT_FFR_FR_FRAMES_PER_VISIBLE_PART; ffr_fr_period = DEFAULT_FFR_FR_PERIOD; ffr_fr_on_flag = DEFAULT_FFR_FR_ON_FLAG; ffr_fr_period_change_flag = 1; ffr_fr_position_h = DEFAULT_FFR_FR_POSITION_H; ffr_fr_position_v = DEFAULT_FFR_FR_POSITION_V; ffr_fr_size_h = DEFAULT_FFR_FR_SIZE_H; ffr_fr_size_v = DEFAULT_FFR_FR_SIZE_V; ffr_sr_position = 1; ffr_sr_frames_per_visible_part = DEFAULT_FFR_SR_FRAMES_PER_VISIBLE_PART; ffr_sr_period = DEFAULT_FFR_SR_PERIOD; ffr_sr_on_flag = DEFAULT_FFR_SR_ON_FLAG; ffr_sr_period_change_flag = 1; ffr_sr_position_h = DEFAULT_FFR_SR_POSITION_H; ffr_sr_position_v = DEFAULT_FFR_SR_POSITION_V; ffr_sr_size_h = DEFAULT_FFR_SR_SIZE_H; ffr_sr_size_v = DEFAULT_FFR_SR_SIZE_V; page = 0; frames_per_keyboard_read_target = 20; break; } break; /* First Rectangle Size */ case 2: switch(keyboard_state) { /* Without the SHIFT_KEY pressed. */ case 0x01: ffr_fr_size_h++; if( ffr_fr_size_h > MAX_FFR_FR_SIZE_H ) ffr_fr_size_h--; frames_per_keyboard_read_target = 10; break; case 0x02: ffr_fr_size_v++; if( ffr_fr_size_v > MAX_FFR_FR_SIZE_V ) ffr_fr_size_v--; if( ((ffr_fr_position_v + ffr_fr_size_v) > ffr_sr_position_v) && (ffr_fr_position == 0) ) ffr_fr_size_v--; frames_per_keyboard_read_target = 10; break; case 0x04: ffr_fr_size_v--; if(ffr_fr_size_v < MIN_FFR_FR_SIZE_V) ffr_fr_size_v++; frames_per_keyboard_read_target = 10; break; case 0x08: ffr_fr_size_h--; if(ffr_fr_size_h < MIN_FFR_FR_SIZE_H) ffr_fr_size_h = MIN_FFR_FR_SIZE_H; frames_per_keyboard_read_target = 10; break; /* With the SHIFT_KEY pressed. */ case 0x11: ffr_fr_size_h = ffr_fr_size_h + 10; if( ffr_fr_size_h > MAX_FFR_FR_SIZE_H ) ffr_fr_size_h = MAX_FFR_FR_SIZE_H; frames_per_keyboard_read_target = 10; break; case 0x12: ffr_fr_size_v = ffr_fr_size_v + 10; if( ffr_fr_size_v > MAX_FFR_FR_SIZE_V ) ffr_fr_size_v = MAX_FFR_FR_SIZE_V; if( ((ffr_fr_position_v + ffr_fr_size_v) > ffr_sr_position_v) && (ffr_fr_position == 0) ) ffr_fr_size_v = ffr_sr_position_v - ffr_fr_position_v; frames_per_keyboard_read_target = 10; break; case 0x14: ffr_fr_size_v = ffr_fr_size_v - 10; if(ffr_fr_size_v < MIN_FFR_FR_SIZE_V) ffr_fr_size_v = MIN_FFR_FR_SIZE_V; frames_per_keyboard_read_target = 10; break; case 0x18: ffr_fr_size_h = ffr_fr_size_h - 10; if(ffr_fr_size_h < MIN_FFR_FR_SIZE_H) ffr_fr_size_h = MIN_FFR_FR_SIZE_H; frames_per_keyboard_read_target = 10; break; /* Restoring default settings by pressing 2, 4 or 5 buttons at the same time. */ case 0x09: ffr_fr_size_h = DEFAULT_FFR_FR_SIZE_H; frames_per_keyboard_read_target = 10; break; case 0x06: ffr_fr_size_v = DEFAULT_FFR_FR_SIZE_V; ffr_fr_v_values_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x19: ffr_fr_size_h = DEFAULT_FFR_FR_SIZE_H; frames_per_keyboard_read_target = 10; break; case 0x16: ffr_fr_size_v = DEFAULT_FFR_FR_SIZE_V; ffr_fr_v_values_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x0f: ffr_fr_size_h = DEFAULT_FFR_FR_SIZE_H; ffr_fr_size_v = DEFAULT_FFR_FR_SIZE_V; ffr_fr_v_values_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x1f: ffr_fr_position = 0; ffr_fr_frames_per_visible_part = DEFAULT_FFR_FR_FRAMES_PER_VISIBLE_PART; ffr_fr_period = DEFAULT_FFR_FR_PERIOD; ffr_fr_on_flag = DEFAULT_FFR_FR_ON_FLAG; ffr_fr_period_change_flag = 1; ffr_fr_position_h = DEFAULT_FFR_FR_POSITION_H; ffr_fr_position_v = DEFAULT_FFR_FR_POSITION_V; ffr_fr_size_h = DEFAULT_FFR_FR_SIZE_H; ffr_fr_size_v = DEFAULT_FFR_FR_SIZE_V; ffr_sr_position = 1; ffr_sr_frames_per_visible_part = DEFAULT_FFR_SR_FRAMES_PER_VISIBLE_PART; ffr_sr_period = DEFAULT_FFR_SR_PERIOD; ffr_sr_on_flag = DEFAULT_FFR_SR_ON_FLAG; ffr_sr_period_change_flag = 1; ffr_sr_position_h = DEFAULT_FFR_SR_POSITION_H; ffr_sr_position_v = DEFAULT_FFR_SR_POSITION_V; ffr_sr_size_h = DEFAULT_FFR_SR_SIZE_H; ffr_sr_size_v = DEFAULT_FFR_SR_SIZE_V; page = 0; frames_per_keyboard_read_target = 20; break; } break; /* Second Rectangle Settings */ case 3: switch(keyboard_state) { /* Without the SHIFT_KEY pressed. */ case 0x01: if(ffr_sr_period<=2) ffr_sr_frames_per_visible_part = ffr_sr_frames_per_visible_part + 20; else if(ffr_sr_period==3) ffr_sr_frames_per_visible_part = ffr_sr_frames_per_visible_part + 10; else if(ffr_sr_period==4) ffr_sr_frames_per_visible_part = ffr_sr_frames_per_visible_part + 2; else ffr_sr_frames_per_visible_part++; if(ffr_sr_frames_per_visible_part > ffr_sr_frames_target) ffr_sr_frames_per_visible_part = ffr_sr_frames_target; frames_per_keyboard_read_target = 10; break; case 0x02: ffr_sr_period--; if(ffr_sr_period > 240) ffr_sr_period = 0; ffr_sr_period_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x04: ffr_sr_period++; if(ffr_sr_period > MAX_FFR_SR_PERIOD) ffr_sr_period = MAX_FFR_SR_PERIOD; ffr_sr_period_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x08: if(ffr_sr_period<=2) ffr_sr_frames_per_visible_part = ffr_sr_frames_per_visible_part - 20; else if(ffr_sr_period==3) ffr_sr_frames_per_visible_part = ffr_sr_frames_per_visible_part - 10; else if(ffr_sr_period==4) ffr_sr_frames_per_visible_part = ffr_sr_frames_per_visible_part - 2; else ffr_sr_frames_per_visible_part--; if(ffr_sr_frames_per_visible_part > 65000) ffr_sr_frames_per_visible_part = 0; frames_per_keyboard_read_target = 10; break; /* With the SHIFT_KEY pressed. */ case 0x11: ffr_sr_on_flag ^= 0x01; frames_per_keyboard_read_target = 10; break; case 0x12: ffr_sr_on_flag ^= 0x01; frames_per_keyboard_read_target = 10; break; case 0x14: ffr_sr_on_flag ^= 0x01; frames_per_keyboard_read_target = 10; break; case 0x18: ffr_sr_on_flag ^= 0x01; frames_per_keyboard_read_target = 10; break; /* Restoring default settings by pressing 2, 4 or 5 buttons at the same time. */ case 0x09: ffr_sr_period_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x06: ffr_sr_period = DEFAULT_FFR_SR_PERIOD; ffr_sr_period_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x19: ffr_sr_on_flag = DEFAULT_FFR_SR_ON_FLAG; frames_per_keyboard_read_target = 10; break; case 0x16: ffr_sr_on_flag = DEFAULT_FFR_SR_ON_FLAG; frames_per_keyboard_read_target = 10; break; case 0x0f: ffr_sr_frames_per_visible_part = DEFAULT_FFR_SR_FRAMES_PER_VISIBLE_PART; ffr_sr_period = DEFAULT_FFR_SR_PERIOD; ffr_sr_on_flag = DEFAULT_FFR_SR_ON_FLAG; ffr_sr_period_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x1f: ffr_fr_position = 0; ffr_fr_frames_per_visible_part = DEFAULT_FFR_FR_FRAMES_PER_VISIBLE_PART; ffr_fr_period = DEFAULT_FFR_FR_PERIOD; ffr_fr_on_flag = DEFAULT_FFR_FR_ON_FLAG; ffr_fr_period_change_flag = 1; ffr_fr_position_h = DEFAULT_FFR_FR_POSITION_H; ffr_fr_position_v = DEFAULT_FFR_FR_POSITION_V; ffr_fr_size_h = DEFAULT_FFR_FR_SIZE_H; ffr_fr_size_v = DEFAULT_FFR_FR_SIZE_V; ffr_sr_position = 1; ffr_sr_frames_per_visible_part = DEFAULT_FFR_SR_FRAMES_PER_VISIBLE_PART; ffr_sr_period = DEFAULT_FFR_SR_PERIOD; ffr_sr_on_flag = DEFAULT_FFR_SR_ON_FLAG; ffr_sr_period_change_flag = 1; ffr_sr_position_h = DEFAULT_FFR_SR_POSITION_H; ffr_sr_position_v = DEFAULT_FFR_SR_POSITION_V; ffr_sr_size_h = DEFAULT_FFR_SR_SIZE_H; ffr_sr_size_v = DEFAULT_FFR_SR_SIZE_V; page = 0; frames_per_keyboard_read_target = 20; break; } break; /* Second Rectangle Position */ case 4: switch(keyboard_state) { /* Without the SHIFT_KEY pressed. */ case 0x01: ffr_sr_position_h++; frames_per_keyboard_read_target = 10; break; case 0x02: ffr_sr_position_v++; if( ((ffr_sr_position_v + ffr_sr_size_v) > ffr_fr_position_v) && (ffr_sr_position == 0) ) { ffr_sr_position_v--; ffr_sr_position_v = ffr_sr_position_v + ffr_fr_size_v; ffr_sr_position = 1; ffr_fr_position_v = ffr_fr_position_v - ffr_sr_size_v; ffr_fr_position = 0; } frames_per_keyboard_read_target = 10; break; case 0x04: ffr_sr_position_v--; if(ffr_sr_position_v > 65000) ffr_sr_position_v = 0; if( ((ffr_fr_position_v + ffr_fr_size_v) > ffr_sr_position_v) && (ffr_sr_position == 1) ) { ffr_sr_position_v++; ffr_sr_position_v = ffr_sr_position_v - ffr_fr_size_v; ffr_sr_position = 0; ffr_fr_position_v = ffr_fr_position_v + ffr_sr_size_v; ffr_fr_position = 1; } frames_per_keyboard_read_target = 10; break; case 0x08: ffr_sr_position_h--; if(ffr_sr_position_h < MIN_FFR_SR_POSITION_H) ffr_sr_position_h = MIN_FFR_SR_POSITION_H; frames_per_keyboard_read_target = 10; break; /* With the SHIFT_KEY pressed. */ case 0x11: ffr_sr_position_h = ffr_sr_position_h + 10; frames_per_keyboard_read_target = 10; break; case 0x12: ffr_sr_position_v = ffr_sr_position_v + 10; if( ((ffr_sr_position_v + ffr_sr_size_v) > ffr_fr_position_v) && (ffr_sr_position == 0) ) { ffr_sr_position_v = ffr_fr_position_v - ffr_sr_size_v; ffr_sr_position_v = ffr_sr_position_v + ffr_fr_size_v; ffr_sr_position = 1; ffr_fr_position_v = ffr_fr_position_v - ffr_sr_size_v; ffr_fr_position = 0; } frames_per_keyboard_read_target = 10; break; case 0x14: ffr_sr_position_v = ffr_sr_position_v - 10; if(ffr_sr_position_v > 65000) ffr_sr_position_v = 0; if( ((ffr_fr_position_v + ffr_fr_size_v) > ffr_sr_position_v) && (ffr_sr_position == 1) ) { ffr_sr_position_v = ffr_fr_position_v + ffr_fr_size_v; ffr_sr_position_v = ffr_sr_position_v - ffr_fr_size_v; ffr_sr_position = 0; ffr_fr_position_v = ffr_fr_position_v + ffr_sr_size_v; ffr_fr_position = 1; } frames_per_keyboard_read_target = 10; break; case 0x18: ffr_sr_position_h = ffr_sr_position_h - 10; if( (ffr_sr_position_h < MIN_FFR_SR_POSITION_H) || (ffr_sr_position_h > 65000) ) ffr_sr_position_h = MIN_FFR_SR_POSITION_H; frames_per_keyboard_read_target = 10; break; /* Restoring default settings by pressing 2, 4 or 5 buttons at the same time. */ case 0x09: ffr_sr_position_h = DEFAULT_FFR_SR_POSITION_H; frames_per_keyboard_read_target = 10; break; case 0x06: ffr_sr_position_v = DEFAULT_FFR_SR_POSITION_V; ffr_sr_v_values_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x19: ffr_sr_position_h = DEFAULT_FFR_SR_POSITION_H; frames_per_keyboard_read_target = 10; break; case 0x16: ffr_sr_position_v = DEFAULT_FFR_SR_POSITION_V; ffr_sr_v_values_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x0f: ffr_sr_position_h = DEFAULT_FFR_SR_POSITION_H; ffr_sr_position_v = DEFAULT_FFR_SR_POSITION_V; ffr_sr_v_values_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x1f: ffr_fr_position = 0; ffr_fr_frames_per_visible_part = DEFAULT_FFR_FR_FRAMES_PER_VISIBLE_PART; ffr_fr_period = DEFAULT_FFR_FR_PERIOD; ffr_fr_on_flag = DEFAULT_FFR_FR_ON_FLAG; ffr_fr_period_change_flag = 1; ffr_fr_position_h = DEFAULT_FFR_FR_POSITION_H; ffr_fr_position_v = DEFAULT_FFR_FR_POSITION_V; ffr_fr_size_h = DEFAULT_FFR_FR_SIZE_H; ffr_fr_size_v = DEFAULT_FFR_FR_SIZE_V; ffr_sr_position = 1; ffr_sr_frames_per_visible_part = DEFAULT_FFR_SR_FRAMES_PER_VISIBLE_PART; ffr_sr_period = DEFAULT_FFR_SR_PERIOD; ffr_sr_on_flag = DEFAULT_FFR_SR_ON_FLAG; ffr_sr_period_change_flag = 1; ffr_sr_position_h = DEFAULT_FFR_SR_POSITION_H; ffr_sr_position_v = DEFAULT_FFR_SR_POSITION_V; ffr_sr_size_h = DEFAULT_FFR_SR_SIZE_H; ffr_sr_size_v = DEFAULT_FFR_SR_SIZE_V; page = 0; frames_per_keyboard_read_target = 20; break; } break; /* Second Rectangle Size */ case 5: switch(keyboard_state) { /* Without the SHIFT_KEY pressed. */ case 0x01: ffr_sr_size_h++; if( ffr_sr_size_h > MAX_FFR_SR_SIZE_H ) ffr_sr_size_h--; frames_per_keyboard_read_target = 10; break; case 0x02: ffr_sr_size_v++; if( ffr_sr_size_v > MAX_FFR_SR_SIZE_V ) ffr_sr_size_v--; if( ((ffr_sr_position_v + ffr_sr_size_v) > ffr_fr_position_v) && (ffr_sr_position == 0) ) ffr_sr_size_v--; frames_per_keyboard_read_target = 10; break; case 0x04: ffr_sr_size_v--; if(ffr_sr_size_v < MIN_FFR_SR_SIZE_V) ffr_sr_size_v++; frames_per_keyboard_read_target = 10; break; case 0x08: ffr_sr_size_h--; if(ffr_sr_size_h < MIN_FFR_SR_SIZE_H) ffr_sr_size_h = MIN_FFR_SR_SIZE_H; frames_per_keyboard_read_target = 10; break; /* With the SHIFT_KEY pressed. */ case 0x11: ffr_sr_size_h = ffr_sr_size_h + 10; if( ffr_sr_size_h > MAX_FFR_SR_SIZE_H ) ffr_sr_size_h = MAX_FFR_SR_SIZE_H; frames_per_keyboard_read_target = 10; break; case 0x12: ffr_sr_size_v = ffr_sr_size_v + 10; if( ffr_sr_size_v > MAX_FFR_SR_SIZE_V ) ffr_sr_size_v = MAX_FFR_SR_SIZE_V; if( ((ffr_sr_position_v + ffr_sr_size_v) > ffr_fr_position_v) && (ffr_sr_position == 0) ) ffr_sr_size_v = ffr_fr_position_v - ffr_sr_position_v; frames_per_keyboard_read_target = 10; break; case 0x14: ffr_sr_size_v = ffr_sr_size_v - 10; if(ffr_sr_size_v < MIN_FFR_SR_SIZE_V) ffr_sr_size_v = MIN_FFR_SR_SIZE_V; frames_per_keyboard_read_target = 10; break; case 0x18: ffr_sr_size_h = ffr_sr_size_h - 10; if(ffr_sr_size_h < MIN_FFR_SR_SIZE_H) ffr_sr_size_h = MIN_FFR_SR_SIZE_H; frames_per_keyboard_read_target = 10; break; /* Restoring default settings by pressing 2, 4 or 5 buttons at the same time. */ case 0x09: ffr_sr_size_h = DEFAULT_FFR_SR_SIZE_H; frames_per_keyboard_read_target = 10; break; case 0x06: ffr_sr_size_v = DEFAULT_FFR_SR_SIZE_V; ffr_sr_v_values_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x19: ffr_sr_size_h = DEFAULT_FFR_SR_SIZE_H; frames_per_keyboard_read_target = 10; break; case 0x16: ffr_sr_size_v = DEFAULT_FFR_SR_SIZE_V; ffr_sr_v_values_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x0f: ffr_sr_size_h = DEFAULT_FFR_SR_SIZE_H; ffr_sr_size_v = DEFAULT_FFR_SR_SIZE_V; ffr_sr_v_values_change_flag = 1; frames_per_keyboard_read_target = 10; break; case 0x1f: ffr_fr_position = 0; ffr_fr_frames_per_visible_part = DEFAULT_FFR_FR_FRAMES_PER_VISIBLE_PART; ffr_fr_period = DEFAULT_FFR_FR_PERIOD; ffr_fr_on_flag = DEFAULT_FFR_FR_ON_FLAG; ffr_fr_period_change_flag = 1; ffr_fr_position_h = DEFAULT_FFR_FR_POSITION_H; ffr_fr_position_v = DEFAULT_FFR_FR_POSITION_V; ffr_fr_size_h = DEFAULT_FFR_FR_SIZE_H; ffr_fr_size_v = DEFAULT_FFR_FR_SIZE_V; ffr_sr_position = 1; ffr_sr_frames_per_visible_part = DEFAULT_FFR_SR_FRAMES_PER_VISIBLE_PART; ffr_sr_period = DEFAULT_FFR_SR_PERIOD; ffr_sr_on_flag = DEFAULT_FFR_SR_ON_FLAG; ffr_sr_period_change_flag = 1; ffr_sr_position_h = DEFAULT_FFR_SR_POSITION_H; ffr_sr_position_v = DEFAULT_FFR_SR_POSITION_V; ffr_sr_size_h = DEFAULT_FFR_SR_SIZE_H; ffr_sr_size_v = DEFAULT_FFR_SR_SIZE_V; page = 0; frames_per_keyboard_read_target = 20; break; } break; } /* When instant change of vertical values occurs during restoration of default settings, make sure that rectangles don't occupy the same lines. */ if(ffr_fr_v_values_change_flag) { if( (ffr_sr_position_v + ffr_sr_size_v) < ffr_fr_position_v ) { ffr_fr_position = 1; ffr_sr_position = 0; } else if( ffr_sr_position_v < ffr_fr_position_v ) { if( (ffr_sr_position_v + ffr_sr_size_v) < (ffr_fr_position_v + ffr_fr_size_v) ) { ffr_fr_position = 1; ffr_sr_position = 0; ffr_sr_size_v = MIN_FFR_SR_SIZE_V; ffr_sr_position_v = ffr_fr_position_v - ffr_sr_size_v; } else { ffr_fr_position = 0; ffr_sr_position = 1; ffr_sr_size_v = MIN_FFR_SR_SIZE_V; ffr_sr_position_v = ffr_fr_position_v + ffr_fr_size_v; } } else if( ffr_sr_position_v < (ffr_fr_position_v + ffr_fr_size_v) ) { if( (ffr_sr_position_v + ffr_sr_size_v) < (ffr_fr_position_v + ffr_fr_size_v) ) { ffr_fr_position = 0; ffr_sr_position = 1; ffr_sr_size_v = MIN_FFR_SR_SIZE_V; ffr_sr_position_v = ffr_fr_position_v + ffr_fr_size_v; } else { ffr_fr_position = 0; ffr_sr_position = 1; ffr_sr_size_v = MIN_FFR_SR_SIZE_V; ffr_sr_position_v = ffr_fr_position_v + ffr_fr_size_v; } } else { ffr_fr_position = 0; ffr_sr_position = 1; } ffr_fr_v_values_change_flag = 0; } if(ffr_sr_v_values_change_flag) { if( (ffr_fr_position_v + ffr_fr_size_v) < ffr_sr_position_v ) { ffr_fr_position = 0; ffr_sr_position = 1; } else if( ffr_fr_position_v < ffr_sr_position_v ) { if( (ffr_fr_position_v + ffr_fr_size_v) < (ffr_sr_position_v + ffr_sr_size_v) ) { ffr_fr_position = 0; ffr_sr_position = 1; ffr_fr_size_v = MIN_FFR_FR_SIZE_V; ffr_fr_position_v = ffr_sr_position_v - ffr_fr_size_v; } else { ffr_fr_position = 0; ffr_sr_position = 1; ffr_fr_size_v = MIN_FFR_FR_SIZE_V; ffr_fr_position_v = ffr_sr_position_v - ffr_fr_size_v; } } else if( ffr_sr_position_v < (ffr_fr_position_v + ffr_fr_size_v) ) { if( (ffr_sr_position_v + ffr_sr_size_v) < (ffr_fr_position_v + ffr_fr_size_v) ) { ffr_fr_position = 0; ffr_sr_position = 1; ffr_fr_size_v = MIN_FFR_FR_SIZE_V; ffr_fr_position_v = ffr_sr_position_v - ffr_fr_size_v; } else { ffr_fr_position = 1; ffr_sr_position = 0; ffr_fr_size_v = MIN_FFR_FR_SIZE_V; ffr_fr_position_v = ffr_sr_position_v + ffr_sr_size_v; } } else { ffr_fr_position = 1; ffr_sr_position = 0; } ffr_sr_v_values_change_flag = 0; } /* Make sure that maximum number of lines is not exceeded and that rectangles don't occupy the same lines.. */ if(ffr_sr_position) { if( (ffr_sr_position_v + ffr_sr_size_v) > MAX_FFR_SR_POSITION_V ) { ffr_sr_size_v = MAX_FFR_SR_POSITION_V - ffr_sr_position_v; if( (ffr_sr_size_v > 65000) || (ffr_sr_size_v < MIN_FFR_SR_SIZE_V) ) { ffr_sr_size_v = MIN_FFR_SR_SIZE_V; if( (ffr_sr_position_v + ffr_sr_size_v) > MAX_FFR_SR_POSITION_V ) ffr_sr_position_v = MAX_FFR_SR_POSITION_V - MIN_FFR_SR_SIZE_V; } if( (ffr_fr_position_v + ffr_fr_size_v) > ffr_sr_position_v ) { ffr_fr_position_v = ffr_sr_position_v - ffr_fr_size_v; if(ffr_fr_position_v > 65000) { ffr_fr_position_v = MIN_FFR_FR_POSITION_V; ffr_fr_size_v = ffr_sr_position_v; } } } } else { if( (ffr_fr_position_v + ffr_fr_size_v) > MAX_FFR_FR_POSITION_V ) { ffr_fr_size_v = MAX_FFR_FR_POSITION_V - ffr_fr_position_v; if( (ffr_fr_size_v > 65000) || (ffr_fr_size_v < MIN_FFR_FR_SIZE_V) ) { ffr_fr_size_v = MIN_FFR_FR_SIZE_V; if( (ffr_fr_position_v + ffr_fr_size_v) > MAX_FFR_FR_POSITION_V ) ffr_fr_position_v = MAX_FFR_FR_POSITION_V - MIN_FFR_FR_SIZE_V; } if( (ffr_sr_position_v + ffr_sr_size_v) > ffr_fr_position_v ) { ffr_sr_position_v = ffr_fr_position_v - ffr_sr_size_v; if(ffr_sr_position_v > 65000) { ffr_sr_position_v = MIN_FFR_SR_POSITION_V; ffr_sr_size_v = ffr_fr_position_v; } } } } /* Make sure that right edge of each rectangle doesn't move farther to the right than MAX_FFR_SR_POSITION_H */ if( (ffr_fr_position_h + ffr_fr_size_h) > MAX_FFR_FR_POSITION_H ) ffr_fr_position_h = MAX_FFR_FR_POSITION_H - ffr_fr_size_h; if( (ffr_sr_position_h + ffr_sr_size_h) > MAX_FFR_SR_POSITION_H ) ffr_sr_position_h = MAX_FFR_SR_POSITION_H - ffr_sr_size_h; switch(ffr_fr_period) { case 0: ffr_fr_frames_target=280; break; // 4.67s case 1: ffr_fr_frames_target=120; break; // 2s case 2: ffr_fr_frames_target=80; break; // 1.33s case 3: ffr_fr_frames_target=40; break; // 0.67s case 4: ffr_fr_frames_target=24; break; // 2.5 Hz case 5: ffr_fr_frames_target=12; break; // 5 Hz case 6: ffr_fr_frames_target=8; break; // 7.5 Hz case 7: ffr_fr_frames_target=6; break; // 10 Hz case 8: ffr_fr_frames_target=5; break; // 12 Hz case 9: ffr_fr_frames_target=4; break; // 15 Hz } if(ffr_fr_period_change_flag==1) { switch(ffr_fr_period) { case 0: ffr_fr_frames_per_visible_part=140; break; case 1: ffr_fr_frames_per_visible_part=60; break; case 2: ffr_fr_frames_per_visible_part=40; break; case 3: ffr_fr_frames_per_visible_part=20; break; case 4: ffr_fr_frames_per_visible_part=12; break; case 5: ffr_fr_frames_per_visible_part=6; break; case 6: ffr_fr_frames_per_visible_part=4; break; case 7: ffr_fr_frames_per_visible_part=3; break; case 8: ffr_fr_frames_per_visible_part=3; break; case 9: ffr_fr_frames_per_visible_part=2; break; } ffr_fr_period_change_flag = 0; } switch(ffr_sr_period) { case 0: ffr_sr_frames_target=280; break; // 4.67s case 1: ffr_sr_frames_target=120; break; // 2s case 2: ffr_sr_frames_target=80; break; // 1.33s case 3: ffr_sr_frames_target=40; break; // 0.67s case 4: ffr_sr_frames_target=24; break; // 2.5 Hz case 5: ffr_sr_frames_target=12; break; // 5 Hz case 6: ffr_sr_frames_target=8; break; // 7.5 Hz case 7: ffr_sr_frames_target=6; break; // 10 Hz case 8: ffr_sr_frames_target=5; break; // 12 Hz case 9: ffr_sr_frames_target=4; break; // 15 Hz } if(ffr_sr_period_change_flag==1) { switch(ffr_sr_period) { case 0: ffr_sr_frames_per_visible_part=140; break; case 1: ffr_sr_frames_per_visible_part=60; break; case 2: ffr_sr_frames_per_visible_part=40; break; case 3: ffr_sr_frames_per_visible_part=20; break; case 4: ffr_sr_frames_per_visible_part=12; break; case 5: ffr_sr_frames_per_visible_part=6; break; case 6: ffr_sr_frames_per_visible_part=4; break; case 7: ffr_sr_frames_per_visible_part=3; break; case 8: ffr_sr_frames_per_visible_part=3; break; case 9: ffr_sr_frames_per_visible_part=2; break; } ffr_sr_period_change_flag = 0; } } frames_per_keyboard_read++; /* --- Timing and Rendering --- */ /* Determine when first rectangle should appear. */ ffr_fr_frames_count++; if(ffr_fr_frames_count >= ffr_fr_frames_target) ffr_fr_frames_count = 0; if(ffr_fr_frames_count < ffr_fr_frames_per_visible_part) ffr_fr_visible = 1; else ffr_fr_visible = 0; /* Determine when second rectangle should appear. */ ffr_sr_frames_count++; if(ffr_sr_frames_count >= ffr_sr_frames_target) ffr_sr_frames_count = 0; if(ffr_sr_frames_count < ffr_sr_frames_per_visible_part) ffr_sr_visible = 1; else ffr_sr_visible = 0; /* Calculate where edges of first rectangle are. Use top-bottom alternately occluding rectangle variables to store it. */ tb_ao_left_edge = ffr_fr_position_h; tb_ao_right_edge = ffr_fr_position_h + ffr_fr_size_h; /* Calculate where edges of second rectangle are. Use top-bottom dihoptic rectangle variables to store it. */ tb_di_left_edge = ffr_sr_position_h; tb_di_right_edge = ffr_sr_position_h + ffr_sr_size_h; /* Calculate number of lines that separate two rectangles. */ if(ffr_fr_position) ffr_gap = ffr_fr_position_v - ( ffr_sr_position_v + ffr_sr_size_v); else ffr_gap = ffr_sr_position_v - ( ffr_fr_position_v + ffr_fr_size_v); /* Combine information about rectangles being on an visible. */ ffr_fr_visible &= ffr_fr_on_flag; ffr_sr_visible &= ffr_sr_on_flag; /* Determine order in with rectangles will be displayed, while taking into account that some rectangles may not be visible or they may be turned off. */ ffr_objects = ( ffr_sr_visible << 5 ) | ( ffr_fr_visible << 4 ) | ffr_fr_position; switch(ffr_objects) { case 0x00: ffr_objects_order = 0x00; break; // EMPTY case 0x01: ffr_objects_order = 0x00; break; // EMPTY case 0x10: ffr_objects_order = 0x11; break; // FR case 0x11: ffr_objects_order = 0x11; break; // FR case 0x20: ffr_objects_order = 0x22; break; // SR case 0x21: ffr_objects_order = 0x22; break; // SR case 0x30: ffr_objects_order = 0x12; break; // FR, SR case 0x31: ffr_objects_order = 0x21; break; // SR, FR } /* Determine every rendered line content (which rectangle it contains). */ switch(ffr_objects_order) { case 0x11: for(j = 0; j < ffr_fr_position_v; j++) rendered_line[line_count++] = 0; for(j = 0; j < ffr_fr_size_v; j++) rendered_line[line_count++] = 1; break; case 0x22: for(j = 0; j < ffr_sr_position_v; j++) rendered_line[line_count++] = 0; for(j = 0; j < ffr_sr_size_v; j++) rendered_line[line_count++] = 2; break; case 0x12: for(j = 0; j < ffr_fr_position_v; j++) rendered_line[line_count++] = 0; for(j = 0; j < ffr_fr_size_v; j++) rendered_line[line_count++] = 1; for(j = 0; j < ffr_gap; j++) rendered_line[line_count++] = 0; for(j = 0; j < ffr_sr_size_v; j++) rendered_line[line_count++] = 2; break; case 0x21: for(j = 0; j < ffr_sr_position_v; j++) rendered_line[line_count++] = 0; for(j = 0; j < ffr_sr_size_v; j++) rendered_line[line_count++] = 2; for(j = 0; j < ffr_gap; j++) rendered_line[line_count++] = 0; for(j = 0; j < ffr_fr_size_v; j++) rendered_line[line_count++] = 1; break; } break; } /* Fill rest of the lines witch 0's. */ while(line_count <= 274) rendered_line[line_count++] = 0; /* Reset count of line that is currently being worked on. */ line_count = 0; line_pair = 0; /* Wait for there to be 600 frames of no button being pressed, then save setting to EEPROM. */ if(frames_per_keyboard_read_target >= 10) frames_to_settings_save = 0; else frames_to_settings_save++; if(frames_to_settings_save >= 600) { eeprom_update_byte((uint8_t*)ADDRESS_TB_AO_FREQUENCY, tb_ao_frequency); eeprom_update_byte((uint8_t*)ADDRESS_TB_AO_FRAMES_PER_UPPER_PART, tb_ao_frames_per_upper_part); eeprom_update_byte((uint8_t*)ADDRESS_TB_AO_ON_FLAG, tb_ao_on_flag); eeprom_update_byte((uint8_t*)ADDRESS_TB_AO_GAP, tb_ao_gap); eeprom_update_byte((uint8_t*)ADDRESS_TB_AO_POSITION_H, tb_ao_position_h); eeprom_update_byte((uint8_t*)ADDRESS_TB_AO_POSITION_V, tb_ao_position_v); eeprom_update_word((uint16_t*)ADDRESS_TB_AO_SIZE_H, tb_ao_size_h); eeprom_update_byte((uint8_t*)ADDRESS_TB_AO_SIZE_V, tb_ao_size_v); eeprom_update_byte((uint8_t*)ADDRESS_TB_DI_PERIOD, tb_di_period); eeprom_update_word((uint16_t*)ADDRESS_TB_DI_FRAMES_PER_UPPER_PART, tb_di_frames_per_upper_part); eeprom_update_byte((uint8_t*)ADDRESS_TB_DI_ON_FLAG, tb_di_on_flag); eeprom_update_byte((uint8_t*)ADDRESS_TB_DI_OFFSET, tb_di_offset); eeprom_update_byte((uint8_t*)ADDRESS_TB_DI_BREAK, tb_di_break); eeprom_update_word((uint16_t*)ADDRESS_TB_DI_POSITION_H, tb_di_position_h); eeprom_update_byte((uint8_t*)ADDRESS_TB_DI_POSITION_V, tb_di_position_v); eeprom_update_word((uint16_t*)ADDRESS_TB_DI_SIZE_H, tb_di_size_h); eeprom_update_byte((uint8_t*)ADDRESS_TB_DI_SIZE_V, tb_di_size_v); eeprom_update_byte((uint8_t*)ADDRESS_SBS_AO_FREQUENCY, sbs_ao_frequency); eeprom_update_byte((uint8_t*)ADDRESS_SBS_AO_FRAMES_PER_LEFT_PART, sbs_ao_frames_per_left_part); eeprom_update_byte((uint8_t*)ADDRESS_SBS_AO_ON_FLAG, sbs_ao_on_flag); eeprom_update_byte((uint8_t*)ADDRESS_SBS_AO_GAP, sbs_ao_gap); eeprom_update_byte((uint8_t*)ADDRESS_SBS_AO_POSITION_H, sbs_ao_position_h); eeprom_update_byte((uint8_t*)ADDRESS_SBS_AO_POSITION_V, sbs_ao_position_v); eeprom_update_byte((uint8_t*)ADDRESS_SBS_AO_RIGHT_EDGE, sbs_ao_right_edge); eeprom_update_word((uint16_t*)ADDRESS_SBS_AO_SIZE_V, sbs_ao_size_v); eeprom_update_byte((uint8_t*)ADDRESS_SBS_DI_PERIOD, sbs_di_period); eeprom_update_word((uint16_t*)ADDRESS_SBS_DI_FRAMES_PER_LEFT_PART, sbs_di_frames_per_left_part); eeprom_update_byte((uint8_t*)ADDRESS_SBS_DI_ON_FLAG, sbs_di_on_flag); eeprom_update_byte((uint8_t*)ADDRESS_SBS_DI_OFFSET, sbs_di_offset); eeprom_update_byte((uint8_t*)ADDRESS_SBS_DI_BREAK, sbs_di_break); eeprom_update_byte((uint8_t*)ADDRESS_SBS_DI_POSITION_H, sbs_di_position_h); eeprom_update_word((uint16_t*)ADDRESS_SBS_DI_POSITION_V, sbs_di_position_v); eeprom_update_byte((uint8_t*)ADDRESS_SBS_DI_SIZE_H, sbs_di_size_h); eeprom_update_word((uint16_t*)ADDRESS_SBS_DI_SIZE_V, sbs_di_size_v); eeprom_update_byte((uint8_t*)ADDRESS_FFR_FR_POSITION, ffr_fr_position); eeprom_update_byte((uint8_t*)ADDRESS_FFR_FR_PERIOD, ffr_fr_period); eeprom_update_word((uint16_t*)ADDRESS_FFR_FR_FRAMES_PER_VISIBLE_PART, ffr_fr_frames_per_visible_part); eeprom_update_byte((uint8_t*)ADDRESS_FFR_FR_ON_FLAG, ffr_fr_on_flag); eeprom_update_word((uint16_t*)ADDRESS_FFR_FR_POSITION_H, ffr_fr_position_h); eeprom_update_word((uint16_t*)ADDRESS_FFR_FR_POSITION_V, ffr_fr_position_v); eeprom_update_word((uint16_t*)ADDRESS_FFR_FR_SIZE_H, ffr_fr_size_h); eeprom_update_word((uint16_t*)ADDRESS_FFR_FR_SIZE_V, ffr_fr_size_v); eeprom_update_byte((uint8_t*)ADDRESS_FFR_SR_POSITION, ffr_sr_position); eeprom_update_byte((uint8_t*)ADDRESS_FFR_SR_PERIOD, ffr_sr_period); eeprom_update_word((uint16_t*)ADDRESS_FFR_SR_FRAMES_PER_VISIBLE_PART, ffr_sr_frames_per_visible_part); eeprom_update_byte((uint8_t*)ADDRESS_FFR_SR_ON_FLAG, ffr_sr_on_flag); eeprom_update_word((uint16_t*)ADDRESS_FFR_SR_POSITION_H, ffr_sr_position_h); eeprom_update_word((uint16_t*)ADDRESS_FFR_SR_POSITION_V, ffr_sr_position_v); eeprom_update_word((uint16_t*)ADDRESS_FFR_SR_SIZE_H, ffr_sr_size_h); eeprom_update_word((uint16_t*)ADDRESS_FFR_SR_SIZE_V, ffr_sr_size_v); frames_to_settings_save = 0; } /* LEDs */ switch(page) { case 0: PAGE_LED_PORT_OUT &= ~( (1 << PAGE_LED_LEFT) | (1 << PAGE_LED_RIGHT) ); break; // page 0, no blue LED lights up case 1: PAGE_LED_PORT_OUT &= ~(1 << PAGE_LED_LEFT); PAGE_LED_PORT_OUT |= (1 << PAGE_LED_RIGHT); break; // page 1, right blue LED lights up case 2: PAGE_LED_PORT_OUT |= (1 << PAGE_LED_LEFT); PAGE_LED_PORT_OUT &= ~(1 << PAGE_LED_RIGHT); break; // page 2, left blue LED lights up case 3: PAGE_LED_PORT_OUT |= (1 << PAGE_LED_LEFT) | (1 << PAGE_LED_RIGHT); break; // page 3, both blue LEDs light up case 4: // page 4, both blue LEDs blink at lower frequency if(page_flash < 6){ PAGE_LED_PORT_OUT |= (1 << PAGE_LED_LEFT) | (1 << PAGE_LED_RIGHT); } else{ PAGE_LED_PORT_OUT &= ~( (1 << PAGE_LED_LEFT) | (1 << PAGE_LED_RIGHT) ); } page_flash++; if(page_flash >= 12) page_flash = 0; break; case 5: // page 5, both blue LEDs blink at higher frequency if(page_flash < 3){ PAGE_LED_PORT_OUT |= (1 << PAGE_LED_LEFT) | (1 << PAGE_LED_RIGHT); } else{ PAGE_LED_PORT_OUT &= ~( (1 << PAGE_LED_LEFT) | (1 << PAGE_LED_RIGHT) ); } page_flash++; if(page_flash >= 6) page_flash = 0; break; } switch(mode) { case 0: MODE_LED_PORT_OUT &= ~( (1 << MODE_LED_UP) | (1 << MODE_LED_DOWN) ); break; // mode 0, no yellow LED lights up case 1: MODE_LED_PORT_OUT |= (1 << MODE_LED_DOWN); MODE_LED_PORT_OUT &= ~(1 << MODE_LED_UP); break; // mode 1, lower yellow LED lights up case 2: MODE_LED_PORT_OUT &= ~(1 << MODE_LED_DOWN); MODE_LED_PORT_OUT |= (1 << MODE_LED_UP); break; // mode 2, upper yellow LED lights up case 3: MODE_LED_PORT_OUT |= (1 << MODE_LED_UP) | (1 << MODE_LED_DOWN); break; // mode 3, both yellow LEDs light up } TCNT1 = 1024; // set Timer/Counter Register of 16-bit Timer/Counter1 above any value that compare registers can achieve TIMSK1 |= (1 << OCIE1B) | (1 << OCIE1A); // enable 16-bit Timer/Counter1 compare match interrupts } /* Set high state at MUX_OUTPUT and start drawing overlay in current line. */ ISR(TIMER1_COMPA_vect, ISR_NAKED) { MUX_OUTPUT_PORT_OUT |= (1 << MUX_OUTPUT); reti(); } /* Set low state at MUX_OUTPUT and stop drawing overlay in current line. */ ISR(TIMER1_COMPB_vect, ISR_NAKED) { MUX_OUTPUT_PORT_OUT &= ~(1 << MUX_OUTPUT); reti(); } /* Hsync interrupt. Drawing rectangles in lines is done here. */ ISR(INT0_vect, ISR_NOBLOCK) { /* Set counter registers to their initial values. */ TCNT1 = 0; // it will be used in TB / FFR modes line drawing TCNT0 = sbs_line_beginning; // it will be used in SBS mode line drawing /* Draw lines accordingly to data stored in rendered_line. */ switch(rendered_line[line_count]) { case 1: // Alternately Occluding Rectangle (TB) / First Rectangle (FFR) OCR1A = tb_ao_left_edge; OCR1B = tb_ao_right_edge; break; case 2: // Dihoptic Rectangle (TB) / Second Rectangle (FFR) OCR1A = tb_di_left_edge; OCR1B = tb_di_right_edge; break; case 0: // no rectangles in a line TCNT1 = 1024; break; case 3: // EMPTY, AO (SBS) TCNT1 = 1024; // set Timer/Counter Register of 16-bit Timer/Counter1 above any value that compare registers can achieve while(TCNT0 > sbs_line_beginning); while(TCNT0 < 10); while(TCNT0 > 10); while(TCNT0 < sbs_ao_left_edge); MUX_OUTPUT_PORT_OUT |= (1 << MUX_OUTPUT); while(TCNT0 > 10); MUX_OUTPUT_PORT_OUT &= ~(1 << MUX_OUTPUT); break; case 4: // EMPTY, DI (SBS) TCNT1 = 1024; // set Timer/Counter Register of 16-bit Timer/Counter1 above any value that compare registers can achieve while(TCNT0 > sbs_line_beginning); while(TCNT0 < 10); while(TCNT0 > 10); while(TCNT0 < sbs_di_left_edge); MUX_OUTPUT_PORT_OUT |= (1 << MUX_OUTPUT); while(TCNT0 < sbs_di_right_edge); MUX_OUTPUT_PORT_OUT &= ~(1 << MUX_OUTPUT); break; case 5: // AO, EMPTY (SBS) TCNT1 = 1024; // set Timer/Counter Register of 16-bit Timer/Counter1 above any value that compare registers can achieve while(TCNT0 > sbs_line_beginning); MUX_OUTPUT_PORT_OUT |= (1 << MUX_OUTPUT); while(TCNT0 < sbs_ao_size_h); MUX_OUTPUT_PORT_OUT &= ~(1 << MUX_OUTPUT); break; case 6: // AO, DI (SBS) TCNT1 = 1024; // set Timer/Counter Register of 16-bit Timer/Counter1 above any value that compare registers can achieve while(TCNT0 > sbs_line_beginning); MUX_OUTPUT_PORT_OUT |= (1 << MUX_OUTPUT); while(TCNT0 < sbs_ao_size_h); MUX_OUTPUT_PORT_OUT &= ~(1 << MUX_OUTPUT); while(TCNT0 > 10); while(TCNT0 < sbs_di_left_edge); MUX_OUTPUT_PORT_OUT |= (1 << MUX_OUTPUT); while(TCNT0 < sbs_di_right_edge); MUX_OUTPUT_PORT_OUT &= ~(1 << MUX_OUTPUT); break; case 7: // DI, EMPTY (SBS) TCNT1 = 1024; // set Timer/Counter Register of 16-bit Timer/Counter1 above any value that compare registers can achieve while(TCNT0 > sbs_line_beginning); while(TCNT0 < sbs_di_left_edge); MUX_OUTPUT_PORT_OUT |= (1 << MUX_OUTPUT); while(TCNT0 < sbs_di_right_edge); MUX_OUTPUT_PORT_OUT &= ~(1 << MUX_OUTPUT); break; case 8: // DI, AO (SBS) TCNT1 = 1024; // set Timer/Counter Register of 16-bit Timer/Counter1 above any value that compare registers can achieve while(TCNT0 > sbs_line_beginning); while(TCNT0 < sbs_di_left_edge); MUX_OUTPUT_PORT_OUT |= (1 << MUX_OUTPUT); while(TCNT0 < sbs_di_right_edge); MUX_OUTPUT_PORT_OUT &= ~(1 << MUX_OUTPUT); while(TCNT0 > 10); while(TCNT0 < sbs_ao_left_edge); MUX_OUTPUT_PORT_OUT |= (1 << MUX_OUTPUT); while(TCNT0 > 10); MUX_OUTPUT_PORT_OUT &= ~(1 << MUX_OUTPUT); break; } /* Every rendered line of overlay is drawn on 4 lines of VGA signal. */ if( (line_pair++) == 3) { line_pair = 0; line_count++; } }