Improved error handling during code generation
[cerebrum.git] / avr / simple-io.c.tp
blob419228503c2f39d3c678024a0bba9115fa4cc9a8
1 /*
2  Copyright (C) 2012 jaseg <s@jaseg.de>
4  This program is free software; you can redistribute it and/or
5  modify it under the terms of the GNU General Public License
6  version 3 as published by the Free Software Foundation.
7  */
9 #include <avr/io.h>
11 void ${init_function()} (void){
12         % if device["adc"].get(member["port"]+str(member["pin"])):
13                 ADMUX |= REFS0 | ADLAR;
14                 ADCSRA |= ADEN | ${device["adc"]["prescaler_bits"]};
15         % endif
18 //${modulevar("state", None, "B", callbacks=(2, 2))}
19 void ${setter("state")} (const comm_callback_descriptor* cb, void* argbuf_end){
20         uint8_t arg=((uint8_t*)cb->argbuf)[0];
21         if(arg)
22                 PORT${member["port"]} |= (1<<${member["pin"]});
23         else
24                 PORT${member["port"]} &= ~(1<<${member["pin"]});
25         uart_putc(0x00);
26         uart_putc(0x00);
29 void ${getter("state")} (const comm_callback_descriptor* cb, void* argbuf_end){
30         uart_putc(0x00);
31         uart_putc(0x01);
32         uart_putc(!!(PIN${member["port"]} & (1<<${member["pin"]})));
35 //${modulevar("direction", None, "B", callbacks=(2, 2))}
36 void ${setter("direction")} (const comm_callback_descriptor* cb, void* argbuf_end){
37         uint8_t arg=((uint8_t*)cb->argbuf)[0];
38         DDR${member["port"]} &= ~(1<<${member["pin"]});
39         if(arg)
40                 DDR${member["port"]} |= (1<<${member["pin"]});
41         else
42                 DDR${member["port"]} &= ~(1<<${member["pin"]});
43         uart_putc(0x00);
44         uart_putc(0x00);
47 void ${getter("direction")} (const comm_callback_descriptor* cb, void* argbuf_end){
48         uart_putc(0x00);
49         uart_putc(0x01);
50         uart_putc(!!(DDR${member["port"]} & (1<<${member["pin"]})));
53 % if device["adc"].get(member["port"]+str(member["pin"])):
54 //${modulevar("analog", None, "B", callbacks=(2, None))}
55 void ${getter("analog")} (const comm_callback_descriptor* cb, void* argbuf_end){
56         uart_putc(0x00);
57         uart_putc(0x01);
58 #if defined(__AVR_ATmega48__) ||defined(__AVR_ATmega88__) || defined(__AVR_ATmega168__) || defined(__AVR_ATmega48P__) || defined(__AVR_ATmega88P__) || defined(__AVR_ATmega168P__) || defined(__AVR_ATmega328P__)
59         ADMUX &= 0xF0;
60         ADMUX |= ${device["adc"].get(member["port"]+str(member["pin"]))};
61 #elif defined(__AVR_ATmega2560__) || defined(__AVR_ATmega2561__) || defined(__AVR_ATmega1280__)  || defined(__AVR_ATmega1281__) || defined(__AVR_ATmega640__)
62         ADMUX &= 0xE0;
63         ADCSRB &= 0xF7;
64         ADMUX |= ${device["adc"].get(member["port"]+str(member["pin"]))}&0x1F;
65         ADCSRB |= ${device["adc"].get(member["port"]+str(member["pin"]))}&0x20>>2;
66 #endif
67         while(!(ADCSRA&(1<<ADIF))); //wait for conversion to finish
68         uart_putc(ADCH);
69         ADCSRA |= (1<<ADIF); //reset the interrupt flag
71 % endif
73 % if device["pwm"].get(member["port"]+str(member["pin"])):
74 //${modulevar("pwm", None, "B", callbacks=(2, 2))}
75 void ${setter("pwm")} (const comm_callback_descriptor* cb, void* argbuf_end){
76         uint8_t arg=((uint8_t*)cb->argbuf)[0];
77         OCR${device["pwm"].get(member["port"]+str(member["pin"]))[0]}${device["pwm"].get(member["port"]+str(member["pin"]))[1]} = arg;
78         uart_putc(0x00);
79         uart_putc(0x00);
82 void ${getter("pwm")} (const comm_callback_descriptor* cb, void* argbuf_end){
83         uart_putc(0x00);
84         uart_putc(0x01);
85         uart_putc(OCR${device["pwm"].get(member["port"]+str(member["pin"]))[0]}${device["pwm"].get(member["port"]+str(member["pin"]))[1]});
88 //${modulevar("pwm_enabled", None, "B", callbacks=(2, 2))}
89 void ${getter("pwm_enabled")} (const comm_callback_descriptor* cb, void* argbuf_end){
90         //FIXME not implemented
91         uart_putc(0x00);
92         uart_putc(0x00);
95 void ${setter("pwm_enabled")} (const comm_callback_descriptor* cb, void* argbuf_end){
96         uint8_t arg=((uint8_t*)cb->argbuf)[0];
97         if(arg){
98                 ${device["pwm"].get(member["port"]+str(member["pin"]))[2]}
99         }else{
100                 ${device["pwm"].get(member["port"]+str(member["pin"]))[3]}
101         }
102         uart_putc(0x00);
103         uart_putc(0x00);
105 % endif