121 lines
2.3 KiB
C
121 lines
2.3 KiB
C
/*
|
|
* Copyright 2017-2024 Oleg Borodin <onborodin@gmail.com>
|
|
*/
|
|
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <math.h>
|
|
|
|
#include <avr/interrupt.h>
|
|
#include <util/delay.h>
|
|
|
|
#include <tool.h>
|
|
#include <eeprom.h>
|
|
#include <disp.h>
|
|
#include <timer.h>
|
|
#include <adc.h>
|
|
#include <button.h>
|
|
|
|
#include <contr.h>
|
|
#include <button.h>
|
|
#include <i2c.h>
|
|
#include <adc.h>
|
|
#include <disp.h>
|
|
#include <timer.h>
|
|
#include <radio.h>
|
|
|
|
|
|
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();
|
|
}
|
|
}
|
|
|