6 #define POLARITY PORTD2
8 #define BIT(x) (1<<(x))
18 volatile uint8_t packet_state = IDLE;
19 static uint8_t out_bit;
20 static uint8_t out_time;
21 static uint8_t out_data;
22 static uint8_t delay_time;
24 void output_init(void)
26 DDRD = (DDRD&0xF3)|0x0C;
27 PORTD &= ~BIT(ENABLE);
29 timer_start_hz(2, 80000, 1);
32 OutputPacket *output_create_packet(void)
34 while(packet_state!=IDLE) ;
38 void output_send_packet(void)
40 if(packet_state!=IDLE)
46 void output_set_power(uint8_t p)
51 PORTD &= ~BIT(ENABLE);
54 uint8_t output_is_power_on()
56 return (PORTD&BIT(ENABLE))!=0;
59 uint8_t output_command(const uint8_t *cmd_buf, uint8_t cmd_length)
61 if(cmd_buf[0]==POWER_ON || cmd_buf[0]==POWER_OFF)
66 output_set_power(cmd_buf[0]==POWER_ON);
68 else if(cmd_buf[0]==READ_POWER_STATE)
74 reply[0] = POWER_STATE;
75 reply[1] = output_is_power_on();
76 interface_send(reply, 2);
79 return INVALID_COMMAND;
84 static inline void output_tick(void)
86 if(delay_time && --delay_time)
89 if(out_time && !--out_time)
92 if(out_bit>=packet.length)
94 PORTD &= ~BIT(POLARITY);
95 if(packet.repeat_count>1)
97 if(packet.repeat_count<0xFF)
98 --packet.repeat_count;
99 delay_time = packet.repeat_delay;
100 packet_state = READY;
104 delay_time = packet.final_delay;
111 out_data = packet.data[out_bit>>3];
116 PORTD |= BIT(POLARITY);
118 PORTD &= ~BIT(POLARITY);
120 out_time = packet.bit_duration;
126 if(packet_state==READY)
128 packet_state = SENDING;
130 out_time = packet.bit_duration;
131 out_data = packet.data[0];
133 PORTD |= BIT(POLARITY);
135 PORTD &= ~BIT(POLARITY);
139 TIMER_SET_CALLBACK(2, output_tick)