diff --git a/include/bioloid_dyn_slave.h b/include/bioloid_dyn_slave.h index 1bf96b38b4e854885652e380237da13898b933a1..f6d7158fffbbefc629000aafac9d2dada26f50f7 100644 --- a/include/bioloid_dyn_slave.h +++ b/include/bioloid_dyn_slave.h @@ -10,9 +10,9 @@ extern "C" { #include "dynamixel_slave.h" #include "comm.h" -extern TDynamixelSlave bioloid_dyn_slave; - void bioloid_dyn_slave_init(void); +void bioloid_dyn_slave_start(void); +void bioloid_dyn_slave_stop(void); void bioloid_dyn_slave_set_int(void); void bioloid_dyn_slave_clear_int(void); uint8_t bioloid_dyn_slave_is_int_set(void); diff --git a/include/bioloid_registers.h b/include/bioloid_registers.h index 4b606f9d3bd2270a26bd69d946850f13439eca09..c18bb7d75d894c644b1df97e7d1a1b1fe63f8c8d 100644 --- a/include/bioloid_registers.h +++ b/include/bioloid_registers.h @@ -54,8 +54,8 @@ typedef enum { #define GPIO_VALUE 0x02 #define GPIO_TOGGLE 0x04 #define GPIO_BLINK 0x08 -#define GPIO_INT_EN 0x04 -#define GPIO_INT_FLAG 0x08 +#define GPIO_INT_EN 0x02 +#define GPIO_INT_FLAG 0x04 #ifdef __cplusplus } diff --git a/include/gpio.h b/include/gpio.h index 4f5ea59546abdde0bca4079660f0fadd901c248c..5200635314774f09a1aae2f9149d844f971aea27 100644 --- a/include/gpio.h +++ b/include/gpio.h @@ -21,7 +21,8 @@ void gpio_blink_led(led_t led_id, int16_t period_ms); uint8_t gpio_is_pushbutton_pressed(pushbutton_t pb_id); void gpio_set_pushbutton_callback(pushbutton_t pb_id,void (*callback)(void)); // operation functions -void gpio_process_cmd(unsigned short int address,unsigned short int length,unsigned char *data); +void gpio_process_read_cmd(unsigned short int address,unsigned short int length,unsigned char *data); +void gpio_process_write_cmd(unsigned short int address,unsigned short int length,unsigned char *data); #ifdef __cplusplus } diff --git a/include/ram.h b/include/ram.h index 3b350e370257bc192a00a155c8ac68b6f17ee3af..4d53763ff5c159e053f216b0bb98de6373098626 100644 --- a/include/ram.h +++ b/include/ram.h @@ -28,7 +28,7 @@ uint8_t ram_write_byte(uint8_t address, uint8_t data); uint8_t ram_write_word(uint8_t address, uint16_t data); uint8_t ram_write_table(uint8_t address, uint8_t length,uint8_t *data); inline uint8_t ram_in_range(uint8_t reg,uint8_t address,uint8_t length); -inline uint8_t ram_in_window(uint8_t start_reg,uint8_t reg_length,uint8_t start_address,uint8_t address_length); +uint8_t ram_in_window(uint8_t start_reg,uint8_t reg_length,uint8_t start_address,uint8_t address_length); #ifdef __cplusplus } diff --git a/src/bioloid_dyn_slave.c b/src/bioloid_dyn_slave.c index a4edced5d1a85756ec7e3962d8f8a4f4f4dd8714..ab61ca3450e304032972197e187cf4b199df1711 100644 --- a/src/bioloid_dyn_slave.c +++ b/src/bioloid_dyn_slave.c @@ -10,12 +10,19 @@ #define DYN_SLAVE_EXT_INT_GPIO_PORT GPIOE #define DYN_SLAVE_EXT_INT_EN_GPIO_CLK __HAL_RCC_GPIOE_CLK_ENABLE() +/* timer for the execution of the dynamixel slave loop */ +#define DYN_SLAVE_TIMER TIM7 +#define DYN_SLAVE_TIMER_IRQn TIM7_IRQn +#define DYN_SLAVE_TIMER_IRQHandler TIM7_IRQHandler +#define DYN_SLAVE_TIMER_ENABLE_CLK __HAL_RCC_TIM7_CLK_ENABLE() + /* private variables */ TDynamixelSlave bioloid_dyn_slave; TTime bioloid_dyn_slave_timer; TComm bioloid_dyn_slave_comm; UART_InitTypeDef bioloid_comm_init; -uint8_t bioloid_slave_int_state; +TIM_HandleTypeDef bioloid_dyn_slave_tim_handle; +uint8_t bioloid_slave_int_count; // private functions unsigned char bioloid_on_read(unsigned short int address,unsigned short int length,unsigned char *data) @@ -23,6 +30,9 @@ unsigned char bioloid_on_read(unsigned short int address,unsigned short int leng unsigned char error; /* dynamixel slave internal operation registers */ error=ram_read_table(address,length,data); + // GPIO commands + if(ram_in_window(GPIO_BASE_ADDRESS,GPIO_MEM_LENGTH,address,length)) + gpio_process_read_cmd(address,length,data); return error; } @@ -55,7 +65,7 @@ unsigned char bioloid_on_write(unsigned short int address,unsigned short int len } // GPIO commands if(ram_in_window(GPIO_BASE_ADDRESS,GPIO_MEM_LENGTH,address,length)) - gpio_process_cmd(address,length,data); + gpio_process_write_cmd(address,length,data); // write eeprom for(i=address,j=0;i<LAST_EEPROM_OFFSET && i<(address+length);i++,j++) EE_WriteVariable(i,data[j]); @@ -63,6 +73,19 @@ unsigned char bioloid_on_write(unsigned short int address,unsigned short int len return 0x00; } +/* interrupt service routines */ +void DYN_SLAVE_TIMER_IRQHandler(void) +{ + if(__HAL_TIM_GET_FLAG(&bioloid_dyn_slave_tim_handle, TIM_FLAG_UPDATE) != RESET) + { + if(__HAL_TIM_GET_IT_SOURCE(&bioloid_dyn_slave_tim_handle, TIM_IT_UPDATE) !=RESET) + { + __HAL_TIM_CLEAR_IT(&bioloid_dyn_slave_tim_handle, TIM_IT_UPDATE); + dyn_slave_loop(&bioloid_dyn_slave); + } + } +} + // public functions void bioloid_dyn_slave_init(void) { @@ -70,7 +93,7 @@ void bioloid_dyn_slave_init(void) GPIO_InitTypeDef GPIO_InitStructure; // initialize private variables - bioloid_slave_int_state=0; + bioloid_slave_int_count=0; // initialize timer structure time_init(&bioloid_dyn_slave_timer,bioloid_time_get_counts_per_us(),bioloid_time_get_counts); @@ -102,25 +125,53 @@ void bioloid_dyn_slave_init(void) /* initialize the external interrupt pin */ DYN_SLAVE_EXT_INT_EN_GPIO_CLK; GPIO_InitStructure.Pin = DYN_SLAVE_EXT_INT_PIN; - GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_OD; + GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStructure.Pull = GPIO_NOPULL; GPIO_InitStructure.Speed = GPIO_SPEED_HIGH; HAL_GPIO_Init(DYN_SLAVE_EXT_INT_GPIO_PORT, &GPIO_InitStructure); + HAL_GPIO_WritePin(DYN_SLAVE_EXT_INT_GPIO_PORT,DYN_SLAVE_EXT_INT_PIN,GPIO_PIN_SET); + + /* initialize timer for the execution of the dynamixel slave loop */ + DYN_SLAVE_TIMER_ENABLE_CLK; + bioloid_dyn_slave_tim_handle.Instance=DYN_SLAVE_TIMER; + bioloid_dyn_slave_tim_handle.Init.Period = 1000; + bioloid_dyn_slave_tim_handle.Init.Prescaler = 84; + bioloid_dyn_slave_tim_handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + bioloid_dyn_slave_tim_handle.Init.CounterMode = TIM_COUNTERMODE_UP; + HAL_TIM_Base_Init(&bioloid_dyn_slave_tim_handle); + // initialize the timer interrupts + HAL_NVIC_SetPriority(DYN_SLAVE_TIMER_IRQn, 3, 2); + HAL_NVIC_EnableIRQ(DYN_SLAVE_TIMER_IRQn); +} + +void bioloid_dyn_slave_start(void) +{ + HAL_TIM_Base_Start_IT(&bioloid_dyn_slave_tim_handle); +} + +void bioloid_dyn_slave_stop(void) +{ + HAL_TIM_Base_Stop_IT(&bioloid_dyn_slave_tim_handle); } void bioloid_dyn_slave_set_int(void) { - HAL_GPIO_WritePin(DYN_SLAVE_EXT_INT_GPIO_PORT,DYN_SLAVE_EXT_INT_PIN,GPIO_PIN_RESET); - bioloid_slave_int_state=1; + if(bioloid_slave_int_count==0) + HAL_GPIO_WritePin(DYN_SLAVE_EXT_INT_GPIO_PORT,DYN_SLAVE_EXT_INT_PIN,GPIO_PIN_RESET); + bioloid_slave_int_count++; } void bioloid_dyn_slave_clear_int(void) { - HAL_GPIO_WritePin(DYN_SLAVE_EXT_INT_GPIO_PORT,DYN_SLAVE_EXT_INT_PIN,GPIO_PIN_SET); - bioloid_slave_int_state=0; + bioloid_slave_int_count--; + if(bioloid_slave_int_count==0) + HAL_GPIO_WritePin(DYN_SLAVE_EXT_INT_GPIO_PORT,DYN_SLAVE_EXT_INT_PIN,GPIO_PIN_SET); } uint8_t bioloid_dyn_slave_is_int_set(void) { - return bioloid_slave_int_state; + if(bioloid_slave_int_count==0) + return 0x00; + else + return 0x01; } diff --git a/src/bioloid_stm32.c b/src/bioloid_stm32.c index e5bcd5387cf7547a48eab87c9ec95bd5814df588..7b8d3f0a3e93d31a03ad2155a719893d79f8ed72 100644 --- a/src/bioloid_stm32.c +++ b/src/bioloid_stm32.c @@ -18,10 +18,8 @@ int32_t main(void) bioloid_time_init(); /* initialize the dynamixel slave interface */ bioloid_dyn_slave_init(); + bioloid_dyn_slave_start(); - while(1) - { - dyn_slave_loop(&bioloid_dyn_slave); - } + while(1); } diff --git a/src/gpio.c b/src/gpio.c index 3dd9b2587abb5eb3ceaf79582a2eaf7bb8561596..95dd2f500ccf88431b5da50437873346b7e6246f 100644 --- a/src/gpio.c +++ b/src/gpio.c @@ -1,5 +1,6 @@ #include "gpio.h" #include "ram.h" +#include "bioloid_dyn_slave.h" #define ENABLE_LED_TX_GPIO_CLK __HAL_RCC_GPIOE_CLK_ENABLE() #define LED_TX_PIN GPIO_PIN_10 @@ -79,6 +80,9 @@ void GPI_EXTI1_IRQHandler(void) } else { + ram_data[BIOLOID_RESET_PB_CNTRL]|=GPIO_INT_FLAG; + if(ram_data[BIOLOID_RESET_PB_CNTRL]&GPIO_INT_EN) + bioloid_dyn_slave_set_int(); } } if(__HAL_GPIO_EXTI_GET_IT(USER_PB_PIN) != RESET) @@ -91,6 +95,12 @@ void GPI_EXTI1_IRQHandler(void) } else { + ram_data[BIOLOID_USER_PB_CNTRL]|=GPIO_INT_FLAG; + if(ram_data[BIOLOID_USER_PB_CNTRL]&GPIO_INT_EN) + { + bioloid_dyn_slave_set_int(); + gpio_toggle_led(TXD_LED); + } } } } @@ -107,6 +117,9 @@ void GPI_EXTI2_IRQHandler(void) } else { + ram_data[BIOLOID_START_PB_CNTRL]|=GPIO_INT_FLAG; + if(ram_data[BIOLOID_START_PB_CNTRL]&GPIO_INT_EN) + bioloid_dyn_slave_set_int(); } } } @@ -123,6 +136,9 @@ void GPI_EXTI3_IRQHandler(void) } else { + ram_data[BIOLOID_MODE_PB_CNTRL]|=GPIO_INT_FLAG; + if(ram_data[BIOLOID_MODE_PB_CNTRL]&GPIO_INT_EN) + bioloid_dyn_slave_set_int(); } } } @@ -139,10 +155,10 @@ void GPO_TIMER_IRQHandler(void) capture = HAL_TIM_ReadCapturedValue(&GPO_TIM_Handle, TIM_CHANNEL_1); __HAL_TIM_SET_COMPARE(&GPO_TIM_Handle, TIM_CHANNEL_1, (capture + led_tx_period)); HAL_GPIO_TogglePin(LED_TX_GPIO_PORT,LED_TX_PIN); - if(ram_data[BIOLOID_TXD_LED_CNTRL]&0x02) - ram_data[BIOLOID_TXD_LED_CNTRL]&=0xFD; + if(ram_data[BIOLOID_TXD_LED_CNTRL]&GPIO_VALUE) + ram_data[BIOLOID_TXD_LED_CNTRL]&=(~GPIO_VALUE); else - ram_data[BIOLOID_TXD_LED_CNTRL]|=0x02; + ram_data[BIOLOID_TXD_LED_CNTRL]|=GPIO_VALUE; } } if(__HAL_TIM_GET_FLAG(&GPO_TIM_Handle, TIM_FLAG_CC2) != RESET) @@ -153,10 +169,10 @@ void GPO_TIMER_IRQHandler(void) capture = HAL_TIM_ReadCapturedValue(&GPO_TIM_Handle, TIM_CHANNEL_2); __HAL_TIM_SET_COMPARE(&GPO_TIM_Handle, TIM_CHANNEL_2, (capture + led_rx_period)); HAL_GPIO_TogglePin(LED_RX_GPIO_PORT,LED_RX_PIN); - if(ram_data[BIOLOID_RXD_LED_CNTRL]&0x02) - ram_data[BIOLOID_RXD_LED_CNTRL]&=0xFD; + if(ram_data[BIOLOID_RXD_LED_CNTRL]&GPIO_VALUE) + ram_data[BIOLOID_RXD_LED_CNTRL]&=(~GPIO_VALUE); else - ram_data[BIOLOID_RXD_LED_CNTRL]|=0x02; + ram_data[BIOLOID_RXD_LED_CNTRL]|=GPIO_VALUE; } } if(__HAL_TIM_GET_FLAG(&GPO_TIM_Handle, TIM_FLAG_CC3) != RESET) @@ -167,10 +183,10 @@ void GPO_TIMER_IRQHandler(void) capture = HAL_TIM_ReadCapturedValue(&GPO_TIM_Handle, TIM_CHANNEL_3); __HAL_TIM_SET_COMPARE(&GPO_TIM_Handle, TIM_CHANNEL_3, (capture + led_usr1_period)); HAL_GPIO_TogglePin(LED_USR1_GPIO_PORT,LED_USR1_PIN); - if(ram_data[BIOLOID_USER1_LED_CNTRL]&0x02) - ram_data[BIOLOID_USER1_LED_CNTRL]&=0xFD; + if(ram_data[BIOLOID_USER1_LED_CNTRL]&GPIO_VALUE) + ram_data[BIOLOID_USER1_LED_CNTRL]&=(~GPIO_VALUE); else - ram_data[BIOLOID_USER1_LED_CNTRL]|=0x02; + ram_data[BIOLOID_USER1_LED_CNTRL]|=GPIO_VALUE; } } if(__HAL_TIM_GET_FLAG(&GPO_TIM_Handle, TIM_FLAG_CC4) != RESET) @@ -181,10 +197,10 @@ void GPO_TIMER_IRQHandler(void) capture = HAL_TIM_ReadCapturedValue(&GPO_TIM_Handle, TIM_CHANNEL_4); __HAL_TIM_SET_COMPARE(&GPO_TIM_Handle, TIM_CHANNEL_4, (capture + led_usr2_period)); HAL_GPIO_TogglePin(LED_USR2_GPIO_PORT,LED_USR2_PIN); - if(ram_data[BIOLOID_USER2_LED_CNTRL]&0x02) - ram_data[BIOLOID_USER2_LED_CNTRL]&=0xFD; + if(ram_data[BIOLOID_USER2_LED_CNTRL]&GPIO_VALUE) + ram_data[BIOLOID_USER2_LED_CNTRL]&=(~GPIO_VALUE); else - ram_data[BIOLOID_USER2_LED_CNTRL]|=0x02; + ram_data[BIOLOID_USER2_LED_CNTRL]|=GPIO_VALUE; } } /* TIM Update event */ @@ -278,13 +294,13 @@ void gpio_init(void) __HAL_GPIO_EXTI_CLEAR_IT(RESET_PB_PIN); if(__HAL_GPIO_EXTI_GET_IT(USER_PB_PIN) != RESET) __HAL_GPIO_EXTI_CLEAR_IT(USER_PB_PIN); - HAL_NVIC_SetPriority(GPI_EXTI1_IRQn, 3, 0); + HAL_NVIC_SetPriority(GPI_EXTI1_IRQn, 3, 3); HAL_NVIC_EnableIRQ(GPI_EXTI1_IRQn); - HAL_NVIC_SetPriority(GPI_EXTI2_IRQn, 3, 0); + HAL_NVIC_SetPriority(GPI_EXTI2_IRQn, 3, 3); HAL_NVIC_EnableIRQ(GPI_EXTI2_IRQn); - HAL_NVIC_SetPriority(GPI_EXTI3_IRQn, 3, 0); + HAL_NVIC_SetPriority(GPI_EXTI3_IRQn, 3, 3); HAL_NVIC_EnableIRQ(GPI_EXTI3_IRQn); /* LED's timer configuration */ @@ -298,7 +314,7 @@ void gpio_init(void) GPO_TIM_Handle.Init.RepetitionCounter=0; HAL_TIM_Base_Init(&GPO_TIM_Handle); // initialize the timer interrupts - HAL_NVIC_SetPriority(GPO_TIMER_IRQn, 3, 1); + HAL_NVIC_SetPriority(GPO_TIMER_IRQn, 3, 3); HAL_NVIC_EnableIRQ(GPO_TIMER_IRQn); /* use the internal clock */ sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; @@ -509,14 +525,46 @@ void gpio_set_pushbutton_callback(pushbutton_t pb_id,void (*callback)(void)) } } -void gpio_process_cmd(unsigned short int address,unsigned short int length,unsigned char *data) +void gpio_process_read_cmd(unsigned short int address,unsigned short int length,unsigned char *data) +{ + if(ram_in_range(BIOLOID_RESET_PB_CNTRL,address,length)) + if(!(ram_data[BIOLOID_RESET_PB_CNTRL]&GPIO_INT_USED))/* GPIO is not internally used */ + { + ram_data[BIOLOID_RESET_PB_CNTRL]&=(~GPIO_INT_FLAG); + if(ram_data[BIOLOID_RESET_PB_CNTRL]&GPIO_INT_EN) + bioloid_dyn_slave_clear_int(); + } + if(ram_in_range(BIOLOID_USER_PB_CNTRL,address,length)) + if(!(ram_data[BIOLOID_USER_PB_CNTRL]&GPIO_INT_USED))/* GPIO is not internally used */ + { + ram_data[BIOLOID_USER_PB_CNTRL]&=(~GPIO_INT_FLAG); + if(ram_data[BIOLOID_USER_PB_CNTRL]&GPIO_INT_EN) + bioloid_dyn_slave_clear_int(); + } + if(ram_in_range(BIOLOID_START_PB_CNTRL,address,length)) + if(!(ram_data[BIOLOID_START_PB_CNTRL]&GPIO_INT_USED))/* GPIO is not internally used */ + { + ram_data[BIOLOID_START_PB_CNTRL]&=(~GPIO_INT_FLAG); + if(ram_data[BIOLOID_START_PB_CNTRL]&GPIO_INT_EN) + bioloid_dyn_slave_clear_int(); + } + if(ram_in_range(BIOLOID_MODE_PB_CNTRL,address,length)) + if(!(ram_data[BIOLOID_MODE_PB_CNTRL]&GPIO_INT_USED))/* GPIO is not internally used */ + { + ram_data[BIOLOID_MODE_PB_CNTRL]&=(~GPIO_INT_FLAG); + if(ram_data[BIOLOID_MODE_PB_CNTRL]&GPIO_INT_EN) + bioloid_dyn_slave_clear_int(); + } +} + +void gpio_process_write_cmd(unsigned short int address,unsigned short int length,unsigned char *data) { uint16_t period; /* LED's */ if(ram_in_range(BIOLOID_USER1_LED_CNTRL,address,length)) { - if(!ram_data[BIOLOID_USER1_LED_CNTRL]&GPIO_INT_USED)/* GPIO is not internally used */ + if(!(ram_data[BIOLOID_USER1_LED_CNTRL]&GPIO_INT_USED))/* GPIO is not internally used */ { period=led_usr1_period; if(ram_in_range(BIOLOID_USER1_LED_PERIOD_L,address,length)) @@ -531,22 +579,22 @@ void gpio_process_cmd(unsigned short int address,unsigned short int length,unsig if(data[BIOLOID_USER1_LED_CNTRL-address]&GPIO_TOGGLE) { gpio_toggle_led(USER1_LED); - if(ram_data[BIOLOID_USER1_LED_CNTRL]&0x02) - ram_data[BIOLOID_USER1_LED_CNTRL]&=0xFD; + if(ram_data[BIOLOID_USER1_LED_CNTRL]&GPIO_VALUE) + ram_data[BIOLOID_USER1_LED_CNTRL]&=(~GPIO_VALUE); else - ram_data[BIOLOID_USER1_LED_CNTRL]|=0x02; + ram_data[BIOLOID_USER1_LED_CNTRL]|=GPIO_VALUE; } else { if(data[BIOLOID_USER1_LED_CNTRL-address]&GPIO_VALUE) { gpio_set_led(USER1_LED); - ram_data[BIOLOID_USER1_LED_CNTRL]|=0x02; + ram_data[BIOLOID_USER1_LED_CNTRL]|=GPIO_VALUE; } else { gpio_clear_led(USER1_LED); - ram_data[BIOLOID_USER1_LED_CNTRL]&=0xFD; + ram_data[BIOLOID_USER1_LED_CNTRL]&=(~GPIO_VALUE); } } } @@ -554,7 +602,7 @@ void gpio_process_cmd(unsigned short int address,unsigned short int length,unsig } if(ram_in_range(BIOLOID_USER2_LED_CNTRL,address,length)) { - if(!ram_data[BIOLOID_USER2_LED_CNTRL]&GPIO_INT_USED)/* GPIO is not internally used */ + if(!(ram_data[BIOLOID_USER2_LED_CNTRL]&GPIO_INT_USED))/* GPIO is not internally used */ { period=led_usr2_period; if(ram_in_range(BIOLOID_USER2_LED_PERIOD_L,address,length)) @@ -569,22 +617,22 @@ void gpio_process_cmd(unsigned short int address,unsigned short int length,unsig if(data[BIOLOID_USER2_LED_CNTRL-address]&GPIO_TOGGLE) { gpio_toggle_led(USER2_LED); - if(ram_data[BIOLOID_USER2_LED_CNTRL]&0x02) - ram_data[BIOLOID_USER2_LED_CNTRL]&=0xFD; + if(ram_data[BIOLOID_USER2_LED_CNTRL]&GPIO_VALUE) + ram_data[BIOLOID_USER2_LED_CNTRL]&=(~GPIO_VALUE); else - ram_data[BIOLOID_USER2_LED_CNTRL]|=0x02; + ram_data[BIOLOID_USER2_LED_CNTRL]|=GPIO_VALUE; } else { if(data[BIOLOID_USER2_LED_CNTRL-address]&GPIO_VALUE) { gpio_set_led(USER2_LED); - ram_data[BIOLOID_USER2_LED_CNTRL]|=0x02; + ram_data[BIOLOID_USER2_LED_CNTRL]|=GPIO_VALUE; } else { gpio_clear_led(USER2_LED); - ram_data[BIOLOID_USER2_LED_CNTRL]&=0xFD; + ram_data[BIOLOID_USER2_LED_CNTRL]&=(~GPIO_VALUE); } } } @@ -592,9 +640,9 @@ void gpio_process_cmd(unsigned short int address,unsigned short int length,unsig } if(ram_in_range(BIOLOID_RXD_LED_CNTRL,address,length)) { - if(!ram_data[BIOLOID_RXD_LED_CNTRL]&GPIO_INT_USED)/* GPIO is not internally used */ + if(!(ram_data[BIOLOID_RXD_LED_CNTRL]&GPIO_INT_USED))/* GPIO is not internally used */ { - period=led_usr1_period; + period=led_rx_period; if(ram_in_range(BIOLOID_RXD_LED_PERIOD_L,address,length)) period=(period&0xFF00)+data[BIOLOID_RXD_LED_PERIOD_L-address]; if(ram_in_range(BIOLOID_RXD_LED_PERIOD_H,address,length)) @@ -607,22 +655,22 @@ void gpio_process_cmd(unsigned short int address,unsigned short int length,unsig if(data[BIOLOID_RXD_LED_CNTRL-address]&GPIO_TOGGLE) { gpio_toggle_led(RXD_LED); - if(ram_data[BIOLOID_RXD_LED_CNTRL]&0x02) - ram_data[BIOLOID_RXD_LED_CNTRL]&=0xFD; + if(ram_data[BIOLOID_RXD_LED_CNTRL]&GPIO_VALUE) + ram_data[BIOLOID_RXD_LED_CNTRL]&=(~GPIO_VALUE); else - ram_data[BIOLOID_RXD_LED_CNTRL]|=0x02; + ram_data[BIOLOID_RXD_LED_CNTRL]|=GPIO_VALUE; } else { if(data[BIOLOID_RXD_LED_CNTRL-address]&GPIO_VALUE) { gpio_set_led(RXD_LED); - ram_data[BIOLOID_RXD_LED_CNTRL]|=0x02; + ram_data[BIOLOID_RXD_LED_CNTRL]|=GPIO_VALUE; } else { gpio_clear_led(RXD_LED); - ram_data[BIOLOID_RXD_LED_CNTRL]&=0xFD; + ram_data[BIOLOID_RXD_LED_CNTRL]&=(~GPIO_VALUE); } } } @@ -630,9 +678,9 @@ void gpio_process_cmd(unsigned short int address,unsigned short int length,unsig } if(ram_in_range(BIOLOID_TXD_LED_CNTRL,address,length)) { - if(!ram_data[BIOLOID_TXD_LED_CNTRL]&GPIO_INT_USED)/* GPIO is not internally used */ + if(!(ram_data[BIOLOID_TXD_LED_CNTRL]&GPIO_INT_USED))/* GPIO is not internally used */ { - period=led_usr1_period; + period=led_tx_period; if(ram_in_range(BIOLOID_TXD_LED_PERIOD_L,address,length)) period=(period&0xFF00)+data[BIOLOID_TXD_LED_PERIOD_L-address]; if(ram_in_range(BIOLOID_TXD_LED_PERIOD_H,address,length)) @@ -645,22 +693,22 @@ void gpio_process_cmd(unsigned short int address,unsigned short int length,unsig if(data[BIOLOID_TXD_LED_CNTRL-address]&GPIO_TOGGLE) { gpio_toggle_led(TXD_LED); - if(ram_data[BIOLOID_TXD_LED_CNTRL]&0x02) - ram_data[BIOLOID_TXD_LED_CNTRL]&=0xFD; + if(ram_data[BIOLOID_TXD_LED_CNTRL]&GPIO_VALUE) + ram_data[BIOLOID_TXD_LED_CNTRL]&=(~GPIO_VALUE); else - ram_data[BIOLOID_TXD_LED_CNTRL]|=0x02; + ram_data[BIOLOID_TXD_LED_CNTRL]|=GPIO_VALUE; } else { if(data[BIOLOID_TXD_LED_CNTRL-address]&GPIO_VALUE) { gpio_set_led(TXD_LED); - ram_data[BIOLOID_TXD_LED_CNTRL]|=0x02; + ram_data[BIOLOID_TXD_LED_CNTRL]|=GPIO_VALUE; } else { gpio_clear_led(TXD_LED); - ram_data[BIOLOID_TXD_LED_CNTRL]&=0xFD; + ram_data[BIOLOID_TXD_LED_CNTRL]&=(~GPIO_VALUE); } } } @@ -668,12 +716,18 @@ void gpio_process_cmd(unsigned short int address,unsigned short int length,unsig } /* pushbuttons */ if(ram_in_range(BIOLOID_RESET_PB_CNTRL,address,length)) - { - if(!ram_data[BIOLOID_RESET_PB_CNTRL]&GPIO_INT_USED)/* GPIO is not internally used */ + if(!(ram_data[BIOLOID_RESET_PB_CNTRL]&GPIO_INT_USED))/* GPIO is not internally used */ + ram_data[BIOLOID_RESET_PB_CNTRL]=data[BIOLOID_RESET_PB_CNTRL-address]; + if(ram_in_range(BIOLOID_USER_PB_CNTRL,address,length)) + if(!(ram_data[BIOLOID_USER_PB_CNTRL]&GPIO_INT_USED))/* GPIO is not internally used */ { - if(data[BIOLOID_RESET_PB_CNTRL-address]&GPIO_INT_EN) - { - } + gpio_toggle_led(RXD_LED); + ram_data[BIOLOID_USER_PB_CNTRL]=data[BIOLOID_USER_PB_CNTRL-address]; } - } + if(ram_in_range(BIOLOID_START_PB_CNTRL,address,length)) + if(!(ram_data[BIOLOID_START_PB_CNTRL]&GPIO_INT_USED))/* GPIO is not internally used */ + ram_data[BIOLOID_START_PB_CNTRL]=data[BIOLOID_START_PB_CNTRL-address]; + if(ram_in_range(BIOLOID_MODE_PB_CNTRL,address,length)) + if(!(ram_data[BIOLOID_MODE_PB_CNTRL]&GPIO_INT_USED))/* GPIO is not internally used */ + ram_data[BIOLOID_MODE_PB_CNTRL]=data[BIOLOID_MODE_PB_CNTRL-address]; } diff --git a/src/ram.c b/src/ram.c index 5d4eb01c505425ac43254b0cd2e736212e34c7de..cce0279314fb3f2a000ae4c4a025556e4433469f 100644 --- a/src/ram.c +++ b/src/ram.c @@ -115,10 +115,13 @@ inline uint8_t ram_in_range(uint8_t reg,uint8_t address,uint8_t length) return 0x00; } -inline uint8_t ram_in_window(uint8_t start_reg,uint8_t reg_length,uint8_t start_address,uint8_t address_length) +uint8_t ram_in_window(uint8_t start_reg,uint8_t reg_length,uint8_t start_address,uint8_t address_length) { - if((start_reg>=start_address && start_reg<(start_address+address_length)) || - ((start_reg+reg_length)>=start_address && (start_reg+reg_length)<(start_address+address_length))) + uint8_t end_reg=start_reg+reg_length; + uint8_t end_address=start_address+address_length; + + if((start_reg>=start_address && start_reg<end_address) || (end_reg>=start_address && end_reg<end_address) || + (start_address>=start_reg && start_address<end_reg) || (end_address>=start_reg && end_address<end_reg)) return 0x01; else return 0x00;