diff --git a/MSP-EXP430F5438-CC256x/example/gap_inquiry.c b/MSP-EXP430F5438-CC256x/example/gap_inquiry.c index 8e6b68172..821689f17 100644 --- a/MSP-EXP430F5438-CC256x/example/gap_inquiry.c +++ b/MSP-EXP430F5438-CC256x/example/gap_inquiry.c @@ -26,12 +26,12 @@ #define MAX_DEVICES 10 struct device { - bd_addr_t address; - uint16_t clockOffset; - uint32_t classOfDevice; - uint8_t pageScanRepetitionMode; - uint8_t rssi; - uint8_t state; // 0 empty, 1 found, 2 remote name tried, 3 remote name found + bd_addr_t address; + uint16_t clockOffset; + uint32_t classOfDevice; + uint8_t pageScanRepetitionMode; + uint8_t rssi; + uint8_t state; // 0 empty, 1 found, 2 remote name tried, 3 remote name found }; #define INQUIRY_INTERVAL 5 @@ -43,163 +43,163 @@ enum STATE state = INIT; int getDeviceIndexForAddress( bd_addr_t addr){ - int j; - for (j=0; j< deviceCount; j++){ - if (BD_ADDR_CMP(addr, devices[j].address) == 0){ - return j; - } - } - return -1; + int j; + for (j=0; j< deviceCount; j++){ + if (BD_ADDR_CMP(addr, devices[j].address) == 0){ + return j; + } + } + return -1; } void start_scan(void){ - printf("Starting inquiry scan..\n"); - hci_send_cmd(&hci_inquiry, HCI_INQUIRY_LAP, INQUIRY_INTERVAL, 0); + printf("Starting inquiry scan..\n"); + hci_send_cmd(&hci_inquiry, HCI_INQUIRY_LAP, INQUIRY_INTERVAL, 0); } int has_more_remote_name_requests(void){ - int i; - for (i=0;i= 0) continue; - memcpy(devices[deviceCount].address, addr, 6); - devices[deviceCount].pageScanRepetitionMode = packet [3 + numResponses*(6) + i*1]; - if (event == HCI_EVENT_INQUIRY_RESULT){ - devices[deviceCount].classOfDevice = READ_BT_24(packet, 3 + numResponses*(6+1+1+1) + i*3); - devices[deviceCount].clockOffset = READ_BT_16(packet, 3 + numResponses*(6+1+1+1+3) + i*2) & 0x7fff; - devices[deviceCount].rssi = 0; - } else { - devices[deviceCount].classOfDevice = READ_BT_24(packet, 3 + numResponses*(6+1+1) + i*3); - devices[deviceCount].clockOffset = READ_BT_16(packet, 3 + numResponses*(6+1+1+3) + i*2) & 0x7fff; - devices[deviceCount].rssi = packet [3 + numResponses*(6+1+1+3+2) + i*1]; - } - devices[deviceCount].state = REMOTE_NAME_REQUEST; - printf("Device found: %s with COD: 0x%06x, pageScan %u, clock offset 0x%04x, rssi 0x%02x\n", bd_addr_to_str(addr), - devices[deviceCount].classOfDevice, devices[deviceCount].pageScanRepetitionMode, - devices[deviceCount].clockOffset, devices[deviceCount].rssi); - deviceCount++; - } - break; - - case HCI_EVENT_INQUIRY_COMPLETE: - for (i=0;i= 0) continue; + memcpy(devices[deviceCount].address, addr, 6); + devices[deviceCount].pageScanRepetitionMode = packet [3 + numResponses*(6) + i*1]; + if (event == HCI_EVENT_INQUIRY_RESULT){ + devices[deviceCount].classOfDevice = READ_BT_24(packet, 3 + numResponses*(6+1+1+1) + i*3); + devices[deviceCount].clockOffset = READ_BT_16(packet, 3 + numResponses*(6+1+1+1+3) + i*2) & 0x7fff; + devices[deviceCount].rssi = 0; + } else { + devices[deviceCount].classOfDevice = READ_BT_24(packet, 3 + numResponses*(6+1+1) + i*3); + devices[deviceCount].clockOffset = READ_BT_16(packet, 3 + numResponses*(6+1+1+3) + i*2) & 0x7fff; + devices[deviceCount].rssi = packet [3 + numResponses*(6+1+1+3+2) + i*1]; + } + devices[deviceCount].state = REMOTE_NAME_REQUEST; + printf("Device found: %s with COD: 0x%06x, pageScan %u, clock offset 0x%04x, rssi 0x%02x\n", bd_addr_to_str(addr), + devices[deviceCount].classOfDevice, devices[deviceCount].pageScanRepetitionMode, + devices[deviceCount].clockOffset, devices[deviceCount].rssi); + deviceCount++; + } + break; + + case HCI_EVENT_INQUIRY_COMPLETE: + for (i=0;i= 0) { - if (packet[2] == 0) { - printf("Name: '%s'\n", &packet[9]); - devices[index].state = REMOTE_NAME_FETCHED; - } else { - printf("Failed to get name: page timeout\n"); - } - } - if (has_more_remote_name_requests()){ - do_next_remote_name_request(); - break; - } - start_scan(); - break; + case HCI_EVENT_REMOTE_NAME_REQUEST_COMPLETE: + bt_flip_addr(addr, &packet[3]); + int index = getDeviceIndexForAddress(addr); + if (index >= 0) { + if (packet[2] == 0) { + printf("Name: '%s'\n", &packet[9]); + devices[index].state = REMOTE_NAME_FETCHED; + } else { + printf("Failed to get name: page timeout\n"); + } + } + if (has_more_remote_name_requests()){ + do_next_remote_name_request(); + break; + } + start_scan(); + break; - default: - break; - } - break; - - default: - break; - } + default: + break; + } + break; + + default: + break; + } } -void setup(void){ - // stop watchdog timer +static void hw_setup(void){ + // stop watchdog timer WDTCTL = WDTPW + WDTHOLD; //Initialize clock and peripherals halBoardInit(); - halBoardStartXT1(); + halBoardStartXT1(); halBoardSetSystemClock(SYSCLK_16MHZ); // init debug UART @@ -209,29 +209,36 @@ void setup(void){ LED_PORT_OUT |= LED_1 | LED_2; LED_PORT_DIR |= LED_1 | LED_2; - /// GET STARTED with BTstack /// - btstack_memory_init(); + // ready - enable irq used in h4 task + __enable_interrupt(); + +} + +static void btstack_setup(void){ + 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_register_packet_handler(packet_handler); + hci_init(transport, config, control, remote_db); + hci_register_packet_handler(packet_handler); } + // main == setup int main(void) { - setup(); - + hw_setup(); + btstack_setup(); + // turn on! - hci_power_control(HCI_POWER_ON); - + hci_power_control(HCI_POWER_ON); + // go! - run_loop_execute(); + run_loop_execute(); // happy compiler! return 0; diff --git a/MSP-EXP430F5438-CC256x/example/spp_counter.c b/MSP-EXP430F5438-CC256x/example/spp_counter.c index d37de68fb..8339c81a9 100644 --- a/MSP-EXP430F5438-CC256x/example/spp_counter.c +++ b/MSP-EXP430F5438-CC256x/example/spp_counter.c @@ -1,8 +1,8 @@ //***************************************************************************** // -// spp_counter demo - it provides a SPP and sends a counter every second +// spp_counter demo - it provides an SPP and sends a counter every second // -// it doesn't use the LCD to get down to a minimal memory footpring +// it doesn't use the LCD to get down to a minimal memory footprint // //***************************************************************************** @@ -42,62 +42,62 @@ static void packet_handler (void * connection, uint8_t packet_type, uint16_t cha uint8_t rfcomm_channel_nr; uint16_t mtu; - 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) { + 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)){ + } + 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)){ + if (COMMAND_COMPLETE_EVENT(packet, hci_write_local_name)){ hci_discoverable_control(1); break; } break; - case HCI_EVENT_LINK_KEY_REQUEST: - // deny link key request + 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 + hci_send_cmd(&hci_link_key_request_negative_reply, &event_addr); + break; + + 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]); - } 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; + 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]); + } 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 RFCOMM_EVENT_CHANNEL_CLOSED: rfcomm_channel_id = 0; @@ -105,15 +105,20 @@ static void packet_handler (void * connection, uint8_t packet_type, uint16_t cha default: break; - } + } break; default: break; - } + } } -static void heartbeat_handler(struct timer *ts){ +static void run_loop_register_timer(timer_source_t *timer, uint16_t period){ + run_loop_set_timer(timer, period); + run_loop_add_timer(timer); +} + +static void timer_handler(timer_source_t *ts){ if (rfcomm_channel_id){ static int counter = 0; @@ -125,20 +130,26 @@ static void heartbeat_handler(struct timer *ts){ printf("rfcomm_send_internal -> error %d", err); } } - - run_loop_set_timer(ts, HEARTBEAT_PERIOD_MS); - run_loop_add_timer(ts); + + // re-register timer + run_loop_register_timer(ts, HEARTBEAT_PERIOD_MS); } -// main -int main(void) -{ +static void timer_setup(){ + // set one-shot timer + timer_source_t heartbeat; + heartbeat.process = &heartbeat_handler; + run_loop_register_timer(&heartbeat, HEARTBEAT_PERIOD_MS); +} + + +static void hw_setup(){ // stop watchdog timer WDTCTL = WDTPW + WDTHOLD; //Initialize clock and peripherals halBoardInit(); - halBoardStartXT1(); + halBoardStartXT1(); halBoardSetSystemClock(SYSCLK_16MHZ); // init debug UART @@ -147,18 +158,23 @@ int main(void) // init LEDs LED_PORT_OUT |= LED_1 | LED_2; LED_PORT_DIR |= LED_1 | LED_2; - - /// GET STARTED with BTstack /// - btstack_memory_init(); + + // ready - enable irq used in h4 task + __enable_interrupt(); +} + +static void btstack_setup(){ + /// GET STARTED with BTstack /// + 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); @@ -173,28 +189,27 @@ 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 Counter"); 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); - - // set one-shot timer - timer_source_t heartbeat; - heartbeat.process = &heartbeat_handler; - run_loop_set_timer(&heartbeat, HEARTBEAT_PERIOD_MS); - run_loop_add_timer(&heartbeat); - - printf("Run...\n\r"); +} - // ready - enable irq used in h4 task - __enable_interrupt(); - // turn on! - hci_power_control(HCI_POWER_ON); +// main +int main(void){ + hw_setup(); + btstack_setup(); + timer_setup(); + + printf("Run...\n\r"); + + // turn on! + hci_power_control(HCI_POWER_ON); // go! - run_loop_execute(); + run_loop_execute(); // happy compiler! return 0;