6 #define POLARITY PORTD2
8 #define BIT(x) (1<<(x))
11 static uint8_t out_bit;
12 static uint8_t out_time;
13 static uint8_t out_data;
14 static uint8_t delay_time;
16 void output_init(void)
18 DDRD = (DDRD&0xF3)|0x0C;
19 PORTD &= ~BIT(ENABLE);
21 timer_start_hz(2, 80000, 1);
24 void clear_packet(void)
31 void output_set_power(uint8_t p)
36 PORTD &= ~BIT(ENABLE);
39 uint8_t output_is_power_on()
41 return (PORTD&BIT(ENABLE))!=0;
44 uint8_t output_command(const uint8_t *cmd_buf, uint8_t cmd_length)
46 if(cmd_buf[0]==POWER_ON || cmd_buf[0]==POWER_OFF)
51 output_set_power(cmd_buf[0]==POWER_ON);
53 else if(cmd_buf[0]==READ_POWER_STATE)
59 reply[0] = POWER_STATE;
60 reply[1] = output_is_power_on();
61 interface_send(reply, 2);
64 return INVALID_COMMAND;
69 static inline void output_tick(void)
71 if(delay_time && --delay_time)
74 if(out_time && !--out_time)
77 if(out_bit>=packet.length)
79 PORTD &= ~BIT(POLARITY);
80 if(packet.repeat_count>1)
82 if(packet.repeat_count<0xFF)
83 --packet.repeat_count;
84 delay_time = packet.repeat_delay;
89 delay_time = packet.final_delay;
96 out_data = packet.data[out_bit>>3];
101 PORTD |= BIT(POLARITY);
103 PORTD &= ~BIT(POLARITY);
105 out_time = packet.bit_duration;
111 if(packet.ready && !packet.sending)
115 out_time = packet.bit_duration;
116 out_data = packet.data[0];
118 PORTD |= BIT(POLARITY);
120 PORTD &= ~BIT(POLARITY);
124 TIMER_SET_CALLBACK(2, output_tick)