forked from compulab/i3m-application
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.c
More file actions
103 lines (92 loc) · 2.29 KB
/
main.c
File metadata and controls
103 lines (92 loc) · 2.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include "twi/twi_slave.h"
#include "scheduler/scheduler.h"
#include "ASF/xmega/drivers/wdt/wdt.h"
#include "twi/i2c_buffer.h"
#include "power/power.h"
#include "work-queue/work.h"
#include "config/config_block.h"
#include "config/menus/fp_menus_config.h"
#include "gfx/gfx_components/gfx_graphic_menu.h"
#include "ASF/common/services/usb/udc/udc.h"
#include "ASF/common/utils/stdio/stdio_usb/stdio_usb.h"
#include "gfx/gfx_gui_control.h"
#include "lib/sleep.h"
#include "asf.h"
extern void apply_app_settings(void);
static void tc_init(void)
{
void *tc = &TCC0;
tc_set_wgm(tc, TC_WG_NORMAL);
// Set TCC0 overflow every 100ms, driving the scheduler
tc_write_period(tc, 0x0C3A);
tc_disable_cc_channels(tc, TC_CCAEN);
tc_write_clock_source(tc, TC_CLKSEL_DIV1024_gc);
}
bool my_callback_cdc_enable(void)
{
return stdio_usb_enable();
}
void my_callback_cdc_disable(void)
{
stdio_usb_disable();
}
/*
static void usb_init(void)
{
udc_start();
}
*/
static void adc_init(void)
{
ADC_t *adc = &ADCA;
uint8_t adc_ch = ADC_CH0;
struct adc_config adc_conf;
struct adc_channel_config adcch_conf;
adc_read_configuration(adc, &adc_conf);
adcch_read_configuration(adc, adc_ch, &adcch_conf);
adc_set_conversion_parameters(&adc_conf, ADC_SIGN_ON, ADC_RES_12, ADC_REFSEL_INTVCC2_gc);
adc_set_conversion_trigger(&adc_conf, ADC_TRIG_EVENT_SINGLE, 1, 0);
adc_set_clock_rate(&adc_conf, 100000UL);
adcch_set_input(&adcch_conf, ADCCH_POS_PIN1, ADCCH_NEG_INTERNAL_GND, 0);
adc_write_configuration(adc, &adc_conf);
adcch_write_configuration(adc, adc_ch, &adcch_conf);
adc_enable(adc);
}
static void init(void)
{
wdt_set_timeout_period(WDT_TIMEOUT_PERIOD_2KCLK);
wdt_enable();
sysclk_init();
board_init();
load_config_block();
cli();
gfx_mono_init();
glcd_init();
gfx_show_splash_screen(3000);
i2c_buffer_init();
apply_app_settings();
adc_init();
pmic_init();
power_state_init();
twi_slave_init();
sleepmgr_init();
tc_init();
scheduler_init(&TCC0);
tc_enable(&TCC0);
sei();
}
int main(int argc, char *argv[])
{
//prevent config section from being optimized out
volatile int __attribute__((unused)) dont_optimize_this_away = pgm_read_byte_far(&menus_config);
#ifndef CONFIG_SECTION_ONLY
init();
while (true) {
wdt_reset();
wakeup = false;
if (!work_handler())
sleep_interuptable(1000);
}
#endif
return 0;
}