[tuxdroid-svn] r1304 - firmware/tuxaudio/trunk
Status: Beta
Brought to you by:
ks156
From: jaguarondi <c2m...@c2...> - 2008-07-02 15:08:55
|
Author: jaguarondi Date: 2008-07-02 17:08:50 +0200 (Wed, 02 Jul 2008) New Revision: 1304 Modified: firmware/tuxaudio/trunk/PC_communication.c firmware/tuxaudio/trunk/communication.c firmware/tuxaudio/trunk/i2c.c firmware/tuxaudio/trunk/i2c.h firmware/tuxaudio/trunk/main.c firmware/tuxaudio/trunk/parser.c firmware/tuxaudio/trunk/parser.h firmware/tuxaudio/trunk/varis.c firmware/tuxaudio/trunk/varis.h Log: * Replaced the (commented) audio adaptation with a much simpler scheme. * Split the command parsing from the I2C interrupt. * Some cleanup. Modified: firmware/tuxaudio/trunk/PC_communication.c =================================================================== --- firmware/tuxaudio/trunk/PC_communication.c 2008-07-02 14:03:43 UTC (rev 1303) +++ firmware/tuxaudio/trunk/PC_communication.c 2008-07-02 15:08:50 UTC (rev 1304) @@ -29,6 +29,8 @@ #include "spi.h" #include "hardware.h" +void adapt_audio_rate(void); + void spiTransaction(void) { if (spi_start) // Wait start @@ -129,98 +131,7 @@ } spi_master = PUT_SOUND_FIFO; // Go to the next state - - if (!programmingFlash && !flashPlay) // XXX code must be review it's very strange ..... - { - if (!(spi_master_config & 0x02)) - { - if (!lockAdaptFifo) - { - //adaptFifo(PWMFifo); // Adaptative FIFO -#if 0 -/** \brief 3 levels adaptative function. - * \param p fifo pointer - * - * High and low thresholds are used to differentiate 3 levels of the buffer. In - * each level, a custom code or a function call can be provided to do the - * adaptation. - */ -void adaptFifo(fifo_t * p) -{ - unsigned char fifoLevel; - - fifoLevel = fifoLength(p); - if (!p->adpt_cycle) - { - if (p->matched == 8) - { - if (OCR0A < 254) - p->pwm_max = OCR0A + 2; - else - p->pwm_max = 255; - if (OCR0A > 231) - p->pwm_min = OCR0A - 2; - else - p->pwm_min = 230; - p->matched = 9; - } - - if (fifoLevel >= FIFO_ADAPT_HIGH) - { - if (OCR0A > p->pwm_min) - { - OCR0A--; - p->pwm_adpt_sens = 1; - } - } - else if (fifoLevel < FIFO_ADAPT_LOW) - { - if (OCR0A < p->pwm_max) - { - OCR0A++; - p->pwm_adpt_sens = 2; - } - } - else - { - if (p->pwm_adpt_sens) - { - if ((p->pwm_adpt_sens) == 1) - { - if (OCR0A < p->pwm_max) - OCR0A++; } - else - { - if (OCR0A > p->pwm_min) - OCR0A--; - } - p->pwm_adpt_sens = 0; - p->matched = 0; - } - else - { - if (p->matched != 9) - p->matched++; - } - } - } - p->adpt_cycle++; - p->adpt_cycle &= (FIFO_ADAPT_RATE << 1) - 1; -} -#endif - lockAdaptFifo = 1; - } - else - FifoClear(PWMFifo); - } - else - { - lockAdaptFifo = 0; - } - } - - } else if (spi_master == PUT_SOUND_FIFO) { if (spi_master_config & 0x02) @@ -229,7 +140,11 @@ FifoPut(PWMFifo, SPDR); // Put into the FIFO } if (spi_count == (spi_lenght_data + 1)) + { spi_master = READ_COMMAND; // Go to the next state + if (spi_master_config & 0x02) + adapt_audio_rate(); + } } else if (spi_master == READ_COMMAND) @@ -259,3 +174,28 @@ } } +/** + * \brief Adapt the audio output rate to keep the stack at a mean level. + * Called only once when all 17 bytes have been received. All is here, nothing + * else is necessary. + */ +void adapt_audio_rate(void) +{ + static uint8_t prescaler = 0; + uint8_t static prev_stack_length = 0; + uint8_t stack_length = FifoLength(PWMFifo); + uint8_t slope; + + if (++prescaler == 0) + { + /* Determine if the stack is growing or decreasing. */ + slope = (stack_length >= prev_stack_length); + prev_stack_length = stack_length; + + /* Adaptation */ + if (slope && stack_length > 40 && OCR0A > 240) + OCR0A--; + if (!slope && stack_length < 80 && OCR0A < 254) + OCR0A++; + } +} Modified: firmware/tuxaudio/trunk/communication.c =================================================================== --- firmware/tuxaudio/trunk/communication.c 2008-07-02 14:03:43 UTC (rev 1303) +++ firmware/tuxaudio/trunk/communication.c 2008-07-02 15:08:50 UTC (rev 1304) @@ -34,6 +34,8 @@ /* I2C read message (in) */ static uint8_t in_buf[CMD_SIZE]; static struct i2c_msg msg_in = {0, 0, in_buf}; +/* I2C last received command */ +static uint8_t *received_cmd = 0; /** Size of the stack buffer to tuxcore */ #define CORE_OUT_BUF_SIZE 16 @@ -176,32 +178,21 @@ * \param msg I2C message received * \return 0 if a stop should be sent, 1 for a restart. */ -bool i2c_master_receive_service(struct i2c_msg *msg) +void i2c_master_receive_service(struct i2c_msg *msg) { if (msg->len != CMD_SIZE) /* Error here. */ - return 0; + return; if (*(msg->buf) == 0) { /* Got nothing so stop reading. */ - return 0; + return; } if (msg->addr == TUXCORE_ADDR) /* From tuxcore */ { - /* New pointer necessary as parse_cmd modifies the pointer. */ - uint8_t *cmd = msg->buf; - /* Parse the command */ - parse_cmd(cmd); - /* and forward if it isn't dropped. */ - if (cmd) - queue_rf_cmd(cmd); - /* As we got something, there's maybe more so if the stack is not full, - * continue */ - if (FifoLength(rf_cmdout_buf) <= RF_OUT_BUF_SIZE - CMD_SIZE) - return 1; + received_cmd = msg->buf; } - return 0; } /* @@ -251,6 +242,14 @@ return; } + /* Parse the received command and forward if it isn't dropped. */ + if (received_cmd) + { + if (!parse_cmd(received_cmd)) + queue_rf_cmd(received_cmd); + received_cmd = 0; + } + /* Send otherwise get commands. */ if (!send_core_cmds()) { Modified: firmware/tuxaudio/trunk/i2c.c =================================================================== --- firmware/tuxaudio/trunk/i2c.c 2008-07-02 14:03:43 UTC (rev 1303) +++ firmware/tuxaudio/trunk/i2c.c 2008-07-02 15:08:50 UTC (rev 1304) @@ -84,7 +84,7 @@ /* function pointer to i2c receive routine */ /* I2cSlaveReceive is called when this processor is addressed as a slave for * writing */ -static bool (*i2c_master_receive) (struct i2c_msg *msg); +static void (*i2c_master_receive) (struct i2c_msg *msg); /* I2cSlaveTransmit is called when this processor is addressed as a slave for * reading */ static uint8_t(*i2cSlaveTransmit) (uint8_t transmitDataLengthMax, @@ -99,7 +99,7 @@ //i2c_resume(); /* Set the user function which handles receiving (incoming) data as a slave */ -void i2c_master_receive_handler(bool (*i2cMasterRx_func) (struct i2c_msg *msg)) +void i2c_master_receive_handler(void (*i2cMasterRx_func) (struct i2c_msg *msg)) { i2c_master_receive = i2cMasterRx_func; } @@ -362,14 +362,8 @@ m_msg->state = i2c_state; if (i2c_master_receive) { - if (i2c_master_receive(m_msg)) - { - buf_idx = 0; - i2c_state = I2C_BUSY; - twi_send_start(); /* restart a read */ - } - else - twi_send_stop(); /* end of data stream */ + i2c_master_receive(m_msg); + twi_send_stop(); /* end of data stream */ } break; case TW_MT_SLA_NACK: /* 0x20 */ Modified: firmware/tuxaudio/trunk/i2c.h =================================================================== --- firmware/tuxaudio/trunk/i2c.h 2008-07-02 14:03:43 UTC (rev 1303) +++ firmware/tuxaudio/trunk/i2c.h 2008-07-02 15:08:50 UTC (rev 1304) @@ -80,7 +80,7 @@ /* Functions */ void i2cInit(void); -void i2c_master_receive_handler(bool (*i2cMasterRx_func) (struct i2c_msg *msg)); +void i2c_master_receive_handler(void (*i2cMasterRx_func) (struct i2c_msg *msg)); void i2cSetSlaveTransmitHandler(uint8_t(*i2cSlaveTx_func) (uint8_t transmitDataLengthMax, Modified: firmware/tuxaudio/trunk/main.c =================================================================== --- firmware/tuxaudio/trunk/main.c 2008-07-02 14:03:43 UTC (rev 1303) +++ firmware/tuxaudio/trunk/main.c 2008-07-02 15:08:50 UTC (rev 1304) @@ -167,10 +167,7 @@ if (commandRX) // commend RX from radio { commandRX = 0; // Reset flag - parse_cmd(spi_commandRX); - /* XXX there are some empty commands getting through, removed from - * here for now. */ - if (spi_commandRX && spi_commandRX[0]) + if (!parse_cmd(spi_commandRX)) queue_core_cmd(spi_commandRX); } @@ -286,20 +283,13 @@ if (!FifoGet(PWMFifo, (uint8_t *)&OCR0B)) /* set the sample value to timer pulse width */ { - Fifoinert = 0; if (tuxaudio_config.automute) /* XXX mute functions should not be called here each time a sample is placed, this is silly */ unmute_amp(); } else { - Fifoinert++; - if (Fifoinert >= 30) - { - if (tuxaudio_config.automute) - mute_amp(); - Fifoinert = 30; - //OCR0A = 250; // Normal operation for ADC sampling if FIFO Adaptative is on - } + if (tuxaudio_config.automute) + mute_amp(); } /* XXX we should move this timer away from here */ /* send status to the behavioural CPU, 8KHz divided by 256 lead to a Modified: firmware/tuxaudio/trunk/parser.c =================================================================== --- firmware/tuxaudio/trunk/parser.c 2008-07-02 14:03:43 UTC (rev 1303) +++ firmware/tuxaudio/trunk/parser.c 2008-07-02 15:08:50 UTC (rev 1304) @@ -32,94 +32,101 @@ /** * Parse a cmd received by the computer or by tuxcore and drop it if it * shouldn't be forwarded. + * \return True if the command has been parsed and shouldn't be forwarded, + * false if it should be forwarded. */ -void parse_cmd(uint8_t *cmd) +bool parse_cmd(uint8_t *cmd) { + /* XXX there are some empty commands getting through, removed from + * here for now. */ - /* - * Commands that should be forwarded - */ - - /* Ping */ - if (cmd[0] == PONG_CMD) + /* + * Commands that shouldn't be forwarded. + */ + /* Version */ + if (cmd[0] == NULL_CMD) { - /* Index of the pong that is supposed to be received from tuxcore */ - static uint8_t pong_received; - /* Counter of the missed pongs */ - static uint8_t pong_missed; - if (pong_received-- < cmd[1]) /* new ping, reset */ - { - pong_received = cmd[1]; - pong_missed = 0; - } - else /* pongs */ - { - pong_missed += pong_received - cmd[1]; - pong_received = cmd[1]; /* resync */ - } - cmd[2] = pong_missed; } - else if (cmd[0] == SLEEP_CMD) + else if (cmd[0] == INFO_TUXAUDIO_CMD) { - /* XXX sleep commented for now */ - /* Forwards the cmd to the rf CPU */ - /*cmd[0] = SLEEP_ACK_CMD;*/ - /*cmd[1] = 0;*/ - /*cmd[2] = 0;*/ - /*cmd[3] = 0;*/ - /*pre_sleep_delay = 30; [> handle sleep in its own function <]*/ - /*sleep_f = 1;*/ - /*statusFlag = 1;*/ + send_info(); } - else + else if (cmd[0] == PLAY_SOUND_CMD) + /* param: cmd[1] : sound number */ + /* cmd[2] : mic sound intensity */ { - /* - * Commands that shouldn't be forwarded. - */ - /* Version */ - if (cmd[0] == INFO_TUXAUDIO_CMD) + /* Drop the cmd if a sound is already playing */ + if (!(flashPlay || programmingFlash)) { - send_info(); - } - else if (cmd[0] == PLAY_SOUND_CMD) - /* param: cmd[1] : sound number */ - /* cmd[2] : mic sound intensity */ - { - /* postpone the cmd if a sound is already playing */ - if (flashPlay || programmingFlash) - return; audioLevel = cmd[2]; - //playingAudio(cmd[1]); /* start playing the sound */ soundToPlay = cmd[1]; flashPlay = 1; flash_state = 1; } - else if (cmd[0] == MUTE_CMD) + } + else if (cmd[0] == MUTE_CMD) + { + if (cmd[1]) + mute_amp(); + else + unmute_amp(); + } + else if (cmd[0] == STORE_SOUND_CMD) + { + if (flashPlay) + flashPlay = 0; + flash_state = 1; /* Erasing flash flag */ + programmingFlash = 1; /* Set the flag to enter programming sequence */ + } + else if (cmd[0] == ERASE_FLASH_CMD) + { + eraseFlag = 1; + } + else if (cmd[0] == CONFIRM_STORAGE_CMD) + { + if (cmd[1]) + write_toc = 1; + else + write_toc = 2; + } + else + { + /* + * Commands that should be forwarded + */ + + /* Ping */ + if (cmd[0] == PONG_CMD) { - if (cmd[1]) - mute_amp(); - else - unmute_amp(); + /* Index of the pong that is supposed to be received from tuxcore */ + static uint8_t pong_received; + /* Counter of the missed pongs */ + static uint8_t pong_missed; + if (pong_received-- < cmd[1]) /* new ping, reset */ + { + pong_received = cmd[1]; + pong_missed = 0; + } + else /* pongs */ + { + pong_missed += pong_received - cmd[1]; + pong_received = cmd[1]; /* resync */ + } + cmd[2] = pong_missed; } - else if (cmd[0] == STORE_SOUND_CMD) + else if (cmd[0] == SLEEP_CMD) { - if (flashPlay) - flashPlay = 0; - flash_state = 1; /* Erasing flash flag */ - programmingFlash = 1; /* Set the flag to enter programming sequence */ + /* XXX sleep commented for now */ + /* Forwards the cmd to the rf CPU */ + /*cmd[0] = SLEEP_ACK_CMD;*/ + /*cmd[1] = 0;*/ + /*cmd[2] = 0;*/ + /*cmd[3] = 0;*/ + /*pre_sleep_delay = 30; [> handle sleep in its own function <]*/ + /*sleep_f = 1;*/ + /*statusFlag = 1;*/ } - else if (cmd[0] == ERASE_FLASH_CMD) - { - eraseFlag = 1; - } - else if (cmd[0] == CONFIRM_STORAGE_CMD) - { - if (cmd[1]) - write_toc = 1; - else - write_toc = 2; - } - /* Drop the command */ - cmd = NULL; + return false; } + return true; } Modified: firmware/tuxaudio/trunk/parser.h =================================================================== --- firmware/tuxaudio/trunk/parser.h 2008-07-02 14:03:43 UTC (rev 1303) +++ firmware/tuxaudio/trunk/parser.h 2008-07-02 15:08:50 UTC (rev 1304) @@ -24,6 +24,6 @@ #include <stdbool.h> -void parse_cmd(uint8_t *cmd); +bool parse_cmd(uint8_t *cmd); #endif /* PARSER_H */ Modified: firmware/tuxaudio/trunk/varis.c =================================================================== --- firmware/tuxaudio/trunk/varis.c 2008-07-02 14:03:43 UTC (rev 1303) +++ firmware/tuxaudio/trunk/varis.c 2008-07-02 15:08:50 UTC (rev 1304) @@ -67,10 +67,6 @@ volatile unsigned char spiCommandFlasg = 0; -volatile unsigned char lockAdaptFifo = 1; - -volatile unsigned char Fifoinert = 0; - uint16_t frame_without_sound = 0; uint16_t frame_without_sound_timeout= 0; uint8_t sound_played = 0; Modified: firmware/tuxaudio/trunk/varis.h =================================================================== --- firmware/tuxaudio/trunk/varis.h 2008-07-02 14:03:43 UTC (rev 1303) +++ firmware/tuxaudio/trunk/varis.h 2008-07-02 15:08:50 UTC (rev 1304) @@ -78,9 +78,6 @@ extern volatile unsigned char spiCommandFlasg; -extern volatile unsigned char lockAdaptFifo; - -extern volatile unsigned char Fifoinert; extern uint16_t frame_without_sound; extern uint16_t frame_without_sound_timeout; extern uint8_t sound_played; |