Basically, evothings.ble does not get initialzed -- however, it magically appears when a separate T.I. app activates the Bluetooth system on the iOS side.
Details ---
I have used your evothings app from iTunes to record data from a TI SensorTag. For our first Alpha test, we have decided to keep running with the evothings app as the "shell" for our app until we get proper device IDs to send to Apple so apple can "authorize" these iPad minis to download our real app. It's a purchasing issue -- can't get the iPad platform IDs until they are bought, and can't buy them until my client can check out the app. (way too much information, but ...)
Here is the problem: When I connect to my local server, (a node service built from Keystone), everything goes wonderful. The Keystone server sends index.html and app.js along with all the css and it all works fabulously. Everything is built with browserify, so the app.js is big and monolithic. The app.js does contain evothings.util, evothings.easyble, and evothings.tisensortag.
However, when I run the identical Keystone server on a system 5,000 miles away, the loading times are much longer. What happens is that my catch-try code results in the message "evothings.ble.stopscan" is undefined.
This occurs repeatedly, and the app never gets through the initialzation sequence. Since evothings.ble is cooked inside of the evothings client app, it is puzzling why it should come up undefined.
I tried the suggestion from the above mentioned "TI Sensortag advertising and conversion periods" posting which suggested that running the T.I. application to activate the BLE mechanism on the iPad seems to help.
That suggestion ALSO worked for this problem, although I don't think my corporate masters would appreciate this work-around.
So what can I do to make sure that evothings.ble gets initialized properly from the app.js?
This is the connection logic from the code in my app.coffee:
Code: Select all
initializeSensorTag = ->
# Here sensors are set up.
#
# If you wish to use only one or a few sensors, just set up
# the ones you wish to use.
#
# First parameter to sensor function is the callback function.
# Several of the sensors take a millisecond update interval
# as the second parameter.
# Gyroscope takes the axes to enable as the third parameter:
# 1 to enable X axis only, 2 to enable Y axis only, 3 = X and Y,
# 4 = Z only, 5 = X and Z, 6 = Y and Z, 7 = X, Y and Z.
#
repeat = false
failures =0
try
connected = false
sensortag.statusCallback(statusHandler)
sensortag.errorCallback(errorHandler)
# sensortag.keypressCallback(keypressHandler)
sensortag.accelerometerCallback(accelerometerHandler, 100)
sensortag.magnetometerCallback(magnetometerHandler, 100)
sensortag.gyroscopeCallback(gyroscopeHandler, 100, 7)
sensortag.connectToClosestDevice()
catch e
failures++
console.log "failed to initialize"
console.log e
# try again after 1/2 second
repeat = window.setInterval(initializeSensorTag,500)
return
# when the try finishes without a catch, clear the retry timer
if repeat?
console.log "sensor came on-line after " + failures + " failures"
window.clearInterval repeat
else
console.log "sensor came on-line immediately"
return