From 67cfe3ed6b4c36537daa5b55bf8604093f30f97f Mon Sep 17 00:00:00 2001 From: "matthias.ringwald@gmail.com" Date: Tue, 15 Jan 2013 11:08:45 +0000 Subject: [PATCH] spp_accel rewritten in state machine style --- MSP-EXP430F5438-CC256x/example/spp_accel.c | 198 +++++++++--------- MSP-EXP430F5438-CC256x/example/spp_counter.c | 19 +- .../example/spp_flowcontrol.c | 13 +- 3 files changed, 117 insertions(+), 113 deletions(-) diff --git a/MSP-EXP430F5438-CC256x/example/spp_accel.c b/MSP-EXP430F5438-CC256x/example/spp_accel.c index 2af4fafdb..8900ae2ff 100644 --- a/MSP-EXP430F5438-CC256x/example/spp_accel.c +++ b/MSP-EXP430F5438-CC256x/example/spp_accel.c @@ -1,6 +1,7 @@ //***************************************************************************** // -// accel_demo +// accel_demo - provides a virtual serial port via SPP. On connect, it sends +// the current accelerometer values as fast as possible. // //***************************************************************************** @@ -32,7 +33,6 @@ #include "sdp.h" #include "config.h" -#define HEARTBEAT_PERIOD_MS 1000 #define FONT_HEIGHT 12 // Each character has 13 lines #define FONT_WIDTH 8 @@ -43,6 +43,9 @@ static uint8_t rfcomm_channel_nr = 1; static uint16_t rfcomm_channel_id; static uint8_t spp_service_buffer[100]; +enum STATE {INIT, W4_CONNECTION, W4_CHANNEL_COMPLETE, ACTIVE} ; +enum STATE state = INIT; + // LCD setup void doLCD(void){ //Initialize LCD @@ -98,112 +101,106 @@ static void prepare_accel_packet(){ printf("Accel: X: %04d, Y: %04d, Z: %04d\n\r", accl_x, accl_y, accl_z); } +static void tryToSend(void){ + if (!rfcomm_channel_id) return; + // try send + int err = rfcomm_send_internal(rfcomm_channel_id, (uint8_t *)accel_buffer, sizeof(accel_buffer)); + switch (err){ + case 0: + prepare_accel_packet(); + break; + case BTSTACK_ACL_BUFFERS_FULL: + break; + default: + printf("rfcomm_send_internal() -> err %d\n\r", err); + break; + } +} + // Bluetooth logic static void packet_handler (void * connection, uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){ bd_addr_t event_addr; uint8_t rfcomm_channel_nr; uint16_t mtu; - int err; - switch (packet_type) { - case HCI_EVENT_PACKET: - switch (packet[0]) { - - case BTSTACK_EVENT_STATE: - // bt stack activated, get started - set local name - if (packet[2] == HCI_STATE_WORKING) { - hci_send_cmd(&hci_write_local_name, "BlueMSP-Demo"); - } - break; - - case HCI_EVENT_COMMAND_COMPLETE: - if (COMMAND_COMPLETE_EVENT(packet, hci_read_bd_addr)){ - bt_flip_addr(event_addr, &packet[6]); - printf("BD-ADDR: %s\n\r", bd_addr_to_str(event_addr)); - break; - } - if (COMMAND_COMPLETE_EVENT(packet, hci_write_local_name)){ - hci_discoverable_control(1); - break; - } - break; + uint8_t event = packet[0]; - case HCI_EVENT_LINK_KEY_REQUEST: - // deny link key request - printf("Link key request\n\r"); - bt_flip_addr(event_addr, &packet[2]); - hci_send_cmd(&hci_link_key_request_negative_reply, &event_addr); - break; - - case HCI_EVENT_PIN_CODE_REQUEST: - // inform about pin code request - printLine( "PIN = 0000"); + // handle events, ignore data + if (packet_type != HCI_EVENT_PACKET) return; + + switch(state){ + case INIT: + // bt stack activated, get started - set local name + if (packet[2] == HCI_STATE_WORKING) { + hci_send_cmd(&hci_write_local_name, "BlueMSP-Demo"); + state = W4_CONNECTION; + } + break; + + case W4_CONNECTION: + switch (event) { + case HCI_EVENT_PIN_CODE_REQUEST: + // inform about pin code request printf("Pin code request - using '0000'\n\r"); bt_flip_addr(event_addr, &packet[2]); - hci_send_cmd(&hci_pin_code_request_reply, &event_addr, 4, "0000"); - break; + hci_send_cmd(&hci_pin_code_request_reply, &event_addr, 4, "0000"); + break; case RFCOMM_EVENT_INCOMING_CONNECTION: - // data: event (8), len(8), address(48), channel (8), rfcomm_cid (16) - bt_flip_addr(event_addr, &packet[2]); - rfcomm_channel_nr = packet[8]; - rfcomm_channel_id = READ_BT_16(packet, 9); - printf("RFCOMM channel %u requested for %s\n\r", rfcomm_channel_nr, bd_addr_to_str(event_addr)); + // data: event (8), len(8), address(48), channel (8), rfcomm_cid (16) + bt_flip_addr(event_addr, &packet[2]); + rfcomm_channel_nr = packet[8]; + rfcomm_channel_id = READ_BT_16(packet, 9); + printf("RFCOMM channel %u requested for %s\n\r", rfcomm_channel_nr, bd_addr_to_str(event_addr)); rfcomm_accept_connection_internal(rfcomm_channel_id); - break; - - case RFCOMM_EVENT_OPEN_CHANNEL_COMPLETE: - // data: event(8), len(8), status (8), address (48), server channel(8), rfcomm_cid(16), max frame size(16) - if (packet[2]) { - printf("RFCOMM channel open failed, status %u\n\r", packet[2]); - printLine("Connection failed :("); - } else { - rfcomm_channel_id = READ_BT_16(packet, 12); - mtu = READ_BT_16(packet, 14); - printf("\n\rRFCOMM channel open succeeded. New RFCOMM Channel ID %u, max frame size %u\n\r", rfcomm_channel_id, mtu); - } - break; - - case DAEMON_EVENT_HCI_PACKET_SENT: - case RFCOMM_EVENT_CREDITS: - if (!rfcomm_channel_id) break; - // try send - err = rfcomm_send_internal(rfcomm_channel_id, (uint8_t *)accel_buffer, sizeof(accel_buffer)); - switch (err){ - case 0: - prepare_accel_packet(); - break; - case BTSTACK_ACL_BUFFERS_FULL: - break; - default: - printf("rfcomm_send_internal() -> err %d\n\r", err); - break; - } + state = W4_CHANNEL_COMPLETE; break; - - case RFCOMM_EVENT_CHANNEL_CLOSED: - rfcomm_channel_id = 0; - break; - default: break; - } - break; - + } + + case W4_CHANNEL_COMPLETE: + if ( event != RFCOMM_EVENT_OPEN_CHANNEL_COMPLETE ) break; + + // data: event(8), len(8), status (8), address (48), server channel(8), rfcomm_cid(16), max frame size(16) + if (packet[2]) { + printf("RFCOMM channel open failed, status %u\n\r", packet[2]); + break; + } + + rfcomm_channel_id = READ_BT_16(packet, 12); + mtu = READ_BT_16(packet, 14); + printf("\n\rRFCOMM channel open succeeded. New RFCOMM Channel ID %u, max frame size %u\n\r", rfcomm_channel_id, mtu); + prepare_accel_packet(); + state = ACTIVE; + break; + + case ACTIVE: + switch(event){ + case DAEMON_EVENT_HCI_PACKET_SENT: + case RFCOMM_EVENT_CREDITS: + tryToSend(); + break; + case RFCOMM_EVENT_CHANNEL_CLOSED: + rfcomm_channel_id = 0; + state = W4_CONNECTION; + break; + default: + break; + } + default: break; - } + } } -// main -int main(void) { - +static void hw_setup(){ // stop watchdog timer WDTCTL = WDTPW + WDTHOLD; //Initialize clock and peripherals halBoardInit(); - halBoardStartXT1(); + halBoardStartXT1(); halBoardSetSystemClock(SYSCLK_16MHZ); // Debug UART @@ -218,25 +215,24 @@ int main(void) { // init LEDs LED_PORT_OUT |= LED_1 | LED_2; LED_PORT_DIR |= LED_1 | LED_2; - // show off doLCD(); - - prepare_accel_packet(); +} - printf("Init BTstack...\n\r"); - - /// GET STARTED /// - btstack_memory_init(); +static void btstack_setup(){ + printf("Init BTstack...\n\r"); + + /// GET STARTED /// + btstack_memory_init(); run_loop_init(RUN_LOOP_EMBEDDED); - + // init HCI - hci_transport_t * transport = hci_transport_h4_dma_instance(); - bt_control_t * control = bt_control_cc256x_instance(); + hci_transport_t * transport = hci_transport_h4_dma_instance(); + bt_control_t * control = bt_control_cc256x_instance(); hci_uart_config_t * config = hci_uart_config_cc256x_instance(); remote_device_db_t * remote_db = (remote_device_db_t *) &remote_device_db_memory; - hci_init(transport, config, control, remote_db); - + hci_init(transport, config, control, remote_db); + // use eHCILL bt_control_cc256x_enable_ehcill(1); @@ -251,12 +247,18 @@ int main(void) { // init SDP, create record for SPP and register with SDP sdp_init(); - memset(spp_service_buffer, 0, sizeof(spp_service_buffer)); + memset(spp_service_buffer, 0, sizeof(spp_service_buffer)); service_record_item_t * service_record_item = (service_record_item_t *) spp_service_buffer; sdp_create_spp_service( (uint8_t*) &service_record_item->service_record, 1, "SPP Accel"); printf("SDP service buffer size: %u\n\r", (uint16_t) (sizeof(service_record_item_t) + de_get_len((uint8_t*) &service_record_item->service_record))); sdp_register_service_internal(NULL, service_record_item); - +} + +// main +int main(void) { + hw_setup(); + btstack_setup(); + // ready - enable irq used in h4 task __enable_interrupt(); diff --git a/MSP-EXP430F5438-CC256x/example/spp_counter.c b/MSP-EXP430F5438-CC256x/example/spp_counter.c index 2711929c5..1d7b14203 100644 --- a/MSP-EXP430F5438-CC256x/example/spp_counter.c +++ b/MSP-EXP430F5438-CC256x/example/spp_counter.c @@ -111,12 +111,13 @@ static void packet_handler (uint8_t packet_type, uint8_t *packet, uint16_t size) // data: event(8), len(8), status (8), address (48), server channel(8), rfcomm_cid(16), max frame size(16) if (packet[2]) { printf("RFCOMM channel open failed, status %u\n\r", packet[2]); - } else { - rfcomm_channel_id = READ_BT_16(packet, 12); - mtu = READ_BT_16(packet, 14); - printf("\n\rRFCOMM channel open succeeded. New RFCOMM Channel ID %u, max frame size %u\n\r", rfcomm_channel_id, mtu); - state = ACTIVE; - } + break; + } + + rfcomm_channel_id = READ_BT_16(packet, 12); + mtu = READ_BT_16(packet, 14); + printf("\n\rRFCOMM channel open succeeded. New RFCOMM Channel ID %u, max frame size %u\n\r", rfcomm_channel_id, mtu); + state = ACTIVE; break; case ACTIVE: @@ -172,9 +173,6 @@ static void hw_setup(){ // init LEDs LED_PORT_OUT |= LED_1 | LED_2; LED_PORT_DIR |= LED_1 | LED_2; - - // ready - enable irq used in h4 task - __enable_interrupt(); } static void btstack_setup(){ @@ -216,6 +214,9 @@ int main(void){ hw_setup(); btstack_setup(); timer_setup(); + + // ready - enable irq used in h4 task + __enable_interrupt(); printf("Run...\n\r"); diff --git a/MSP-EXP430F5438-CC256x/example/spp_flowcontrol.c b/MSP-EXP430F5438-CC256x/example/spp_flowcontrol.c index ffe7457ad..b294b5f99 100644 --- a/MSP-EXP430F5438-CC256x/example/spp_flowcontrol.c +++ b/MSP-EXP430F5438-CC256x/example/spp_flowcontrol.c @@ -106,12 +106,13 @@ static void packet_handler (void * connection, uint8_t packet_type, uint16_t cha // data: event(8), len(8), status (8), address (48), server channel(8), rfcomm_cid(16), max frame size(16) if (packet[2]) { printf("RFCOMM channel open failed, status %u\n\r", packet[2]); - } else { - rfcomm_channel_id = READ_BT_16(packet, 12); - mtu = READ_BT_16(packet, 14); - printf("\n\rRFCOMM channel open succeeded. New RFCOMM Channel ID %u, max frame size %u\n\r", rfcomm_channel_id, mtu); - state = ACTIVE; - } + break; + } + + rfcomm_channel_id = READ_BT_16(packet, 12); + mtu = READ_BT_16(packet, 14); + printf("\n\rRFCOMM channel open succeeded. New RFCOMM Channel ID %u, max frame size %u\n\r", rfcomm_channel_id, mtu); + state = ACTIVE; break; case ACTIVE: