Advertisement
Guest User

Untitled

a guest
Jun 13th, 2020
1,662
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 7.46 KB | None | 0 0
  1.  
  2. using Toybox.Application;
  3. using Toybox.Graphics;
  4. using Toybox.System;
  5. using Toybox.Time;
  6. using Toybox.Time.Gregorian;
  7. using Toybox.WatchUi;
  8. using Toybox.BluetoothLowEnergy as Ble;
  9.  
  10.  
  11. class BleDiscoverResult
  12. {
  13.     private var moment;
  14.     private var data;
  15.     private var name;
  16.     private var uuid;
  17.  
  18.     function initialize(moment, scanResult) {
  19.         update(moment, scanResult);
  20.     }
  21.  
  22.     function update(moment, scanResult) {
  23.         self.moment = moment;
  24.         data = scanResult;
  25.  
  26.         if (name == null) {
  27.             name = _getDeviceName(scanResult);
  28.         }
  29.  
  30.         uuid = _getServiceUuids(scanResult);
  31.     }
  32.  
  33.     function isSameDevice(scanResult) {
  34.         return scanResult.isSameDevice(data);
  35.     }
  36.  
  37.     function getTimeStamp() {
  38.         var info = Gregorian.info(self.moment, Time.FORMAT_SHORT);
  39.  
  40.         // convert from 24 to 12-hour clock
  41.         info.hour = 1 + (info.hour + 11) % 12;
  42.  
  43.         // display H:MM:SS
  44.         info.hour = info.hour.format("%d");
  45.         info.min = info.min.format("%02d");
  46.         info.sec = info.sec.format("%02d");
  47.  
  48.         return Lang.format("$1$:$2$:$3$", [ info.hour, info.min, info.sec ] );
  49.     }
  50.  
  51.     function getDescription() {
  52.         if (name != null) {
  53.             return Lang.format("name=$1$", [ name ]);
  54.         }
  55.  
  56.         if (uuid != null) {
  57.             return Lang.format("uuid=$1$", [ uuid ]);
  58.         }
  59.  
  60.         return Lang.format("rssi=$1$", [ data.getRssi() ]);
  61.     }
  62.  
  63.     private function _getDeviceName(scanResult) {
  64.         return scanResult.getDeviceName();
  65.     }
  66.  
  67.     private function _getServiceUuids(scanResult) {
  68.         var iter = scanResult.getServiceUuids();
  69.         if (iter != null) {
  70.             var uuids = [];
  71.  
  72.             var uuid = iter.next();
  73.             while (uuid != null) {
  74.                 uuids.add(uuid.toString());
  75.                 uuid = iter.next();
  76.             }
  77.  
  78.             if (uuids.size() != 0) {
  79.                 return uuids;
  80.             }
  81.         }
  82.  
  83.         return null;
  84.     }
  85. }
  86.  
  87.  
  88. class BleDiscoverModel extends Ble.BleDelegate
  89. {
  90.     hidden var _scanResults;
  91.     hidden var _scanState;
  92.     hidden var _maxResults;
  93.  
  94.     function initialize() {
  95.         BleDelegate.initialize();
  96.  
  97.         _scanResults = [];
  98.         _scanState = Ble.SCAN_STATE_OFF;
  99.  
  100.         _maxResults = 10;
  101.     }
  102.  
  103.     function onStart() {
  104.     }
  105.  
  106.     function onStop() {
  107.     }
  108.  
  109.     private function addScanResult(moment, scanResult) {
  110.  
  111.         // if we already have a result for the same device, just update it
  112.         for (var i = 0; i < _scanResults.size(); ++i) {
  113.             var foundResult = _scanResults[i];
  114.             if (foundResult.isSameDevice(scanResult)) {
  115.                 foundResult.update(moment, scanResult);
  116.                 return;
  117.             }
  118.         }
  119.  
  120.         // otherwise append the result, making sure we don't have more than we can
  121.         // display
  122.  
  123.         _scanResults = _scanResults.slice(-_maxResults, null);
  124.         _scanResults.add(new BleDiscoverResult(moment, scanResult));
  125.     }
  126.  
  127.  
  128.     function onScanResults(scanResults) {
  129.         var moment = Time.now();
  130.  
  131.         // add/update result
  132.         var scanResult = scanResults.next();
  133.         while (scanResult != null) {
  134.             addScanResult(moment, scanResult);
  135.             scanResult = scanResults.next();
  136.         }
  137.  
  138.         WatchUi.requestUpdate();
  139.     }
  140.  
  141.     function getScanResults() {
  142.         return _scanResults;
  143.     }
  144.  
  145.     function clearScanResults() {
  146.         _scanResults = [];
  147.         WatchUi.requestUpdate();
  148.     }
  149.  
  150.     function onScanStateChange(scanState, status) {
  151.         _scanState = scanState;
  152.         WatchUi.requestUpdate();
  153.     }
  154.  
  155.     function isScanning() {
  156.         return _scanState != Ble.SCAN_STATE_OFF;
  157.     }
  158. }
  159.  
  160.  
  161. class BleDiscoverView extends WatchUi.View
  162. {
  163.     hidden var _xpos;
  164.     hidden var _font;
  165.     hidden var _ljust;
  166.     hidden var _rjust;
  167.     hidden var _cjust;
  168.     hidden var _lineHeight;
  169.     hidden var _viewHeight;
  170.     hidden var _model;
  171.  
  172.     function initialize(model) {
  173.         View.initialize();
  174.         _model = model;
  175.     }
  176.  
  177.     function onLayout(dc) {
  178.         _xpos = dc.getWidth() / 3;
  179.  
  180.         _font = Graphics.FONT_XTINY;
  181.         _ljust = Graphics.TEXT_JUSTIFY_LEFT;
  182.         _rjust = Graphics.TEXT_JUSTIFY_RIGHT;
  183.         _cjust = Graphics.TEXT_JUSTIFY_CENTER;
  184.  
  185.         _lineHeight = dc.getFontHeight(_font);
  186.         _viewHeight = dc.getHeight();
  187.     }
  188.  
  189.     function onUpdate(dc) {
  190.         dc.setColor(Graphics.COLOR_WHITE, Graphics.COLOR_BLACK);
  191.         dc.clear();
  192.  
  193.         var ypos = _lineHeight;
  194.  
  195.         var isScanning = _model.isScanning();
  196.  
  197.         var scanResults = _model.getScanResults();
  198.         if (scanResults.size() == 0) {
  199.             var ypos = dc.getHeight() / 2 - (3 * _lineHeight) / 2;
  200.  
  201.             dc.drawText(dc.getWidth() / 2, ypos, _font, "MENU to clear results", _cjust);
  202.             ypos += _lineHeight;
  203.             dc.drawText(dc.getWidth() / 2, ypos, _font, Lang.format("SELECT to $1$ scanning", [ isScanning ? "STOP" : "START" ]), _cjust);
  204.             ypos += _lineHeight;
  205.             dc.drawText(dc.getWidth() / 2, ypos, _font, "BACK to exit", _cjust);
  206.         }
  207.         else {
  208.             for (var i = 0; i < scanResults.size(); ++i) {
  209.                 var scanResult = scanResults[i];
  210.  
  211.                 var timestamp = scanResult.getTimeStamp();
  212.                 dc.drawText(_xpos, ypos, _font, Lang.format("$1$: ", [ timestamp ]), _rjust);
  213.  
  214.                 // either `name`, [ uuid, ... ], or null
  215.                 var description = scanResult.getDescription();
  216.                 dc.drawText(_xpos, ypos, _font, Lang.format("$1$", [ description ]), _ljust);
  217.                 ypos += _lineHeight;
  218.             }
  219.         }
  220.  
  221.         var color;
  222.         if (isScanning) {
  223.             color = Graphics.COLOR_GREEN;
  224.         }
  225.         else {
  226.             color = Graphics.COLOR_RED;
  227.         }
  228.  
  229.         dc.setColor(color, color);
  230.         dc.fillCircle(dc.getWidth() - 20, dc.getHeight() / 2, 10);
  231.     }
  232. }
  233.  
  234.  
  235. class BleDiscoverController extends WatchUi.BehaviorDelegate
  236. {
  237.     hidden var _view;
  238.     hidden var _model;
  239.  
  240.     function initialize(model) {
  241.         BehaviorDelegate.initialize();
  242.         _model = model;
  243.     }
  244.  
  245.     function onStart() {
  246.         Ble.setDelegate(_model);
  247.     }
  248.  
  249.     function onStop() {
  250.         // Ble.setDelegate(null);
  251.     }
  252.  
  253.     function onSelect() {
  254.         var isScanning = _model.isScanning();
  255.         if (isScanning) {
  256.             Ble.setScanState(Ble.SCAN_STATE_OFF);
  257.         } else {
  258.             Ble.setScanState(Ble.SCAN_STATE_SCANNING);
  259.         }
  260.  
  261.         return true;
  262.     }
  263.  
  264.     function onMenu() {
  265.         _model.clearScanResults();
  266.         WatchUi.requestUpdate();
  267.     }
  268.  
  269.     function getInitialView() {
  270.         _view = new BleDiscoverView(_model);
  271.         return [ _view, self ];
  272.     }
  273. }
  274.  
  275.  
  276. class BleDiscoverApp extends Application.AppBase {
  277.  
  278.     hidden var _controller;
  279.     hidden var _model;
  280.  
  281.     function initialize() {
  282.         AppBase.initialize();
  283.     }
  284.  
  285.     function onStart(state) {
  286.         _model = new BleDiscoverModel();
  287.         _model.onStart();
  288.  
  289.         _controller = new BleDiscoverController(_model);
  290.         _controller.onStart();
  291.     }
  292.  
  293.     function onStop(state) {
  294.         _controller.onStop();
  295.         _controller = null;
  296.  
  297.         _model.onStop();
  298.         _model = null;
  299.     }
  300.  
  301.     function getInitialView() {
  302.         return _controller.getInitialView();
  303.     }
  304. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement