summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--n/avr/twi-slave/twi_slave.c55
1 files changed, 13 insertions, 42 deletions
diff --git a/n/avr/twi-slave/twi_slave.c b/n/avr/twi-slave/twi_slave.c
index 4aa03f9..777400f 100644
--- a/n/avr/twi-slave/twi_slave.c
+++ b/n/avr/twi-slave/twi_slave.c
@@ -32,13 +32,11 @@
static volatile uint8_t twi_rcpt_tail;
static volatile uint8_t send_idx;
static volatile uint8_t data_ready;
-static volatile uint8_t buf_rcpt1[SIZE_BUF_RCPT];
-static volatile uint8_t buf_rcpt2[SIZE_BUF_RCPT];
+static volatile uint8_t buf_rcpt[SIZE_BUF_RCPT];
static volatile uint8_t buf_send1[SIZE_BUF_SEND];
static volatile uint8_t buf_send2[SIZE_BUF_SEND];
static volatile uint8_t *buf_send_sys, *buf_send_user;
-static volatile uint8_t *buf_rcpt_sys, *buf_rcpt_user;
-static volatile int8_t send_switch, rcpt_switch;
+static volatile int8_t send_switch;
static volatile int8_t state;
void
@@ -46,11 +44,8 @@ twi_init (uint8_t addr)
{
state = 0;
send_switch = 0;
- rcpt_switch = 0;
buf_send_sys = buf_send1;
buf_send_user = buf_send2;
- buf_rcpt_sys = buf_rcpt1;
- buf_rcpt_user = buf_rcpt2;
TWAR = addr;
TWSR = 0x00;
TWCR = _BV(TWEA) | _BV(TWEN) | _BV(TWIE);
@@ -98,7 +93,7 @@ SIGNAL (SIG_2WIRE_SERIAL)
case TW_SR_DATA_ACK:
case TW_SR_GCALL_DATA_ACK:
rs232_putc ('y');
- buf_rcpt_sys[twi_rcpt_tail++] = TWDR;
+ buf_rcpt[twi_rcpt_tail++] = TWDR;
if (SIZE_BUF_RCPT - twi_rcpt_tail == 1)
TWCR &= ~_BV(TWEA);
break;
@@ -106,37 +101,22 @@ SIGNAL (SIG_2WIRE_SERIAL)
case TW_SR_DATA_NACK:
case TW_SR_GCALL_DATA_NACK:
rs232_putc ('x');
- buf_rcpt_sys[twi_rcpt_tail++] = TWDR;
+ buf_rcpt[twi_rcpt_tail++] = TWDR;
/* no break */
/* STOP */
case TW_SR_STOP:
rs232_putc ('w');
data_ready = 1;
- if (state == 1) /* send */
+ if (state && send_switch) /* send */
{
- if (send_switch == 1)
- {
- volatile uint8_t *tmp;
- /* Thibault paye son coup */
- tmp = buf_send_user;
- buf_send_user = buf_send_sys;
- buf_send_sys = tmp;
- send_switch = 0;
- }
+ volatile uint8_t *tmp;
+ /* Thibault paye son coup */
+ tmp = buf_send_user;
+ buf_send_user = buf_send_sys;
+ buf_send_sys = tmp;
+ send_switch = 0;
+ state = 0;
}
- else if (state == 2)
- {
- if (!rcpt_switch)
- {
- volatile uint8_t *tmp;
- tmp = buf_rcpt_user;
- buf_rcpt_user = buf_rcpt_sys;
- buf_rcpt_sys = tmp;
- }
- else
- rcpt_switch = 1;
- }
- state = 0;
break;
}
TWCR |= _BV(TWINT);
@@ -147,20 +127,11 @@ SIGNAL (SIG_2WIRE_SERIAL)
uint8_t
twi_poll (uint8_t buf[], uint8_t size)
{
- if (rcpt_switch)
- {
- volatile uint8_t *tmp;
- tmp = buf_rcpt_user;
- buf_rcpt_user = buf_rcpt_sys;
- buf_rcpt_sys = tmp;
- rcpt_switch = 0;
- }
if (data_ready)
{
- rcpt_switch = 1;
data_ready = 0;
while (size --)
- buf[size] = buf_rcpt_user[size];
+ buf[size] = buf_rcpt[size];
TWCR |= _BV (TWEA);
return 1;
}