/* * Copyright 2017-2024 Oleg Borodin */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include button_t volplus_button; button_t volminus_button; typedef struct { uint8_t volume; bool volume_updated; } contr_t; contr_t contr; void contr_init(void) { contr.volume = 0; contr.volume_updated = false; } void contr_setup(void) { i2c_init(); disp_init(); button_init(&volplus_button, BTVOLPLUS_DDRADDR, BTVOLPLUS_PORTADDR, BTVOLPLUS_PINDADDR, BTVOLPLUS_OUTNUM); button_setup(&volplus_button); button_reset(&volplus_button); button_init(&volminus_button, BTVOLMINUS_DDRADDR, BTVOLMINUS_PORTADDR, BTVOLMINUS_PINDADDR, BTVOLMINUS_OUTNUM); button_setup(&volminus_button); button_reset(&volminus_button); adc_init(); timer0_init(); radio_init(); sei(); } ISR(TIMER0_OVF_vect) { button_handle(&volplus_button); button_handle(&volminus_button); } void contr_show_logo(void) { disp_clear(); char* dispstr = "Made by R2FDX"; disp_string(1, 1, dispstr); _delay_ms(100); disp_clear(); } #define CONTR_DISPSTR_SIZE 16 void contr_show_volume(void) { char dispstr[CONTR_DISPSTR_SIZE]; sprintf(dispstr, "%2d 0x%02X %02X", contr.volume, radio_get_status(), i2c_error); disp_string(7, 0, dispstr); } #define MAX_VOLUME 64 void contr_calc_volume(void) { if (button_was_pressed(&volplus_button)) { if (contr.volume == MAX_VOLUME) { return; } contr.volume++; contr.volume_updated = true; } if (button_was_pressed(&volminus_button)) { if (contr.volume == 0) { return; } contr.volume--; contr.volume_updated = true; } } void contr_main(void) { contr_show_logo(); uint16_t counter = 0; while (true) { counter++; _delay_ms(10); contr_calc_volume(); contr_show_volume(); } }