
this is using the mbed os version 5-13-1
Diff: source/main-https.cpp
- Revision:
- 77:0b505d1e15f4
- Parent:
- 76:6afda865fbf8
- Child:
- 78:07bb86e3ce14
--- a/source/main-https.cpp Fri Mar 15 14:26:44 2019 +0000 +++ b/source/main-https.cpp Fri Mar 15 23:25:30 2019 +0000 @@ -26,6 +26,7 @@ static RawSerial *device; // tx, rx static UARTSerial *_serial; // tx, rx static ATCmdParser *_parser; +static SMDevicePeripheral *peripheral; const static char DEVICE_NAME_MAIN[] = "BLE-UART"; static const uint16_t uuid16_list[] = {LEDService::LED_SERVICE_UUID}; char buffer[BUFFER_LEN]; @@ -41,9 +42,9 @@ //unsigned char rt_stk[1024]; //unsigned char hp_stk[1024]; //unsigned char lp_stk[1024]; -unsigned char btle_stk[1024]; +unsigned char btle_stk[8*1024]; unsigned char wifi_stk[1024]; -unsigned char atcmd_stk[1024]; +unsigned char atcmd_stk[8*1024]; static bool bleInitializationCompleted = false; /* creates three tread objects with different priorities */ @@ -71,11 +72,12 @@ // wifi demo #include "wifi_demo.h" - +Mutex _smutex; // Protect memory access // check free memory void performFreeMemoryCheck() { + _smutex.lock(); // perform free memory check int blockSize = 16; int i = 1; @@ -88,6 +90,7 @@ ++i; } printf("Ok for %d char\n", (i - 1) * blockSize); + _smutex.unlock(); } @@ -475,6 +478,7 @@ printf("\r\n PERIPHERAL \r\n\r\n"); SMDevicePeripheral peripheral(ble, queue, peer_address); peripheral.run(); + return 0; } if(loopCount >= MAX_LOOP_COUNT) { @@ -493,136 +497,115 @@ return 0; } +void print_memory_info() { + // allocate enough room for every thread's stack statistics + int cnt = osThreadGetCount(); + mbed_stats_stack_t *stats = (mbed_stats_stack_t*) malloc(cnt * sizeof(mbed_stats_stack_t)); + + cnt = mbed_stats_stack_get_each(stats, cnt); + for (int i = 0; i < cnt; i++) { + printf("Thread: 0x%lX, Stack size: %lu / %lu\r\n", stats[i].thread_id, stats[i].max_size, stats[i].reserved_size); + } + free(stats); + + // Grab the heap statistics + mbed_stats_heap_t heap_stats; + mbed_stats_heap_get(&heap_stats); + printf("Heap size: %lu / %lu bytes\r\n", heap_stats.current_size, heap_stats.reserved_size); +} + +#define DISABLE_WIFI_DEMO int main() { reset_counter++; - //RawSerial *device(USBTX, USBRX); // tx, rx + //performFreeMemoryCheck(); + print_memory_info(); + printf("\r\n ++++++ PROGRAM STARTING -- reset count = %d ++++++ \r\n", reset_counter); device = new RawSerial(USBTX, USBRX, DEFAULT_BAUD_RATE); -#ifndef USE_MAIN_BLE - ble_security_main(); - wait(1); // wait for advertising interval so advertising has started - reportGapState(); -#else - device->printf("\n --- Running UART-BLE-UartService --- (rst_cnt = %d)\n", reset_counter); - - eventQueue.call_every(500, blinkCallback); - eventQueue.call_every(60000, HelloUart); - //eventQueue.call_every(1000, checkUartReceive); + //ble_security_main(); - device->printf("\n --- EventQueues setup --- \n"); - //////////////////////////////////////////////////////////////////////////////// - // BLE Initialization ///////////////////////////////////////////////////////// - device->printf("\n --- about to instantiate BLE instance --- \n"); - BLE &ble = BLE::Instance(); - device->printf("\n --- BLE Instance Instantiated --- \n"); - btle_thread.start(callback(bleInitialization)); - - device->printf("\n --- Waiting for BLE Initialization to be completed --- \n"); - int i = 0; - while(!ble.hasInitialized() && i < 20){ - // dispatch function - eventQueue.dispatch(1000); // Dispatch time - 1000msec - // 400 msec - Only 2 set of events will be dispatched as period is 200 msec - - device->putc('0'+(i++ % 10)); - } - btle_thread.join(); - if(i < 20){ - device->printf("\n --- BLE Initialization completed --- \n"); - } - else { - device->printf("\n --- BLE Initialization failed --- \n"); + BLE& ble = BLE::Instance(); + events::EventQueue queue(/* event count */ 10 * EVENTS_EVENT_SIZE); +#if MBED_CONF_APP_FILESYSTEM_SUPPORT + /* if filesystem creation fails or there is no filesystem the security manager + * will fallback to storing the security database in memory */ + if (!create_filesystem()) { + printf("Filesystem creation failed, will use memory storage\r\n"); } - wait(1); // wait for advertising interval so advertising has started - reportGapState(); - //////////////////////////////////////////////////////////////////////////////// - // BLE Initialization ///////////////////////////////////////////////////////// -#ifdef false - device->printf("\n --- about to shutdown BLE instance --- \n"); - device->printf("\n Press any key: "); - device->getc(); - //ble.gap().clearAdvertisingPayload(); - ble.gap().stopAdvertising(); - ble.gap().reset(); - //ble.shutdown(); - //delete ble; - //////////////////////////////////////////////////////////////////////////////////// -#endif - btle_thread.start(callback(&eventQueue, &EventQueue::dispatch_forever)); - printWait(5); #endif - //device->printf("\n Press any key to start Wifi demo: "); - //device->getc(); + print_memory_info(); + printf("\r\n PERIPHERAL \r\n\r\n"); + //SMDevicePeripheral peripheral(ble, queue, peer_address); + peripheral = new SMDevicePeripheral(ble, queue, peer_address); + print_memory_info(); + + peripheral->run(); + btle_thread.start(callback(&queue, &EventQueue::dispatch_forever)); + //btle_thread.start(callback(peripheral, &SMDevicePeripheral::run)); + //performFreeMemoryCheck(); + //reportGapState(); + print_memory_info(); + printWait(60); // lets give time to see BLE advertising... + //reportGapState(); + peripheral->stopAdvertising(); + //queue.break_dispatch(); + //reportGapState(); + //btle_thread.join(); + //performFreeMemoryCheck(); + printf("\r\n BTLE THREAD HAS RETURNED \r\n\r\n"); + #ifndef DISABLE_WIFI_DEMO // comment out wifi part - int start = Kernel::get_ms_count(); - NetworkInterface* network = connect_to_default_network_interface(); - int stop = Kernel::get_ms_count(); - device->printf("\n The Wifi Network scan took %d ms or %4.1f seconds\n", (stop - start), (float)((stop - start)/1000.0)); - // run on separate thread; - t.start(callback(wifi_demo, network)); - t.join(); + printMacAddress(); + //reportGapState(); + int start = Kernel::get_ms_count(); + NetworkInterface* network = connect_to_default_network_interface(); + int stop = Kernel::get_ms_count(); + device->printf("\n The Wifi Network scan took %d ms or %4.1f seconds\n", (stop - start), (float)((stop - start)/1000.0)); + // run on separate thread; + t.start(callback(wifi_demo, network)); + t.join(); + network->disconnect(); + delete network; + printMacAddress(); + //reportGapState(); + device->printf("\n Wifi-Demo completed - restarting BLE \n\n"); +#else + device->printf("\n Wifi Demo disabled so just waiting it out... \n\n"); + printWait(60); // lets wait for a minute before turning BLE back on + device->printf("\n ++++++ restarting BLE ++++++ \n\n"); #endif - network->disconnect(); - //delete network; - printMacAddress(); - reportGapState(); - //device->printf("\n Press any key to restart BLE : "); - //device->getc(); - - wait(1); // wait for advertising interval so advertising has started - reportGapState(); - + peripheral->startAdvertising(); + //peripheral->run(); + //btle_thread.start(callback(&queue, &EventQueue::dispatch_forever)); + //peripheral.run(); + //btle_thread.start(callback(peripheral, &SMDevicePeripheral::run)); + //t.start(callback(&queue, &EventQueue::dispatch_forever)); + printWait(60); + //reportGapState(); +#ifdef ENABLE_UART_BACKGRND_DEMO for(int i=0;i<255;i++) { device->putc(i); } - int n; + //int n; //ReadUartBytes(RxBuffer, RX_BUFFER_LEN, 4); reportGapState(); device->printf("\n\n\nEnter # of expected bytes: "); - n = ReadUartBytes(RxBuffer, RX_BUFFER_LEN, 4, true); + ReadUartBytes(RxBuffer, RX_BUFFER_LEN, 4, true); uint8_t rxLen = (uint8_t) (100*(RxBuffer[0]-'0') + 10*(RxBuffer[1]-'0') + (RxBuffer[2]-'0')) %256; device->printf("\n\nExpected # of Received Bytes = %d\n", rxLen); BackGndUartRead(RxBuffer, RX_BUFFER_LEN, (int) rxLen); - //device->printf("--- Writing back received data --- \n\n"); - //n = WriteUartBytes(RxBuffer, TX_BUFFER_LEN, rxLen); - //write("\n\ntesting Serial Write\n", 40); //, checkUartReceive, SERIAL_EVENT_TX_COMPLETE); - - device->printf("\nATCmdParser with ESP8266 example"); device->printf("\n Waiting for 5 seconds "); printWait(5); - device->printf("\n Waiting finished!!!\n\n "); - reportGapState(); + device->printf("\n Waiting finished!!!\n Now waiting for expected bytes to be received \n\n"); while(UartBusy){ wait(0.1); } +#endif + device->printf("\r\n++++++ Starting ATCmdmanager ++++++ \r\n"); ATCmdManager *aTCmdManager = new ATCmdManager(USBTX, USBRX, true); - //ATCmdManager *aTCmdManager = new ATCmdManager(D1, D0, true); aTCmdManager->runMain(); -#ifdef false - _serial = new UARTSerial(USBTX, USBRX, DEFAULT_BAUD_RATE); - _parser = new ATCmdParser(_serial); - _parser->printf("\n _serial printf being used for this \n\n"); - device->printf("\n device printf being used now \n\n"); - printf("\n ATCmdParser printf being used now \n\n"); - _parser->debug_on( 1 ); - _parser->set_delimiter( "\r\n" ); - - //Now get the FW version number of ESP8266 by sending an AT command - printf("\nATCmdParser: Retrieving FW version"); - _parser->send("AT+GMR"); - int version; - if(_parser->recv("SDK version:%d", &version) && _parser->recv("OK")) { - printf("\nATCmdParser: FW version: %d", version); - printf("\nATCmdParser: Retrieving FW version success"); - } else { - printf("\nATCmdParser: Retrieving FW version failed"); - return -1; - } - //parser.recv("+CIPDATA:%d,", &len); - //parser.read(buffer, len); - printf("\nDone\n"); -#endif + atcmd_thread.start(callback(aTCmdManager, &ATCmdManager::runMain)); //performFreeMemoryCheck(); //eventQueue.dispatch_forever(); @@ -630,11 +613,6 @@ //eventQueue2.dispatch_forever(); return 0; - - - - - //wait(osWaitForever); } #endif