Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of football_project by
main.cpp
- Committer:
- AntonLS
- Date:
- 2015-04-19
- Revision:
- 9:95dc84e9fb7f
- Parent:
- 8:d5d055be2bb8
- Child:
- 10:72ceef287b0f
File content as of revision 9:95dc84e9fb7f:
/* * TA test * */ /* mbed Microcontroller Library * Copyright (c) 2006-2013 ARM Limited * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "mbed.h" #include "BLEDevice.h" #include "DFUService.h" #include "UARTService.h" #include "DeviceInformationService.h" #include "MTSSerialFlowControl.h" #include "PhoneAppIO.h" #define NEED_CONSOLE_OUTPUT 0 /* Set this if you need debug messages on the console; * it will have an impact on code-size and power consumption. */ // #define LOOPBACK_MODE // Loopback mode #if NEED_CONSOLE_OUTPUT #define DEBUG(...) { printf(__VA_ARGS__); } #else #define DEBUG(...) /* nothing */ #endif /* #if NEED_CONSOLE_OUTPUT */ BLEDevice ble; #define TXRX_BUF_LEN 20 extern "C" { // serial_t _my_serial; void pin_mode( PinName, PinMode ); } // Note: From the datasheet: // PSELRXD, PSELRTS, PSELTRTS and PSELTXD must only be configured when the UART is disabled. // But serial_init() erroneously enables the uart before the setting of those, // which messes up flow control. Apparently the setting is ONCE per ON mode. ARGH! // So we made our own versions of Serial and SerialBase to (MySerial and MySerialBase) // to not use serial_init() in serial_api.c, so flow control is setup correctly * // MTSSerial now uses our MySerial instead of Serial, and now uses hw flow control by default * // * But unfortunately we can't change the uart interrupt vector in the interrupt table, // and the current low-level support in serial_api.c won't pass through non-tx/rx interrupts, // so we change it/rebuild the mbed lib for low-level hw flow control to work. // MTSSerialFlowControl uses "manual" (non-hardware-low-level) flow control based on its // internal buffer--Rx servicing seems fast enough not to need hw flow control, so it's okay. // // mts::MTSSerialFlowControl pcfc( USBTX, USBRX, RTS_PIN_NUMBER, CTS_PIN_NUMBER, 384, 2688 ); mts::MTSSerial pcfc( USBTX, USBRX, 256, 2560, RTS_PIN_NUMBER, NC ); uint8_t txPayload[TXRX_BUF_LEN] = { 0 }; static uint8_t rx_buf[TXRX_BUF_LEN]; static uint8_t rx_len = 0; DigitalOut led1( LED1 ); // DigitalOut rts( RTS_PIN_NUMBER ); char deviceName[6]; // "TAF00"; Gap::address_t macAddr; Gap::addr_type_t *pAdType; const uint8_t DevInfoServiceUUID_rev[] = { (uint8_t)(GattService::UUID_DEVICE_INFORMATION_SERVICE & 0xFF), (uint8_t)(GattService::UUID_DEVICE_INFORMATION_SERVICE >> 8) }; UARTService *uartServicePtr; // PhoneAppIO toPhone( &ble ); void disconnectionCallback( Gap::Handle_t handle, Gap::DisconnectionReason_t reason ) { DEBUG( "Disconnected!\n\r" ); DEBUG( "Restarting the advertising process\n\r" ); ble.startAdvertising(); } bool updateCharacteristic( GattAttribute::Handle_t handle, const uint8_t *data, uint16_t bytesRead ) { ble_error_t err; // toPhone.toPhoneBuf( (uint8_t *)data, bytesRead ); err = ble.updateCharacteristicValue( handle, data, bytesRead ); if( (err == BLE_ERROR_BUFFER_OVERFLOW) || (err == BLE_ERROR_PARAM_OUT_OF_RANGE ) ) { pcfc.printf( "\r\nBLE %d! ", err ); } else if ( err == BLE_STACK_BUSY ) { } return (err != BLE_ERROR_NONE); } void onDataWritten( const GattCharacteristicWriteCBParams *params ) { if( (uartServicePtr != NULL) && (params->charHandle == uartServicePtr->getTXCharacteristicHandle()) ) { uint8_t buf[TXRX_BUF_LEN]; uint16_t bytesRead = params->len; DEBUG( "received %u bytes\n\r", bytesRead ); #ifdef LOOPBACK_MODE // Loopback data from Central. updateCharacteristic( uartServicePtr->getRXCharacteristicHandle(), params->data, bytesRead ); // Notifies. #endif ble.readCharacteristicValue( uartServicePtr->getTXCharacteristicHandle(), buf, &bytesRead ); // Also write to serial port... memset( txPayload, 0, TXRX_BUF_LEN ); memcpy( txPayload, buf, TXRX_BUF_LEN ); // pcfc.printf( "From app: " ); pcfc.write( (char *)txPayload, bytesRead ); // pcfc.printf( "\r\n" ); } } bool bleWasntReady; void onDataSent( unsigned count ) { } void periodicCallback( void ) { led1 = !led1; // rts = !rts; } void uartCB( void ) { // if( 0 != rts.read() ) pcfc.puts( "\r\n!RTS disengaged.\r\n" ); // When not using HWFC. // Set line from serial port to RX characteristic (From cone) while( pcfc.readable() ) { if( !bleWasntReady ) { char ch; pcfc.read( ch ); rx_buf[rx_len++] = ch; } if( bleWasntReady || rx_len>=20 || rx_buf[rx_len-1]=='\0' || rx_buf[rx_len-1]=='\r' ) { bleWasntReady = updateCharacteristic( uartServicePtr->getRXCharacteristicHandle(), rx_buf, rx_len ); // Notifies. // pcfc.printf( "RecHandler \r\n" ); if( !bleWasntReady ) rx_len = 0; break; } } } int main( void ) { led1 = 1; Ticker ticker; ticker.attach( periodicCallback, 1 ); pcfc.baud( 57600 ); pcfc.rxClear(); // pc.attach( uartCB, pc.RxIrq ); DEBUG( "Initialising the nRF51822\n\r" ); ble.init(); ble.onDisconnection( disconnectionCallback ); ble.onDataWritten( onDataWritten ); ble.onDataSent( onDataSent ); /* setup advertising */ ble.accumulateAdvertisingPayload( GapAdvertisingData::BREDR_NOT_SUPPORTED ); ble.setAdvertisingType( GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED ); // Get MAC addr so we can create a device name using it. ble.getAddress( pAdType, macAddr ); sprintf( deviceName, "T%02X%02X", macAddr[1], macAddr[0] ); pcfc.printf( "\r\nNano nano! I am \"%s\"\r\n", deviceName ); #ifdef LOOPBACK_MODE pcfc.printf( "\r\nIn BLE Loopback mode.\r\n" ); #endif ble.accumulateAdvertisingPayload( GapAdvertisingData::COMPLETE_LOCAL_NAME, (const uint8_t *)deviceName, strlen(deviceName) ); ble.accumulateAdvertisingPayload( GapAdvertisingData::INCOMPLETE_LIST_128BIT_SERVICE_IDS, (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed) ); ble.accumulateScanResponse( GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (const uint8_t *)DevInfoServiceUUID_rev, sizeof(DevInfoServiceUUID_rev) ); ble.setAdvertisingInterval( Gap::MSEC_TO_ADVERTISEMENT_DURATION_UNITS( 1000 ) ); ble.startAdvertising(); DeviceInformationService deviceInfo( ble, "TRX", "TrueAgility", "SN0001", "hw-rev1", "fw-rev1" ); /* Enable over-the-air firmware updates. Instantiating DFUSservice introduces a * control characteristic which can be used to trigger the application to * handover control to a resident bootloader. */ DFUService dfu( ble ); UARTService uartService( ble ); uartServicePtr = &uartService; while( true ) { ble.waitForEvent(); uartCB(); } } /* EOF */