disconnect and re-connect to MergBLE

Moderators: FourthWorld, heatherlaine, Klaus, kevinmiller, LCMark

Locked
dougr
Posts: 14
Joined: Thu Oct 14, 2010 10:58 pm

disconnect and re-connect to MergBLE

Post by dougr » Thu Apr 05, 2018 7:15 pm

I've managed to get the LC mergBLE example to work in my app with considerable struggles... don't get me started with the documentation (sorry, Monte) ... but doc's like: "mergBLEStopScanningForPeripherals" summary is " ... Stop the scan begun by mergBLEScanForPeripheralsWithServices ... " REALLY??? How about some examples in the doc''s or even a reference to some Bluetooth spec...ALL of the LC MergBLE docs are about as helpful! .. ps : no response to a plea for help in StackOverflow... as directed to do so on Monte's "mergEXT" page.

But I cannot find a way to "stop" the connection once it has been established short of stopping and exiting the containing stack ALTOGETHER. "Close stack..." doesn't work by itself. Sending "closeCard" to the example's card "BLE_Card", doesn't work. Invoking the mergBLE commands in the "closeCard" function/command in my own button on the same card (BLE_Card) and same stack doesn't work....combinations of the above and more ... etc, etc.

Since Bluetooth is NOT inherently an ACK/NAK protocol, I need to be able to detect if the two devices (an iOS iPad running a LC stack using mergBLE) and an AdaFruit BLE device (BlueFruit SPI le Friend ... ARM Cortex M0 core running at 16MHz (nRF51822)) lose connectivity and have the LC code try to re-initialize the connection as it does when the stack starts up

So, also to the point, I cannot find the combination of mergBLE command to invoke the connection and exchange data outside of using the WHOLE example card itself. Moving the various functions and message handlers to other cards and/or the Main Stack causes the whole BLE connectivity thing to never initialize (want another example of doc's ... look at the mergBLEInitialize reference in the LC doc's). Since I cannot find a way of "stopping" the BLE connection, "go to card BLE_Card" is useless.

There seems to be a significant dearth of posts on the merBLE extension/external... I'm wondering if that's because it works so well and I'm just being stupid (not an unlikely assumption) or is it because those who have tried to gave up in frustration.

I thought I'd submit a forum message first before turning directly to LC support. I've reviewed and been in contact with "joel.epsteinBUS31vi" who used the BLE example in his "GONG" stack... this is EXACTLY what I am referring to in that Joel (had to) used the original BLE example to get his project working.

Any help in dealing with mergBLE would be of huge assistance... ideally other stacks which employ the mergBLE components outside of the example.

bogs
Posts: 5435
Joined: Sat Feb 25, 2017 10:45 pm

Re: disconnect and re-connect to MergBLE

Post by bogs » Thu Apr 05, 2018 7:46 pm

I'm wondering if that's because it works so well and I'm just being stupid (not an unlikely assumption)
I never make those assumptions, there is a huge difference between stupidity and ignorance. When taking on something new, as you apparently are, relying on what documentation (or other available resources) are available is the step to take, which you have done.

I don't use any of the merg* suite, and so cannot help you in this case, however I do see Monty post here more than occaisionally, and I suspect others have successfully used his suite of tools. Hopefully one or the other will chime in and help you solve the problem.
Image

dougr
Posts: 14
Joined: Thu Oct 14, 2010 10:58 pm

Re: disconnect and re-connect to MergBLE

Post by dougr » Fri Apr 06, 2018 8:38 pm

Thanks for the reply... I certainly *do* hope others will chime in with DETAILS of their mergBLE experiences and projects. I *really* didn't want to become a BLE expert in order to use BLE... otherwise I'd have gone the whole Xcode/Xamarin route. I enjoy programming in Livecode and have been doing so for quite some time now. THAT's what really surprised me about the lack of info and (apparent) usage of mergBLE. I would have thought it would have been a HUGE bonus to Livecode developers. Still may be... THAT's what I'm trying to find out.

I have another related BLE issue / question but I think I'll start another thread to handle it. If interested, please look for a subject of "background processing and mergBLE" in this same forum... and possibly other forums as well. It's hard to know what forum to use for what subjects.

dougr
Posts: 14
Joined: Thu Oct 14, 2010 10:58 pm

Re: disconnect and re-connect to MergBLE

Post by dougr » Sat Apr 07, 2018 11:09 pm

The code/stack I am referring to in this thread is the mergBLE example.. which can be found (on a Mac Sierra LiveCode Business 8.1.9 installation) @ /Applications/LiveCode Business
8.1.9.app/Contents/Tools/Ext/mergBLE-1.1.22/mergBLE.livecode

I renamed the example card from "card id 1002" to "BLE_Card"

I did find a mergBLE command which stops the connection. I have no idea WHY I didn't see it in the first place. It is (ironically): "mergBLECancelConnectionToPeripheral pUUID" ... I think I got lost in all of the other handlers for mergBLE and didn't see this one.

Anyway, even though now that I can "stop" the connection, I STILL cannot re-establish it unless I quit out of the app altogether. I believe I have tried every invocation I know of to "trigger" the BLE Card:
- send "openCard" to card "BLE_Card" ... sent from another card ... note: BLE_Card receives a "closeCard" message when, it reaches a certain point in its processing (the on mergBLEPeripheralDidDiscoverCharacteristicsForService command to be specific). In this handler, I've inserted a "go to <the user interactive card>)
- go to card "BLE_Card" ... sent from another card
- go to card "BLE_Card" ... sent from the stack set of handlers
- go to this stack ... to try to re-initialize the whole stack ... preceded with and without a "close this stack"
- all manner of combinations and placements of these commands in a variety of places within my code.

I can get the BLE_Card to come to the foreground... but it WILL NOT re-establish the connection that I stopped using the mergBLECancelConnectionToPeripheral command.

bwmilby
Posts: 438
Joined: Wed Jun 07, 2017 5:37 am
Location: Henrico, VA
Contact:

Re: disconnect and re-connect to MergBLE

Post by bwmilby » Sun Apr 08, 2018 3:20 am

Did you try issuing

Code: Select all

mergBLEConnectPeripheral pUUID
after you disconnected?

I'm not sure if scanning has anything to do with your issue (since you already have the UUID). On the chance that it does:
  • Did you stop scanning? If so, did you try restarting it?
  • Did you try stopping and then restarting scanning?
You may be able to move the BLE code to a library, but I don't think you want to break it up. You could call out to library code somewhere else, but the actual code that handles the BLE messages should probably be located in one place.

The example is setting things up for 2 way communication where either device sends messages that the other receives. If you are only going one direction, then a good chunk of the code wouldn't be needed. We don't have enough information about your project to provide advice there though.
Brian Milby

Script Tracker https://github.com/bwmilby/scriptTracker

dougr
Posts: 14
Joined: Thu Oct 14, 2010 10:58 pm

Re: disconnect and re-connect to MergBLE

Post by dougr » Sun Apr 08, 2018 9:21 pm

Yes.. I did this in several places ... to no effect. The "checkFrom" command is called each time I write to the BLE device from iOS

Code: Select all

on checkFrom
      put 20 into x
      repeat until ((field "fromAnycaster" of card "anycaster_card1" contains "ACK") or (x < 1))
         wait for 100 milliseconds
         subtract 1 from x
      end repeat
      
      if x < 1 then
         doNoAck
      else
         put "OK" into field "verifyField" of card "anycaster_card1"
      end if
   end if
end checkFrom
When it fails to find "ACK" in the appropriate field (and it always fails ... see next paragraph), it calls "doNoAck" ... which now contains all of the possible BLE devices that were originally connected to (in the "sPeripheral" array. It stops the connection (this works) and then tries to "re-" connect .. which ALWAYS fails... there is a blue LED on the BLE device which indicates an active connection. When the stack is started and the mergBLE code is initially invoked, this connect LED lights. When the ACK fails and the "mergBLECancelConnectionToPeripheral tPeripheral" is called, the connect LED goes out... and never comes back on.

Code: Select all

on doNoACK
   answer "Possible disconnect with AnyCaster ...  Attempting to re-initialize"

   repeat for each key tPeripheral in sPeripheralA
      answer "pUUID: " & tPeripheral & return & \
            "Peripheral "&sPeripheralA[tPeripheral]["name"]
      
      mergBLECancelConnectionToPeripheral tPeripheral
      wait for 1 second
      mergBLEDidConnectPeripheral tPeripheral
      
   end repeat
end doNoACK
The "lack" of discovering the "ACK" in the relevant field is the basis for my other posting (subject: "background processing and mergBLE") ... this particular thread I'd like to keep focused on my inability to stop and re-start the BLE connection.

The full code I am writing is very involved and in order to experience what I am trying to describe, one would also require a BLE tranceiver (such as the Adafruit I am using) and (likely) an Arduino running at least a terminal emulation on the Arduino port assigned to the BLE device... so you see, although I'd love to have someone else experience what I am seeing DIRECTLY, the likelihood of having the right "parts" is very low... hence the partial code segments and my struggling attempts to describe the outcomes in a manner than can be understood.

To the additional points raised by bwmilby:

I perform a "go to <mycard" within the BLE Card handlers at the point ... specifically at the successful processing of the "mergBLEPeripheralDidDiscoverCharacteristicsForService" handler within the BLE Card. This, in turn, causes a "closeCard" to be sent to the BLE card which has the following handler:

Code: Select all

on closeCard
   mergBLEStopScanningForPeripherals
   mergBLEStopAdvertising
   mergBLEDeleteService fld "service" of card "BLE_Card"
end closeCard
What I find surprising, and likely relevant, it that this handler DOES NOT actually disconnect the BLE device... but I assure you that it doesn't. I read somewhere else (sorry, I've read so many postings I can't keep track of what I read where) that someone else was questioning this "oddity" and that Monte replied he would investigate... but never posted back... I believe that was in 2016.

So... to your questions:
Did you stop scanning? If so, did you try restarting it?
>>> yes, the closeCard supposedly does that and yes, by calling a "go to card 'BLE_Card'", I am trying re-start it (from the "top") ... the BLE card appears in place of my main card on the display (so I know it has been "gone to"), but it DOES NOT re-establish the connection to the BLE device.

Did you try stopping and then restarting scanning?
>>> basically the same answer as above.., that should have been done by the "go to BLECard" call... although I certainly have tried individual calls to various commands in the mergBLE suite... all to no avail.

It's almost as though something in the mergBLE suite gets "stuck" and doesn't "clear" until the whole app is stopped.

I freely admit to being completely ignorant regarding LC Libraries. I guess I haven't needed whatever functionality they provide (up until now?) and, as a need-to-know programmer, I haven't learned about them (yet). That's likely another discussion and unless it is a solution, isn't pertinent here.

My application *is* a bi-directional one... sending slider info from the iOS LC card (running on a new iPad iOS 11.3) to the BLE device connected to an Arduino where the incoming slider data is used to control other peripheral hardware devices. Additionally, physical buttons on the device being controlled by the Arduino send reciprocal data to the iOS LC app, which "remotely" move the sliders on the iOS screen.

I MUST point out that the fundamental LC mergBLE works fine, fine, fine... but as an interface specialist (30 years in the healthcare/medical laboratory scene doing instrument and whole system interfaces), I wanted to develop an ACK/NAK protocol for this app because BLE doesn't do ACK/NAK natively. I want the iOS device to be able to sense if it get disconnected from the BLE "stream" and get it to try to re-connect. Possible EMI or other interferences (garage door openers, etc) can cause a BLE connection to fail...hence the need for a re-connect ability.

Please continue with the ideas and suggestions.. another set of eyes an another mind always helps to bring clarity.

Cheers! ... Doug

bwmilby
Posts: 438
Joined: Wed Jun 07, 2017 5:37 am
Location: Henrico, VA
Contact:

Re: disconnect and re-connect to MergBLE

Post by bwmilby » Mon Apr 09, 2018 1:04 am

checkFrom always fails because it is a blocking handler.

doNoACK does not work like intended because it is using the incorrect call. mergBLEDid... is a message that you need to write a handler to receive. I would need to pull out my laptop to figure out the call you are looking for. (mergBLEConnectPeripheral pUUID)

In general you need to send something and then wait for a message. If you want a response timeout, then use something like I proposed on the other thread.

I would probably need to see quite a bit more of your code to really help. Or at least a good outline of what you are trying to do.

Edited to add:
When looking in the dictionary, you need to look at the Type for each entry. Anything with message is something that you need to write a handler to receive and take action on. Anything with command or function can be used in a handler that you write.

If you want to place a copy of your code (just the script is fine) on the thread, I would be willing to take a look and make suggestions. I agree it would be difficult since I could not run it since I don't have the hardware, but much of the logic level stuff being discussed in this thread would be understandable.
Brian Milby

Script Tracker https://github.com/bwmilby/scriptTracker

dr_mumps
Posts: 23
Joined: Wed Dec 24, 2014 7:00 pm

Re: disconnect and re-connect to MergBLE

Post by dr_mumps » Fri Apr 13, 2018 3:27 am

yes, as discovered on the other thread, I have "fixed" the "checkFrom" handle to use the "wait with messages" syntax... that works fine now.

You are right (of course) why the "version" of "doNoACK" I presented doesn't work... I actually do know NOT to use a "message" handler as a "command"... stupid of me but I'm getting so frustrated at not being able to re-initialise the BLE card, I guess I was grasping at straws and didn't notice the type of handler when I referenced the script in the previous posting. I tried substituting "go to BLE_Card" in its place... and/or "go to this stack" ... but ...

To reiterate, the BLE card works PERFECTLY when initially opened from the very beginning of the app. Connects to the BLE device and (now) receives ACK's from the Arduino everytime I write to the BLE device... in fact it does it so well, I have to force the code to "think" it didn't receive an ACK. BUT...

Since the BLE_Card performs a "closeCard" action when I make it "go to <main card>", you would think that if I "go to BLE_Card" from my main card, that would COMPLETELY re-start the BLE connection... and it absolutely DOES NOT... and since I force the connection to stop with "mergBLECancelConnectionToPeripheral tPeripheral" (yes, I've double checked the "value" in the "tPeripheral" many, many times ... and this cancel command definitely stops the BLE connection), I would have thought THAT command would have "allowed" the "go to BLE_Card" to re-initialize... again.. not so.

I TRULY appreciate you assistance on this matter... however since the BLE_Card code is fairly long and DEFINITELY quite involved *AND* (most importantly) it works each time the app starts, I'm not sure that you wouldn't be wasting your time. Call it a gut feeling but I get the impression that somehow something gets "struck" in the mergBLE implementation and once a connection is established, it CANNOT be re-established without removing the ENTIRE stack from memory.. by stopping the app and returning to the iOS icon page (or whatever it's called... desktop?? .. dunno) and then calling the app again. ... however... I am including the whole BLE_Card script below.

I've contacted Monte (the original developer) and he wants me to post these details on the "MergEXT" form and send them to support@livecode.com. I will do that... but .. please... don't give up on me. If, after reading this response, anything else comes to mind, I will ABSOLUTELY appreciate hearing it.

Cheers
Doug

NOTE** Most of this code is directly from the mergBLE example included in the LC 8 package... most of the fields have been left but made invisible on my version of the BLE Card to try to ensure I didn't "break" the original script. Most of the variables are used elsewhere .. I tend to "overuse" globals (for historic coding reasons) and copy all variable setups to all of the cards and most objects within my app... just my "development" methodology.

Code: Select all

global blinkID, BLEInit, BLESrc
global currentObj
global Dry
global isLower, isOpen, isUpper
global lowerPos
global maxFreq, maxQ, maxVol, maxWetDry, minFreq, MinMax, minQ, minVol, minWetDry, ModeStr, ModeVal
global preButton, Preset, PresetButton, PresetFile, PresetLine
global rectID
global saveID, sCentralA, skipDrag, skipLimit, skipLine, skipStop, skipUp, sPeripheralA, stackName, stopBlink, startBLE
global UpDn, upperPos
global vborderRef
global waitDelay, wborderRef, Wet, wetdry, WetDryValue

local altheConnections
local b, baseItem, buttonID
local c, calv, calx
local d, diffVal
local e
local f
local g
local h
local i
local makeInt
local rectPos, resultVal
local temp1, temp2, temp3, temp, thisMode, thisModeVal
local v
local w
local x
local y
local z


on openCard
   if the platform <> "iphone" then
      go to card "anycaster_card1"
   end if
   
   put empty into field "central state" of card "BLE_Card"
   put empty into field "peripheral state" of card "BLE_Card"
   put empty into field "service" of card "BLE_Card"
   put empty into field "writable" of card "BLE_Card"
   put empty into field "notify" of card "BLE_Card"
   put empty into field "connections" of card "BLE_Card"
   
   //answer "start initializing BLE"
   //try // just incase the desktop build isn't installed
   mergBLEInitialize
   //end try
   //answer "end initializing BLE"
   
end openCard

on closeCard
   /*
   mergBLEStopScanningForPeripherals
   mergBLEStopAdvertising
   mergBLEDeleteService fld "service" of card "BLE_Card"
   */
end closeCard

on mergBLEDidDiscoverPeripheral pPeripheral, pName, pRSSI
  if (pName contains "AnyCaster") or (pName contains "Adafruit") then
      put pName into sPeripheralA[pPeripheral]["name"]
      put pRSSI into sPeripheralA[pPeripheral]["RSSI"]
      mergBLEConnectPeripheral pPeripheral
  end if
end mergBLEDidDiscoverPeripheral

on mergBLEDidFailToConnectPeripheral pPeripheral, pError
   answer "Failed to connect to "&sPeripheralA[pPeripheral]["name"]&cr&pError
end mergBLEDidFailToConnectPeripheral

on mergBLEDidConnectPeripheral pPeripheral
   updateConnections
   mergBLEPeripheralDiscoverServices pPeripheral, fld "service"
end mergBLEDidConnectPeripheral

on mergBLEPeripheralDidDiscoverServices pPeripheral, pServices, pError
   if pError is not empty then
      answer "Error discovering services for "&sPeripheralA[pPeripheral]["name"] & cr & pError
   else
      if fld "service" is among the lines of pServices then
         mergBLEPeripheralDiscoverCharacteristicsForService pPeripheral, fld "service" --, fld "characteristic"
      end if
   end if
end mergBLEPeripheralDidDiscoverServices

on mergBLEPeripheralDidDiscoverCharacteristicsForService pPeripheral, pService, pCharacteristics, pError
   
   //answer "Go ahead?" with "Yes" or "No"

   put "mergBLEPeripheralDidDiscoverCharacteristicsForService" && pPeripheral, pService, pCharacteristics, pError
   if pError is not empty then
      answer "Error discovering characteristics for "&sPeripheralA[pPeripheral]["name"] & cr & pError
   else
      repeat for each line tCharacteristic in pCharacteristics
         
         /*
         answer "ANSWER #3" & return & \
               "pPeripheral: " & return & tab & pPeripheral & return && \
               "pService: " & return & tab & pService & return & \
               "pName:" & return & tab & sPeripheralA[pPeripheral]["name"] & return & \
               "tCharacteristic: " & return & tab & tCharacteristic & return & \
               "pValue: " & return & tab & pValue 
         */
         
         switch
            case tCharacteristic is fld "notify" of card "BLE_Card"
               mergBLEPeripheralSetNotificationsForCharacteristic pPeripheral, pService, fld "notify" of card "BLE_Card", true
               break
            case tCharacteristic is fld "writable" of card "BLE_Card"
               --mergBLEPeripheralWriteValueForCharacteristic pPeripheral, pService, tCharacteristic, "Initialize stuff" & "?"
               writeCharacteristic pService, tCharacteristic, "Initialize stuff"
               put true into BLEInit
               break
            default
               -- read our random writable characteristic
               mergBLEPeripheralReadValueForCharacteristic pPeripheral, pService, tCharacteristic
               break
         end switch
      end repeat
   end if
   
   put 0 into x
   repeat until ((the currentFrame of image "cat_69.gif" of card "BLE_Card" > 11) or  (x > 5000))
      wait 10 milliseconds
      add the currentFrame of image "cat_69.gif" of card "BLE_Card" to x
      put x into line 2 of field "connections" of card "BLE_Card"
   end repeat
   
   go to card "anycaster_card1"
   
end mergBLEPeripheralDidDiscoverCharacteristicsForService

on mergBLEPeripheralDidUpdateValueForCharacteristic pPeripheral, pCharacteristic, pValue, pError
   if pError is not empty then
      answer "Error reading value for characteristic for "&sPeripheralA[pPeripheral]["name"] & cr & pError
   else
      
      /*
      answer "ANSWER #2" & return & \
            "pPeripheral: " & return & tab & pPeripheral & return & \
            "pService: " & return & tab & pService & return & \
            "pName:" & return & tab & sPeripheralA[pPeripheral]["name"] & return & \
            "pCharacteristic: " & return & tab & pCharacteristic & return & \
            "pValue: " & return & tab & pValue & return & \
            "fld notify: " & return & tab & fld "notify" of card "BLE_Card" & return & \
            "fld writable: " & return & tab & fld "writable" of card "BLE_Card"
      */
      
      switch
         case pCharacteristic is fld "notify" of card "BLE_Card"
            --put true into BLESrc
            put interpret_incoming(pValue) after field "debugField" of card "anycaster_card1"
            
            break
         case pCharacteristic is fld "writable"
            answer "at Writable ... pCharacteristic: " & pCharacteristic & "... Should never get here ... check ANSWER #2"
            break
         default
            answer "at Default ... pCharacteristic: " & pCharacteristic & " ... Should never get here ... check ANSWER #2"
            go to card "anycaster_card1"
            break
      end switch
      
   end if
end mergBLEPeripheralDidUpdateValueForCharacteristic

on mergBLEDidDisconnectPeripheral pUUID
   updateConnections
end mergBLEDidDisconnectPeripheral

on updateConnections
   repeat for each key tCentral in sCentralA
      put "Central "& tCentral & return after theConnections
   end repeat
   
   repeat for each key tPeripheral in sPeripheralA
      put "Peripheral "&sPeripheralA[tPeripheral]["name"] & return after theConnections
   end repeat
   
   put theConnections into fld "connections"
end updateConnections

on mergBLECentralManagerDidUpdateState pState
   --answer pState
   put pState into fld "central state" of card "BLE_Card"
   if pState is "powered on" then
      mergBLEScanForPeripheralsWithServices fld "service" of card "BLE_Card"
   else
      put empty into field "service" of card "BLE_Card"
      put empty into field "writable" of card "BLE_Card"
      put empty into field "notify" of card "BLE_Card"
      put empty into field "connections" of card "BLE_Card"
   end if
end mergBLECentralManagerDidUpdateState

on mergBLEPeripheralManagerDidUpdateState pState
   --answer pState
   put pState into fld "peripheral state" of card "BLE_Card"
   if pState is "powered on" then
      put "6E400001-B5A3-F393-E0A9-E50E24DCCA9E" into pService
      put pService into field "service" of card "BLE_Card"
      mergBLECreateService fld "service" of card "BLE_Card"
      
      put "6E400002-B5A3-F393-E0A9-E50E24DCCA9E" into pCharacteristic
      put pCharacteristic into field "writable" of card "BLE_Card"
      mergBLEAddCharacteristicToService fld "service" of card "BLE_Card", fld "writable" of card "BLE_Card", false, true, true, false, false, false, false, false
      
      put "6E400003-B5A3-F393-E0A9-E50E24DCCA9E" into field "notify" of card "BLE_Card"
      mergBLEAddCharacteristicToService fld "service" of card "BLE_Card", fld "notify" of card "BLE_Card", false, false, false, true, true, false, false, false
      
      /*
      answer field "service" of card "BLE_Card" & crlf & \
            field "writable" of card "BLE_Card" & crlf & \
            field "notify" of card "BLE_Card"
      */
 
   else
      put empty into field "service" of card "BLE_Card"
      put empty into field "writable" of card "BLE_Card"
      put empty into field "notify" of card "BLE_Card"
      put empty into field "connections" of card "BLE_Card"
      put empty into sPeripheralA
      put empty into sCentralA
      put empty into pCharacteristics
   end if
end mergBLEPeripheralManagerDidUpdateState

/*
on writeCharacteristic pService, pCharacteristic, pValue
   repeat for each key tPeripheral in sPeripheralA
      
      answer "Card OUTPUT" & return & \
            "tPeripheral: " & return & tab & tPeripheral & return && \
            "pService: " & return & tab & pService & return & \
            "pName:" & return & tab & sPeripheralA[tPeripheral]["name"] & return & \
            "pCharacteristic: " & return & tab & pCharacteristic & return & \
            "pValue: " & return & tab & pValue 
      
      mergBLEPeripheralWriteValueForCharacteristic tPeripheral, pService, pCharacteristic, pValue
   end repeat
end writeCharacteristic
*/


dr_mumps
Posts: 23
Joined: Wed Dec 24, 2014 7:00 pm

Re: disconnect and re-connect to MergBLE

Post by dr_mumps » Fri Apr 13, 2018 5:33 am

I'd like to move this continuing discussion to the MergExt forum upon the advice of Monte Goulding... please see the subject "Re-Initialising mergBLE" in that forum

Doug

Locked

Return to “Engine Contributors”