diff --git a/client/Nightr/package-lock.json b/client/Nightr/package-lock.json index 04b5e41..1469775 100644 --- a/client/Nightr/package-lock.json +++ b/client/Nightr/package-lock.json @@ -3776,6 +3776,14 @@ "reflect-metadata": "^0.1.8" } }, + "nativescript-camera": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/nativescript-camera/-/nativescript-camera-4.4.0.tgz", + "integrity": "sha512-9Snw/IGjw8cVN1nOwkhQko/x/D2thcd6FZT98k9bstvCHwdBBdmLtGGcHCm4SN0k3MSgvbghs8iaARniZCKO0Q==", + "requires": { + "nativescript-permissions": "^1.2.3" + } + }, "nativescript-dev-typescript": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/nativescript-dev-typescript/-/nativescript-dev-typescript-0.9.0.tgz", diff --git a/client/Nightr/package.json b/client/Nightr/package.json index ddcc97a..36bf9c5 100644 --- a/client/Nightr/package.json +++ b/client/Nightr/package.json @@ -22,6 +22,7 @@ "@angular/platform-browser-dynamic": "~7.2.0", "@angular/router": "~7.2.0", "nativescript-angular": "~7.2.0", + "nativescript-camera": "^4.4.0", "nativescript-geolocation": "^5.0.0", "nativescript-theme-core": "~1.0.4", "reflect-metadata": "~0.1.12", diff --git a/client/Nightr/src/app/app.component.html b/client/Nightr/src/app/app.component.html index 97b4fff..8de10bd 100644 --- a/client/Nightr/src/app/app.component.html +++ b/client/Nightr/src/app/app.component.html @@ -4,8 +4,9 @@ - + - + + diff --git a/client/Nightr/src/app/app.module.ts b/client/Nightr/src/app/app.module.ts index aefc8e2..04ef01a 100644 --- a/client/Nightr/src/app/app.module.ts +++ b/client/Nightr/src/app/app.module.ts @@ -5,6 +5,7 @@ import { AppComponent } from "./app.component"; import { MyButtonComponent } from './component/my-button/my-button.component'; import { NativeScriptHttpClientModule } from "nativescript-angular/http-client"; import { MyLocationButtonComponent } from './component/locationButton/locationButton.component'; +import { CameraButtonComponent } from './component/camera-button/camera-button.component'; // Uncomment and add to NgModule imports if you need to use two-way binding // import { NativeScriptFormsModule } from "nativescript-angular/forms"; @@ -24,6 +25,7 @@ import { MyLocationButtonComponent } from './component/locationButton/locationBu AppComponent, MyLocationButtonComponent, MyButtonComponent, + CameraButtonComponent, ], providers: [], schemas: [ diff --git a/client/Nightr/src/app/component/camera-button/camera-button.component.css b/client/Nightr/src/app/component/camera-button/camera-button.component.css new file mode 100644 index 0000000..bcd4764 --- /dev/null +++ b/client/Nightr/src/app/component/camera-button/camera-button.component.css @@ -0,0 +1 @@ +/* Add mobile styles for the component here. */ diff --git a/client/Nightr/src/app/component/camera-button/camera-button.component.html b/client/Nightr/src/app/component/camera-button/camera-button.component.html new file mode 100644 index 0000000..4fe4caf --- /dev/null +++ b/client/Nightr/src/app/component/camera-button/camera-button.component.html @@ -0,0 +1 @@ + diff --git a/client/Nightr/src/app/component/camera-button/camera-button.component.ts b/client/Nightr/src/app/component/camera-button/camera-button.component.ts new file mode 100644 index 0000000..bd916ef --- /dev/null +++ b/client/Nightr/src/app/component/camera-button/camera-button.component.ts @@ -0,0 +1,25 @@ +import { Component, OnInit } from '@angular/core'; +import { MyCameraService } from '../../services/my-camera-service'; +import { Image } from 'tns-core-modules/ui/image' + +@Component({ + selector: 'ns-camera-button', + templateUrl: './camera-button.component.html', + styleUrls: ['./camera-button.component.css'], + moduleId: module.id, +}) +export class CameraButtonComponent implements OnInit { + + camera:MyCameraService = new MyCameraService(); + constructor() { } + + ngOnInit() { + } + + onTap() { + this.camera.takePicture().then( + (res) => {console.log(res)}, () => {} + ); +} + +} diff --git a/client/Nightr/src/app/services/my-camera-service.ts b/client/Nightr/src/app/services/my-camera-service.ts new file mode 100644 index 0000000..a6a4f14 --- /dev/null +++ b/client/Nightr/src/app/services/my-camera-service.ts @@ -0,0 +1,35 @@ +import { Injectable } from '@angular/core'; +import * as camera from 'nativescript-camera'; +import { ImageSource } from 'tns-core-modules/image-source/image-source'; + +@Injectable({ + providedIn: 'root' +}) +export class MyCameraService { + + constructor() { } + + takePicture(): Promise { + var result = new Promise((resolve, reject) => { + camera.requestPermissions(). + then( + () => { + camera.takePicture().then( + (imageAsset) => { + var src = new ImageSource(); + src.fromAsset(imageAsset).then( + (source) => { + resolve(source.toBase64String("png", 75)); + alert("Image uploaded"); + } + ); + } + ).catch((error) => alert(error.message)); + }, () => { + alert("Request rejected"); + } + ).catch(); + }); + return result; + } +} diff --git a/client/Nightr/src/app/services/my-geo-location.service.ts b/client/Nightr/src/app/services/my-geo-location.service.ts index 4de390a..fa658b8 100644 --- a/client/Nightr/src/app/services/my-geo-location.service.ts +++ b/client/Nightr/src/app/services/my-geo-location.service.ts @@ -1,6 +1,5 @@ import { Injectable } from '@angular/core'; import { isEnabled, enableLocationRequest, getCurrentLocation, watchLocation, distance, clearWatch, Location } from "nativescript-geolocation"; -import { stringify } from '@angular/core/src/render3/util'; @Injectable({ providedIn: 'root' diff --git a/client/Nightr/src/main.js b/client/Nightr/src/main.js index faf70ce..d07591d 100644 --- a/client/Nightr/src/main.js +++ b/client/Nightr/src/main.js @@ -11,4 +11,4 @@ var app_module_1 = require("./app/app.module"); // so we provide a wrapper platform object, platformNativeScriptDynamic, // that sets up a NativeScript application and can bootstrap the Angular framework. platform_1.platformNativeScriptDynamic().bootstrapModule(app_module_1.AppModule); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1haW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwwR0FBMEc7QUFDMUcsMERBQTRFO0FBRTVFLCtDQUE2QztBQUU3QyxnRkFBZ0Y7QUFDaEYsMEVBQTBFO0FBQzFFLHNFQUFzRTtBQUN0RSx5REFBeUQ7QUFDekQseUVBQXlFO0FBQ3pFLHdFQUF3RTtBQUN4RSxtRkFBbUY7QUFDbkYsc0NBQTJCLEVBQUUsQ0FBQyxlQUFlLENBQUMsc0JBQVMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gdGhpcyBpbXBvcnQgc2hvdWxkIGJlIGZpcnN0IGluIG9yZGVyIHRvIGxvYWQgc29tZSByZXF1aXJlZCBzZXR0aW5ncyAobGlrZSBnbG9iYWxzIGFuZCByZWZsZWN0LW1ldGFkYXRhKVxyXG5pbXBvcnQgeyBwbGF0Zm9ybU5hdGl2ZVNjcmlwdER5bmFtaWMgfSBmcm9tIFwibmF0aXZlc2NyaXB0LWFuZ3VsYXIvcGxhdGZvcm1cIjtcclxuXHJcbmltcG9ydCB7IEFwcE1vZHVsZSB9IGZyb20gXCIuL2FwcC9hcHAubW9kdWxlXCI7XHJcblxyXG4vLyBBIHRyYWRpdGlvbmFsIE5hdGl2ZVNjcmlwdCBhcHBsaWNhdGlvbiBzdGFydHMgYnkgaW5pdGlhbGl6aW5nIGdsb2JhbCBvYmplY3RzLFxyXG4vLyBzZXR0aW5nIHVwIGdsb2JhbCBDU1MgcnVsZXMsIGNyZWF0aW5nLCBhbmQgbmF2aWdhdGluZyB0byB0aGUgbWFpbiBwYWdlLlxyXG4vLyBBbmd1bGFyIGFwcGxpY2F0aW9ucyBuZWVkIHRvIHRha2UgY2FyZSBvZiB0aGVpciBvd24gaW5pdGlhbGl6YXRpb246XHJcbi8vIG1vZHVsZXMsIGNvbXBvbmVudHMsIGRpcmVjdGl2ZXMsIHJvdXRlcywgREkgcHJvdmlkZXJzLlxyXG4vLyBBIE5hdGl2ZVNjcmlwdCBBbmd1bGFyIGFwcCBuZWVkcyB0byBtYWtlIGJvdGggcGFyYWRpZ21zIHdvcmsgdG9nZXRoZXIsXHJcbi8vIHNvIHdlIHByb3ZpZGUgYSB3cmFwcGVyIHBsYXRmb3JtIG9iamVjdCwgcGxhdGZvcm1OYXRpdmVTY3JpcHREeW5hbWljLFxyXG4vLyB0aGF0IHNldHMgdXAgYSBOYXRpdmVTY3JpcHQgYXBwbGljYXRpb24gYW5kIGNhbiBib290c3RyYXAgdGhlIEFuZ3VsYXIgZnJhbWV3b3JrLlxyXG5wbGF0Zm9ybU5hdGl2ZVNjcmlwdER5bmFtaWMoKS5ib290c3RyYXBNb2R1bGUoQXBwTW9kdWxlKTtcclxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1haW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwwR0FBMEc7QUFDMUcsMERBQTRFO0FBRTVFLCtDQUE2QztBQUU3QyxnRkFBZ0Y7QUFDaEYsMEVBQTBFO0FBQzFFLHNFQUFzRTtBQUN0RSx5REFBeUQ7QUFDekQseUVBQXlFO0FBQ3pFLHdFQUF3RTtBQUN4RSxtRkFBbUY7QUFDbkYsc0NBQTJCLEVBQUUsQ0FBQyxlQUFlLENBQUMsc0JBQVMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gdGhpcyBpbXBvcnQgc2hvdWxkIGJlIGZpcnN0IGluIG9yZGVyIHRvIGxvYWQgc29tZSByZXF1aXJlZCBzZXR0aW5ncyAobGlrZSBnbG9iYWxzIGFuZCByZWZsZWN0LW1ldGFkYXRhKVxuaW1wb3J0IHsgcGxhdGZvcm1OYXRpdmVTY3JpcHREeW5hbWljIH0gZnJvbSBcIm5hdGl2ZXNjcmlwdC1hbmd1bGFyL3BsYXRmb3JtXCI7XG5cbmltcG9ydCB7IEFwcE1vZHVsZSB9IGZyb20gXCIuL2FwcC9hcHAubW9kdWxlXCI7XG5cbi8vIEEgdHJhZGl0aW9uYWwgTmF0aXZlU2NyaXB0IGFwcGxpY2F0aW9uIHN0YXJ0cyBieSBpbml0aWFsaXppbmcgZ2xvYmFsIG9iamVjdHMsXG4vLyBzZXR0aW5nIHVwIGdsb2JhbCBDU1MgcnVsZXMsIGNyZWF0aW5nLCBhbmQgbmF2aWdhdGluZyB0byB0aGUgbWFpbiBwYWdlLlxuLy8gQW5ndWxhciBhcHBsaWNhdGlvbnMgbmVlZCB0byB0YWtlIGNhcmUgb2YgdGhlaXIgb3duIGluaXRpYWxpemF0aW9uOlxuLy8gbW9kdWxlcywgY29tcG9uZW50cywgZGlyZWN0aXZlcywgcm91dGVzLCBESSBwcm92aWRlcnMuXG4vLyBBIE5hdGl2ZVNjcmlwdCBBbmd1bGFyIGFwcCBuZWVkcyB0byBtYWtlIGJvdGggcGFyYWRpZ21zIHdvcmsgdG9nZXRoZXIsXG4vLyBzbyB3ZSBwcm92aWRlIGEgd3JhcHBlciBwbGF0Zm9ybSBvYmplY3QsIHBsYXRmb3JtTmF0aXZlU2NyaXB0RHluYW1pYyxcbi8vIHRoYXQgc2V0cyB1cCBhIE5hdGl2ZVNjcmlwdCBhcHBsaWNhdGlvbiBhbmQgY2FuIGJvb3RzdHJhcCB0aGUgQW5ndWxhciBmcmFtZXdvcmsuXG5wbGF0Zm9ybU5hdGl2ZVNjcmlwdER5bmFtaWMoKS5ib290c3RyYXBNb2R1bGUoQXBwTW9kdWxlKTtcbiJdfQ== \ No newline at end of file diff --git a/server/nightr/app.py b/server/nightr/app.py index 3eecf5e..b84d768 100644 --- a/server/nightr/app.py +++ b/server/nightr/app.py @@ -10,7 +10,7 @@ from typing import List import requests_cache from flask import Flask, jsonify, logging, request -from .strategies import miloStrats, iss, cars_in_traffic, tide_strat, upstairs_neighbour +from .strategies import miloStrats, iss, cars_in_traffic, tide_strat, upstairs_neighbour, bing from .util import Context app = Flask(__name__) @@ -29,6 +29,7 @@ strategies = { "cars_in_traffic": cars_in_traffic.cars_in_traffic, "tide": tide_strat.is_tide, "upstairs_neighbour": upstairs_neighbour.check_games, + "bing": bing.clock, } @@ -77,13 +78,13 @@ def probabilities(): prediction["night"] = not prediction["night"] # Calculate contributions of predictions - consensus_weight_sum = sum(p["weight"] for p in predictions if p["night"] == night) + weight_sum = sum(p["weight"] for p in predictions) for prediction in predictions: - # If this prediction agrees with the consensus it contributed - if prediction["night"] == night: - prediction["contribution"] = prediction["weight"] / consensus_weight_sum - else: - prediction["contribution"] = 0.0 + prediction["contribution"] = prediction["weight"] / weight_sum + + # If this prediction disagrees with the consensus it contributed negatively + if prediction["night"] != night: + prediction["contribution"] *= -1 return jsonify({ "predictions": predictions, diff --git a/server/nightr/strategies/bing.py b/server/nightr/strategies/bing.py new file mode 100644 index 0000000..95d7064 --- /dev/null +++ b/server/nightr/strategies/bing.py @@ -0,0 +1,34 @@ +from datetime import datetime + +import requests +from bs4 import BeautifulSoup + +from ..util import Context, Prediction + + +def clock(context: Context) -> Prediction: + """ + It's nighttime if Bing says it's daytime. + """ + p = Prediction() + p.weight = 0.5 + + headers = { + 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36'} + r = requests.get("https://www.bing.com/search?q=time+in+denmark", headers=headers) + soup = BeautifulSoup(r.content, features='html5lib') + time_str = soup.find("div", {"id": "digit_time"}).text + + time = datetime.strptime(time_str, "%H:%M") + night = time.hour < 6 or time.hour >= 22 + + time_description = "" if night else "daytime" + time_description_oppersite = "daytime" if night else "nighttime" + + p.reasons.append(f"Bing says its {time_description}.") + p.reasons.append(f"We don't really trust it.") + p.reasons.append(f"Let's guess its {time_description_oppersite}.") + + p.probability = 1 - p.probability + + return p diff --git a/server/nightr/strategies/iss.py b/server/nightr/strategies/iss.py index e4ca5de..64b308a 100644 --- a/server/nightr/strategies/iss.py +++ b/server/nightr/strategies/iss.py @@ -48,7 +48,7 @@ def night_on_iss(context: Context) -> Prediction: break iss_time = datetime.now(pytz.timezone(iss_tz)) - iss_night = 6 < iss_time.hour > 22 + iss_night = iss_time.hour < 6 or iss_time.hour >= 22 # iss_night on_iss_time night # 0 0 1 diff --git a/server/nightr/strategies/miloStrats.py b/server/nightr/strategies/miloStrats.py index 3fc4c43..d0418f7 100644 --- a/server/nightr/strategies/miloStrats.py +++ b/server/nightr/strategies/miloStrats.py @@ -11,7 +11,7 @@ def camImgStrat(context : Context) -> Prediction: The contents of the camera image """ img = context.image - average = img.mean(axis=0).mean(axis=0) + average = img.mean() p = Prediction() p.weight = 0.7 if average < 100: @@ -40,7 +40,11 @@ def australiaStrat(context : Context) -> Prediction: p.reasons.append('It\'s day-time in Australia') return p + def tv2newsStrat(context : Context) -> Prediction: + """ + The number of articles releases in the last few hours on TV2.dk + """ r = requests.get('http://mpx.services.tv2.dk/api/latest') data = r.json() publish_dates = [(x['pubDate'])//1000 for x in data][:10] @@ -61,4 +65,3 @@ def tv2newsStrat(context : Context) -> Prediction: p.probability = 1.0 if avg_timestamp > 50 else 0.0 p.reasons.append('There were ' + ('few' if avg_timestamp > 50 else 'many') + ' recent articles on TV2 News') return p - diff --git a/server/nightr/util.py b/server/nightr/util.py index ce7d143..6c70643 100644 --- a/server/nightr/util.py +++ b/server/nightr/util.py @@ -9,7 +9,7 @@ import numpy as np @dataclass class Context: - battery: float = 1.0 + battery: int = 100 position: Dict[str, float] = field(default_factory=lambda: {'latitude': 53.0, 'longitude': 9.0}) image: np.ndarray = None