6 #define POLARITY PORTD2
8 #define BIT(x) (1<<(x))
17 OutputPacket packets[4];
19 uint8_t current_packet;
20 volatile uint8_t packet_state = IDLE;
21 static uint8_t out_bit;
22 static uint8_t out_time;
23 static uint8_t out_data;
24 static uint8_t delay_time;
26 void output_init(void)
28 DDRD = (DDRD&0xF3)|0x0C;
29 PORTD &= ~BIT(ENABLE);
31 timer_start_hz(2, 80000, 1);
34 OutputPacket *output_create_packet(void)
36 while(packet_state!=IDLE) ;
41 OutputPacket *output_create_chained_packet(void)
44 return &packets[chain_length-1];
47 void output_send_packet(void)
49 if(packet_state!=IDLE)
56 void output_set_power(uint8_t p)
61 PORTD &= ~BIT(ENABLE);
64 uint8_t output_is_power_on()
66 return (PORTD&BIT(ENABLE))!=0;
69 uint8_t output_command(const uint8_t *cmd_buf, uint8_t cmd_length)
71 if(cmd_buf[0]==POWER_ON || cmd_buf[0]==POWER_OFF)
76 output_set_power(cmd_buf[0]==POWER_ON);
78 else if(cmd_buf[0]==READ_POWER_STATE)
84 reply[0] = POWER_STATE;
85 reply[1] = output_is_power_on();
86 interface_send(reply, 2);
89 return INVALID_COMMAND;
94 static inline void output_tick(void)
96 if(delay_time && --delay_time)
99 if(out_time && !--out_time)
101 OutputPacket *packet = &packets[current_packet];
103 if(out_bit>=packet->length)
105 PORTD &= ~BIT(POLARITY);
106 if(--packet->repeat_count)
108 delay_time = packet->repeat_delay;
109 packet_state = READY;
113 delay_time = packet->final_delay;
114 if(++current_packet<chain_length)
115 packet_state = READY;
123 out_data = packet->data[out_bit>>3];
128 PORTD |= BIT(POLARITY);
130 PORTD &= ~BIT(POLARITY);
132 out_time = packet->bit_duration;
138 if(packet_state==READY)
140 OutputPacket *packet = &packets[current_packet];
141 packet_state = SENDING;
143 out_time = packet->bit_duration;
144 out_data = packet->data[0];
146 PORTD |= BIT(POLARITY);
148 PORTD &= ~BIT(POLARITY);
152 TIMER_SET_CALLBACK(2, output_tick)