You've already forked Project_Steam_Tracker
Compare commits
30 Commits
55a217a128
...
master
Author | SHA1 | Date | |
---|---|---|---|
![]() |
305dad62a1 | ||
![]() |
5f587f1f49 | ||
![]() |
f23f75520b | ||
![]() |
25e0f26e3c | ||
![]() |
16c75bcecb | ||
![]() |
9909cc5c86 | ||
![]() |
a6c0888b58 | ||
![]() |
67b93513b5 | ||
![]() |
5309692d89 | ||
![]() |
42b696834f | ||
![]() |
666b66ca72 | ||
![]() |
cdbfa40f4b | ||
![]() |
249ee1910f | ||
![]() |
c1d35c6d56 | ||
![]() |
449b97b757 | ||
![]() |
84467c00d0 | ||
![]() |
f73c20ad3d | ||
![]() |
aa0382f8c5 | ||
![]() |
dd7033af64 | ||
![]() |
d0f54a73d2 | ||
![]() |
c60f2a3927 | ||
![]() |
1e6f63cfbe | ||
![]() |
4a48535dfc | ||
![]() |
a082c7a038 | ||
![]() |
696ecc02ca | ||
![]() |
56051b886d | ||
![]() |
7406ef157f | ||
![]() |
b2a397d4f8 | ||
![]() |
f48e9309b9 | ||
![]() |
80d6bf0061 |
446
Les opdrachten/AI opdrachten/FA1/practicum_1_getallen_student.py
Executable file
446
Les opdrachten/AI opdrachten/FA1/practicum_1_getallen_student.py
Executable file
File diff suppressed because it is too large
Load Diff
244
Les opdrachten/AI opdrachten/FA2/practicum_2_algoritmiek_student.py
Executable file
244
Les opdrachten/AI opdrachten/FA2/practicum_2_algoritmiek_student.py
Executable file
@@ -0,0 +1,244 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
Oriëntatie op AI
|
||||
|
||||
Practicum 2: algoritmiek
|
||||
|
||||
(c) 2019 Hogeschool Utrecht
|
||||
Tijmen Muller (tijmen.muller@hu.nl)
|
||||
|
||||
|
||||
Opdracht: beantwoord onderstaande vragen en werk onderstaande functies uit.
|
||||
|
||||
Je kunt je functies testen met het gegeven raamwerk door het bestand
|
||||
uit te voeren (of met behulp van pytest, als je weet hoe dat werkt).
|
||||
Lever je werk in op Canvas als alle tests slagen.
|
||||
|
||||
Let op! Het is niet toegestaan om bestaande modules te importeren en te
|
||||
gebruiken, zoals `math` en `statistics`.
|
||||
"""
|
||||
|
||||
# Vul hier je naam, klas en studentnummer in
|
||||
naam = "Taha Genc"
|
||||
klas = "TICT-PV-SG5-20"
|
||||
studentnummer = 1788230
|
||||
|
||||
"""
|
||||
1. Sorteeralgoritme
|
||||
|
||||
Hieronder staat de pseudocode van een sorteeralgoritme:
|
||||
1. Startend vanaf het begin van een lijst,
|
||||
vergelijk elk element met zijn volgende buur.
|
||||
2. Als het element groter is dan zijn volgende buur,
|
||||
verwissel ze van plaats.
|
||||
3. Doorloop zo de lijst tot het eind.
|
||||
4. Als er verwisselingen zijn geweest bij stap 2., ga naar stap 1.
|
||||
|
||||
1a. Handmatig toepassen
|
||||
Gegeven is de lijst l = [ 4, 3, 1, 2 ]. Geef de waardes die deze
|
||||
lijst aanneemt bij álle tussenstappen bij toepassing van
|
||||
bovenstaand sorteeralgoritme.
|
||||
|
||||
0 = [ 4, 3, 1, 2 ]
|
||||
1 = [ 3, 4, 1, 2 ]
|
||||
2 = [ 3, 1, 4, 2 ]
|
||||
3 = [ 1, 3, 4, 2 ]
|
||||
4 = [ 1, 3, 2, 4 ]
|
||||
5 = [ 1, 2, 3, 4 ]
|
||||
|
||||
1b. Implementatie
|
||||
Implementeer het sorteeralgoritme in Python in een functie
|
||||
hieronder genaamd my_sort(lst).
|
||||
|
||||
1c. Best en worst case
|
||||
- Stel je hebt een lijst met de waarden 1, 2 en 3. Bij welke
|
||||
volgorde van de waarden in de lijst is het sorteeralgoritme
|
||||
het snelste klaar (best-case scenario)?
|
||||
Hoeveel vergelijkingen (zoals beschreven in stap 1. van de
|
||||
pseudocode) zijn nodig geweest?
|
||||
|
||||
bij een array van [1,2,3] zijn er minimaal 2 vergelijkingen nodig
|
||||
|
||||
|
||||
- Bij welke volgorde van de waarden in de lijst is het
|
||||
sorteeralgoritme het minst snel klaar (worst-case scenario)?
|
||||
Hoeveel vergelijkingen zijn nodig geweest?
|
||||
|
||||
bij een array van [3,2,1] zijn er maximaal 3 vergelijkingen nodig
|
||||
|
||||
|
||||
- Stel je hebt een lijst met de waarden 1 tot en met 4.
|
||||
Wat is nu het best-case scenario? [1,2,3,4]
|
||||
Hoeveel vergelijkingen zijn er nodig? 3 vergelijkingen
|
||||
En wat is nu het worst-case scenario? [4,3,2,1]
|
||||
Hoeveel vergelijkingen zijn er nodig? 7 vergelijkingen
|
||||
|
||||
|
||||
|
||||
- Stel je hebt een lijst met de waarden 1 tot en met n
|
||||
(je weet nu dus niet precies hoeveel waarden er in de lijst
|
||||
zitten, het zijn er 'n').
|
||||
Wat is nu het best-case scenario? een gesorteerde lijst of n=1
|
||||
Hoeveel vergelijkingen zijn er nodig? n-1
|
||||
En wat is nu het worst-case scenario? gesorteerd in de verkeerde richting
|
||||
Hoeveel vergelijkingen zijn er nodig? 1/2 * n + 1
|
||||
|
||||
|
||||
2. Recursie
|
||||
|
||||
2a. Lineair zoeken
|
||||
Implementeer het lineair zoekalgoritme in Python op een
|
||||
*recursieve* manier. Gebruik hiervoor de functie genaamd
|
||||
linear_search_recursive(lst, target).
|
||||
|
||||
2b. Binair zoeken
|
||||
Implementeer het binair zoekalgoritme in Python op een
|
||||
*recursieve* manier. Gebruik hiervoor de functie genaamd
|
||||
binary_search_recursive(lst, target).
|
||||
"""
|
||||
|
||||
|
||||
def my_sort(lst):
|
||||
"""
|
||||
Sorteer gegeven lijst lst volgens het algoritme zoals beschreven in de pseudocode bij 1. hierboven.
|
||||
Zorg dat de gegeven lijst niet verandert, maar geef een nieuwe, gesorteerde variant van de lijst terug.
|
||||
"""
|
||||
lst_sorted = lst.copy() # kopie maken van ingegeven list
|
||||
|
||||
for _ in range(len(lst) - 1):
|
||||
for x in range(len(lst)-1):
|
||||
if lst_sorted[x] > lst_sorted[x+1]:
|
||||
lst_sorted[x], lst_sorted[x+1] = lst_sorted[x+1], lst_sorted[x]
|
||||
|
||||
|
||||
|
||||
|
||||
return lst_sorted
|
||||
|
||||
|
||||
def linear_search_recursive(lst, target):
|
||||
"""
|
||||
Zoek een element target in gegeven lijst lst door middel van recursief lineair zoeken.
|
||||
De inhoud van de gegeven lijst verandert niet.
|
||||
|
||||
Args:
|
||||
lst -- de lijst waarin gezocht wordt (list)
|
||||
target -- het element dat gezocht wordt
|
||||
|
||||
Returns:
|
||||
of het element in de lijst voorkomt (bool)
|
||||
"""
|
||||
if len(lst) == 0: # als lijst geen entries meer bevat false returnen
|
||||
return False
|
||||
elif lst[0] == target: # als positie 0 de target bevat true returnen
|
||||
return True
|
||||
else:
|
||||
return linear_search_recursive(lst[1:], target) # zichzelf starten min de eerste entry in de list
|
||||
|
||||
|
||||
|
||||
|
||||
def binary_search_recursive(lst, target):
|
||||
"""
|
||||
Zoek een element target in gegeven lijst door middel van recursief binair zoeken.
|
||||
De inhoud van de gegeven lijst verandert niet.
|
||||
|
||||
Args:
|
||||
lst -- de (reeds gesorteerde) lijst waarin gezocht wordt (list)
|
||||
target -- het element dat gezocht wordt
|
||||
|
||||
Returns:
|
||||
of het element in de lijst voorkomt (bool)
|
||||
"""
|
||||
|
||||
laag = 0 # laagste positie
|
||||
hoog = len(lst) - 1 # hoogste positie
|
||||
cur = (len(lst) - 1) // 2 # middenste index berekenen afrondend naar beneden
|
||||
|
||||
if target == lst[cur]: # als cursor positie al de target is true returnen
|
||||
return True
|
||||
|
||||
if hoog > laag: # als de lijst meer dan 1 item bevat, anders bevat de lijst 1 item die niet de target is
|
||||
if lst[cur] > target: # als target lager ligt dan de cursor
|
||||
return binary_search_recursive(lst[0:cur+1], target) # functie oproepen met de lijst lager dan de cursor
|
||||
elif lst[cur] < target: # als de target hoger ligt dan de cursor
|
||||
return binary_search_recursive(lst[cur+1:hoog+1], target) # functie oproepen met de lijst hoger dan de cursor
|
||||
|
||||
return False
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
"""
|
||||
==========================[ HU TESTRAAMWERK ]================================
|
||||
Onderstaand staan de tests voor je code -- hieronder mag je niets wijzigen!
|
||||
Je kunt je code testen door deze file te runnen of met behulp van pytest.
|
||||
"""
|
||||
import random
|
||||
|
||||
|
||||
def test_id():
|
||||
assert naam != "", "Je moet je naam nog invullen!"
|
||||
assert studentnummer != -1, "Je moet je studentnummer nog invullen!"
|
||||
assert klas != "", "Je moet je klas nog invullen!"
|
||||
|
||||
|
||||
def test_my_sort():
|
||||
lst_test = random.choices(range(-99, 100), k=6)
|
||||
lst_copy = lst_test.copy()
|
||||
lst_output = my_sort(lst_test)
|
||||
|
||||
assert lst_copy == lst_test, "Fout: my_sort(lst) verandert de inhoud van lijst lst"
|
||||
assert lst_output == sorted(lst_test), \
|
||||
f"Fout: my_sort({lst_test}) geeft {lst_output} in plaats van {sorted(lst_test)}"
|
||||
|
||||
|
||||
def test_linear_search_recursive():
|
||||
for _ in range(99): # ik heb deze waarde van 10 naar 99 aangepast zodat ik iteratie bugs kan vinden
|
||||
lst_test = random.sample(range(20), 6)
|
||||
target = random.randrange(20)
|
||||
found = target in lst_test
|
||||
lst_copy = lst_test.copy()
|
||||
|
||||
outcome = linear_search_recursive(lst_test, target)
|
||||
assert lst_copy == lst_test, "Fout: linear_search_recursive(lst, target) verandert de inhoud van lijst lst"
|
||||
assert outcome == found, \
|
||||
f"Fout: linear_search_recursive({lst_test}, {target}) geeft {outcome} in plaats van {found}"
|
||||
|
||||
|
||||
def test_binary_search_recursive():
|
||||
for _ in range(99): # ik heb deze waarde van 10 naar 99 aangepast zodat ik iteratie bugs kan vinden
|
||||
lst_test = sorted(random.sample(range(20), 6))
|
||||
target = random.randrange(20)
|
||||
found = target in lst_test
|
||||
lst_copy = lst_test.copy()
|
||||
|
||||
outcome = binary_search_recursive(lst_test, target)
|
||||
assert outcome == found, \
|
||||
f"Fout: binary_search_recursive({lst_test}, {target}) geeft {outcome} in plaats van {found}"
|
||||
assert lst_copy == lst_test, "Fout: binary_search_recursive(lst, target) verandert de inhoud van lijst lst"
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
print("\x1b[0;32m")
|
||||
test_id()
|
||||
|
||||
test_my_sort()
|
||||
print("Je functie my_sort() werkt goed!")
|
||||
|
||||
test_linear_search_recursive()
|
||||
print("Je functie linear_search_recursive() werkt goed!")
|
||||
|
||||
test_binary_search_recursive()
|
||||
print("Je functie binary_search_recursive() werkt goed!")
|
||||
|
||||
print("\nGefeliciteerd, alles lijkt te werken!")
|
||||
print("Lever je werk nu in op Canvas...")
|
||||
|
||||
except AssertionError as ae:
|
||||
print("\x1b[0;31m")
|
||||
print(ae)
|
360
Les opdrachten/AI opdrachten/FA3/practicum_3_statistiek_student.py
Executable file
360
Les opdrachten/AI opdrachten/FA3/practicum_3_statistiek_student.py
Executable file
File diff suppressed because it is too large
Load Diff
36
README.md
36
README.md
@@ -33,10 +33,18 @@ Om de dependencies te installeren voer het onderste commando uit.
|
||||
|
||||
pip install flask requests apa102-pi
|
||||
|
||||
De applicatie is simpel uit te voeren door de python script uit te voeren. En via de browser naar de gegeven
|
||||
url te gaan.
|
||||
Als je op een RaspberryPI draait en de hardware wil aansturen moet je in run.py aangeven dat de software draait op een
|
||||
RaspberryPI, en in hardware.py kan je de default pinnen aanpassen. De APA102 library gebruikt SPI, dus zorg ervoor dat
|
||||
je via ```sudo raspi-config``` spi aan hebt gezet.
|
||||
|
||||
python run.py
|
||||
In run.py kan je aangeven dat je op een RaspberryPI draait zodat de hardware
|
||||
pagina werkt. Default werkt de hardware **niet** omdat de software libraries oproept die alleen op een RaspberryPI
|
||||
werken.
|
||||
|
||||
De applicatie is simpel uit te voeren door de python script uit te voeren. En via de browser naar de gegeven
|
||||
url te gaan. Let op! Gebruik python 3!
|
||||
|
||||
python3 run.py of python run.py
|
||||
|
||||
## Data formaat geheugen tabel
|
||||
Om het sorteren makkelijker te maken gaan we de json in een tuple/list opslaan in het geheugen. Het formaat is een tabel
|
||||
@@ -100,6 +108,28 @@ Geeft de gemiddelde van een lijst terug in een float
|
||||
Deze functie vraagt de gegeven appid op via de http steam api en retourneert het als json. Een voorbeeld van de json is
|
||||
te vinden in steam_api.py
|
||||
|
||||
### hardware.py
|
||||
#### ```set_strip(value)```
|
||||
Deze functie stuurt de ledstrip met 8 APA102 led's aan zodat de hele strip in 1 kleur oplicht. Value moet in HEX RGB
|
||||
gegeven worden. Bijvoorbeeld set_strip('FFAABB')
|
||||
#### ```set_register(value)```
|
||||
Deze functie accepteerd waardes in machten van 2 tot 128. Waarde 1 zet de eerste pinout van het register op ON. Waarde 2
|
||||
zet de 2e pinout op ON en de rest op OFF. Waarde 4 zet de 3e pin op ON enz... Tot waarde 128(pin 8). Accepteerd ook
|
||||
waarde 0 dat alles op OFF zet.
|
||||
#### ```poll_sensor()```
|
||||
Een simpele functie die de afstandsensor aanstuurt. Wanneer de functie wordt aangeroepen retourneert het een tuple met
|
||||
als eerste waarde de afstand gemeten in cm van de sensor tot object. En waarde 2 weergeeft de afstand in tijd.
|
||||
|
||||
**LET OP** als de sensor niet is aangesloten, en de functie wordt opgeroepen, blokkeert de functie. Zorg ervoor dat de
|
||||
sensor is aangesloten voordat de functie wordt opgeroepen. Dit wordt niet aangepast anders wordt de nauwkeurigheid van
|
||||
de sensor substantieel negatief beinvloed, vooral op langzame computers.
|
||||
#### ```set_servo(degree)```
|
||||
Deze functie accepteert waardes van 0 tot en met 180. Deze waardes corresponderen met de gradens vanaf het meest linkse
|
||||
positie van de servo([voorbeeld](https://files.ventilaar.net/files/2021-01/servo.jpg)).
|
||||
#### ````poll_button()````
|
||||
Dit is de meest simpele functie geschreven in dit programme. Wanneer de knop is ingedrukt returnt de functie True,
|
||||
anders False
|
||||
|
||||
### graphs.py
|
||||
De functie van dit bestand is om grafieken te maken van lijsten met waardes, deze grafieken worden als svg terug gegeven
|
||||
om door flask geserveerd te worden.
|
||||
|
@@ -10,10 +10,13 @@ GPIO.setwarnings(0)
|
||||
register_shift_clock_pin = 17
|
||||
register_latch_clock_pin = 27
|
||||
register_data_pin = 22
|
||||
sensor_trigger_pin = 14
|
||||
sensor_echo_pin = 15
|
||||
sensor_trigger_pin = 23
|
||||
sensor_echo_pin = 24
|
||||
servo_pin = 14
|
||||
button_pin = 27
|
||||
button_pin = 25
|
||||
# led clock = 11 apa102_pi default
|
||||
# led data = 10 apa102_pi default
|
||||
|
||||
|
||||
GPIO.setup(register_shift_clock_pin, GPIO.OUT)
|
||||
GPIO.setup(register_latch_clock_pin, GPIO.OUT)
|
||||
@@ -21,7 +24,7 @@ GPIO.setup(register_data_pin, GPIO.OUT)
|
||||
GPIO.setup(sensor_trigger_pin, GPIO.OUT)
|
||||
GPIO.setup(sensor_echo_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
|
||||
GPIO.setup(servo_pin, GPIO.OUT)
|
||||
GPIO.setup(button_pin, GPIO.IN)
|
||||
GPIO.setup(button_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
|
||||
|
||||
|
||||
################################
|
||||
@@ -29,6 +32,7 @@ GPIO.setup(button_pin, GPIO.IN)
|
||||
|
||||
def set_strip(value):
|
||||
strip = apa102.APA102(num_led=8, order='rgb')
|
||||
strip.set_global_brightness(31)
|
||||
for x in range(8):
|
||||
strip.set_pixel_rgb(x, value)
|
||||
strip.show()
|
||||
@@ -70,6 +74,8 @@ def poll_sensor():
|
||||
time.sleep(0.00001) # pulse trigger
|
||||
GPIO.output(sensor_trigger_pin, False)
|
||||
|
||||
# hmmm, als de sensor niet is aangesloten zal deze functie blokkeren. heb geen zin om dit aan te passen
|
||||
|
||||
while not GPIO.input(sensor_echo_pin):
|
||||
start_time = time.time() # tijd opslaan wanneer de echo false is
|
||||
|
||||
@@ -87,9 +93,6 @@ def poll_sensor():
|
||||
|
||||
# geef het aantal graden in tussen 0 en 180 (dit is niet hoeveelheid verplaatsing maar naar welke positie)
|
||||
def set_servo(degrees):
|
||||
p = GPIO.PWM(servo_pin, 50)
|
||||
p.start(2.5)
|
||||
|
||||
if degrees > 180:
|
||||
return False
|
||||
elif degrees < 0:
|
||||
@@ -102,7 +105,11 @@ def set_servo(degrees):
|
||||
|
||||
integer = 2.5 + (value_scaled * right_span)
|
||||
|
||||
p.ChangeDutyCycle(integer)
|
||||
p = GPIO.PWM(servo_pin, 50)
|
||||
|
||||
p.start(integer)
|
||||
time.sleep(0.05)
|
||||
p.stop()
|
||||
|
||||
return True
|
||||
|
58
run.py
58
run.py
@@ -5,11 +5,11 @@ import stats
|
||||
import steam_api
|
||||
|
||||
|
||||
RPI = True # ZET NAAR TRUE ALS JE OP EEN RPI DRAAIT MET DE JUISTE LIBRARIES, ZODAT DE HARDWARE TAB WERKT
|
||||
RPI = False # ZET NAAR TRUE ALS JE OP EEN RPI DRAAIT MET DE JUISTE LIBRARIES, ZODAT DE HARDWARE TAB WERKT
|
||||
|
||||
|
||||
# if RPI:
|
||||
# import hardware
|
||||
if RPI:
|
||||
import hw_funcs
|
||||
|
||||
|
||||
app = Flask(__name__) # flask app initialiseren
|
||||
@@ -55,11 +55,14 @@ def root():
|
||||
|
||||
genre = stats.popgenre(data_tpl)
|
||||
|
||||
prijsmed = stats.median_prijs(data_tpl)
|
||||
|
||||
# limiteer tabel tot en met 15 entries
|
||||
for x in range(0, 15):
|
||||
entries.append(data_lst[x])
|
||||
|
||||
return render_template('index.html', first_entry=data_tpl[0], sizedb=len(data_tpl), entries=entries, genre=genre)
|
||||
return render_template('index.html', first_entry=data_tpl[0], sizedb=len(data_tpl), entries=entries, genre=genre,
|
||||
prijsmed=prijsmed)
|
||||
|
||||
|
||||
@app.route('/fulltable')
|
||||
@@ -95,7 +98,7 @@ def fulltable():
|
||||
|
||||
@app.route('/hardware')
|
||||
def hardware():
|
||||
return render_template('hardware.html')
|
||||
return render_template('hardware.html', RPI=RPI)
|
||||
|
||||
|
||||
@app.route('/search')
|
||||
@@ -118,9 +121,8 @@ def api_afstandsensor():
|
||||
"""Dit pad geeft een json array met de key 'afstand' met waarde van de afstandsensor in cm """
|
||||
if not RPI:
|
||||
return Response('Hardware kan niet aangestuurt worden omdat het niet op een RPI draait!', status=418)
|
||||
afstand = 0
|
||||
|
||||
return {'afstand': afstand}
|
||||
return {'afstand': hw_funcs.poll_sensor()[0]}
|
||||
|
||||
|
||||
@app.route('/api/schuifregister', methods=['POST', 'GET'])
|
||||
@@ -131,9 +133,20 @@ def api_schuifregister():
|
||||
"""
|
||||
if not RPI:
|
||||
return Response('Hardware kan niet aangestuurt worden omdat het niet op een RPI draait!', status=418)
|
||||
|
||||
global state_schuifregister
|
||||
|
||||
if request.method == 'POST':
|
||||
pass
|
||||
desired_state = request.form['setstate']
|
||||
|
||||
try:
|
||||
hw_funcs.set_register(int(desired_state))
|
||||
except:
|
||||
return {'request': 'False'}
|
||||
|
||||
print(f'Set value for schuifregister {desired_state}')
|
||||
state_schuifregister = desired_state
|
||||
return {'request': 'True'}
|
||||
else:
|
||||
return {'state': state_schuifregister}
|
||||
|
||||
@@ -146,9 +159,20 @@ def api_servo():
|
||||
"""
|
||||
if not RPI:
|
||||
return Response('Hardware kan niet aangestuurt worden omdat het niet op een RPI draait!', status=418)
|
||||
|
||||
global state_servo
|
||||
|
||||
if request.method == 'POST':
|
||||
pass
|
||||
desired_state = request.form['setstate']
|
||||
|
||||
try:
|
||||
hw_funcs.set_servo(int(desired_state))
|
||||
except:
|
||||
return {'request': 'False'}
|
||||
|
||||
print(f'Set value for servo {desired_state}')
|
||||
state_servo = desired_state
|
||||
return {'request': 'True'}
|
||||
else:
|
||||
return {'state': state_servo}
|
||||
|
||||
@@ -158,9 +182,11 @@ def api_pushbutton():
|
||||
"""Dit pad geeft de status van de pushbuttons af in True en False, de keys alsvolgd genoemd: button0, button1"""
|
||||
if not RPI:
|
||||
return Response('Hardware kan niet aangestuurt worden omdat het niet op een RPI draait!', status=418)
|
||||
button0 = False
|
||||
|
||||
return {'button0': button0}
|
||||
if hw_funcs.poll_button():
|
||||
return {'button0': True}
|
||||
else:
|
||||
return {'button0': False}
|
||||
|
||||
|
||||
@app.route('/api/ledstrip', methods=['POST', 'GET'])
|
||||
@@ -175,14 +201,18 @@ def api_ledstrip_set():
|
||||
global state_ledstrip
|
||||
|
||||
if request.method == 'POST':
|
||||
desired_state = request.form['setstate']
|
||||
string_state = request.form['setstate']
|
||||
|
||||
try:
|
||||
hardware.set_strip(desired_state)
|
||||
# we ontvangen de volgenende waarde '#XXXXXX' maar de driver ondersteunt alleen hex in integer
|
||||
desired_state = int(string_state[1:], 16)
|
||||
hw_funcs.set_strip(desired_state)
|
||||
except:
|
||||
|
||||
return {'request': 'False'}
|
||||
|
||||
state_ledstrip = desired_state
|
||||
print(f'Set value for ledstrip {string_state}')
|
||||
state_ledstrip = string_state
|
||||
return {'request': 'True'}
|
||||
else:
|
||||
return {'state': state_ledstrip}
|
||||
|
9
stats.py
9
stats.py
@@ -85,3 +85,12 @@ def popgenre(data_tpl):
|
||||
|
||||
return modes(genres)[0] # eerst populairste genre terug geven op basis van gegevens van modes(), wat is de kans
|
||||
# dat er meerdere genres tegelijk populair zijn, toch?
|
||||
|
||||
|
||||
def median_prijs(data_tpl):
|
||||
prijzen = []
|
||||
|
||||
for x in data_tpl:
|
||||
prijzen.append(x[17])
|
||||
|
||||
return float(median(prijzen))
|
||||
|
@@ -9,25 +9,22 @@
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<h1>{{ data['data']['name'] }}</h1>
|
||||
<p>fffff</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div id="carousel" class="carousel slide" data-ride="carousel">
|
||||
<div id="pictures" class="carousel slide" data-ride="carousel">
|
||||
<div class="carousel-inner">
|
||||
{% set firstpic = True %}
|
||||
{% for x in data['data']['screenshots'] %}
|
||||
<div class="carousel-item {% if firstpic == True %}active{% endif %}">
|
||||
<img class="d-block w-100" src="{{ x['path_full'] }}">
|
||||
<div class="carousel-item{% if x['id'] == 0 %} active{% endif %}">
|
||||
<img class="d-block w-100" src="{{ x['path_full'] }}" />
|
||||
</div>
|
||||
{% set firstpic = False %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
<a class="carousel-control-prev" href="#carousel" role="button" data-slide="prev">
|
||||
<a class="carousel-control-prev" href="#pictures" role="button" data-slide="prev">
|
||||
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
|
||||
</a>
|
||||
<a class="carousel-control-next" href="#carousel" role="button" data-slide="next">
|
||||
<a class="carousel-control-next" href="#pictures" role="button" data-slide="next">
|
||||
<span class="carousel-control-next-icon" aria-hidden="true"></span>
|
||||
</a>
|
||||
</div>
|
||||
@@ -77,6 +74,8 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script src="{{ url_for('static', filename='js/jquery.min.js') }}"></script>
|
||||
<script src="{{ url_for('static', filename='js/bootstrap.bundle.min.js') }}"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
@@ -3,32 +3,138 @@
|
||||
<title>Hardware</title>
|
||||
<link href="{{ url_for('static', filename='css/bootstrap.min.css') }}" rel="stylesheet">
|
||||
</head>
|
||||
<body>
|
||||
<body class="text-center">
|
||||
{% include "t-navbar.html" %}
|
||||
<div class="container">
|
||||
{% if RPI == False %}
|
||||
<div class="alert alert-danger mt-4" role="alert">
|
||||
Volgens de webserver is de hardware niet aangesloten en kan dus niet worden bestuurd. (Is de variabele aangepast in run.py?)
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="row row-cols-2">
|
||||
<div class="col">
|
||||
<h1>Afstand sensor</h1>
|
||||
kkkkk
|
||||
<h2>Gemeten afstand is <span class="badge badge-secondary" id="afstand-badge">x cm</span></h2>
|
||||
</div>
|
||||
<div class="col">
|
||||
<h1>Push buttons</h1>
|
||||
kkkk
|
||||
<h2>Button0 is <span class="badge badge-danger" id="button-badge">Nog niet opgevraagd</span></h2>
|
||||
</div>
|
||||
</div>
|
||||
<br>
|
||||
<div class="row row-cols-3">
|
||||
<div class="col">
|
||||
<h1>Ledstrip</h1>
|
||||
<p>Kies een kleur uit in de colorpicker en klik op set value</p>
|
||||
<input type="color" id="ledstrip-input" />
|
||||
<button type="button" id="ledstrip-set" class="btn btn-primary" onclick="setval()">Set value</button>
|
||||
</div>
|
||||
<div class="col">
|
||||
<h1>Schuifregister</h1>
|
||||
dafadfadfadfaf
|
||||
<p>Kies de bit uit die je positief wil aansluiten</p>
|
||||
<select name="Bit volgorde" id="register-input" onchange="set_register(this.value)">
|
||||
<option value="0">Uit</option>
|
||||
<option value="1">Bit 1</option>
|
||||
<option value="2">Bit 2</option>
|
||||
<option value="4">Bit 3</option>
|
||||
<option value="8">Bit 4</option>
|
||||
<option value="16">Bit 5</option>
|
||||
<option value="32">Bit 6</option>
|
||||
<option value="64">Bit 7</option>
|
||||
<option value="128">Bit 8</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col">
|
||||
<h1>Servo</h1>
|
||||
fhdghfdghdfgh
|
||||
<p>Stel waarde in tussen 0 en 180 graden</p>
|
||||
<input id="servo-range" type="range" min="0" max="180" step="10" value="90" oninput="this.nextElementSibling.value = this.value" onchange="set_servo(this.value)">
|
||||
<output id="servo-span">90</output>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script src="{{ url_for('static', filename='js/jquery.min.js') }}"></script>
|
||||
<script>
|
||||
// dit script blok geldt alleen voor de ledstrip
|
||||
$(document).ready(function() {
|
||||
$.getJSON('/api/ledstrip', function(data) {
|
||||
document.getElementById('ledstrip-input').value = data.state
|
||||
});
|
||||
});
|
||||
|
||||
function setval() {
|
||||
let valinbox = document.getElementById('ledstrip-input').value
|
||||
|
||||
$.post("/api/ledstrip", {setstate:valinbox})
|
||||
}
|
||||
</script>
|
||||
<script>
|
||||
// dit script blok geldt alleen voor de pushknoppen
|
||||
|
||||
// functie om de badge groen te maken en text 'ingedrukt'
|
||||
function set_true() {
|
||||
document.getElementById('button-badge').className = "badge badge-success";
|
||||
document.getElementById('button-badge').textContent = 'Ingedrukt';
|
||||
};
|
||||
|
||||
// functie om de badge rood te maken en text 'niet ingedrukt'
|
||||
function set_false() {
|
||||
document.getElementById('button-badge').className = "badge badge-danger";
|
||||
document.getElementById('button-badge').textContent = 'Niet ingedrukt';
|
||||
};
|
||||
|
||||
function button_poll() {
|
||||
$.getJSON('/api/pushbutton', function(data) {
|
||||
if (data.button0 == true) {
|
||||
set_true();
|
||||
} else {
|
||||
set_false();
|
||||
};
|
||||
});
|
||||
};
|
||||
|
||||
{% if RPI == False %}// {% endif %}setInterval(function(){ button_poll(); }, 500);
|
||||
</script>
|
||||
<script>
|
||||
// dit script blok geldt alleen voor de afstandsensor
|
||||
|
||||
// functie om de waarde aan te passen in html
|
||||
function set_afstand(waarde) {
|
||||
document.getElementById('afstand-badge').textContent = waarde + ' cm';
|
||||
};
|
||||
|
||||
// waarde opvragen en dan set_afstand() uitvoeren
|
||||
function afstand_poll() {
|
||||
$.getJSON('/api/afstandsensor', function(data) {
|
||||
set_afstand(data.afstand);
|
||||
});
|
||||
};
|
||||
|
||||
{% if RPI == False %}// {% endif %}setInterval(function(){ afstand_poll(); }, 1500);
|
||||
</script>
|
||||
<script>
|
||||
// dit script blok geldt alleen voor de servo
|
||||
$(document).ready(function() {
|
||||
$.getJSON('/api/servo', function(data) {
|
||||
document.getElementById('servo-range').value = data.state
|
||||
document.getElementById('servo-span').value = data.state
|
||||
});
|
||||
});
|
||||
|
||||
function set_servo(deg) {
|
||||
$.post("/api/servo", {setstate:deg})
|
||||
};
|
||||
</script>
|
||||
<script>
|
||||
// dit script blok geldt alleen voor het schuifregister
|
||||
$(document).ready(function() {
|
||||
$.getJSON('/api/schuifregister', function(data) {
|
||||
document.getElementById('register-input').value = data.state
|
||||
});
|
||||
});
|
||||
|
||||
function set_register(bit) {
|
||||
$.post("/api/schuifregister", {setstate:bit})
|
||||
};
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
@@ -12,6 +12,7 @@
|
||||
<p>Eerste game in memory is <b>{{ first_entry[1] }}</b> met de game id <b>{{ first_entry[0] }}</b></p>
|
||||
<p>Totaal aantal games in memory is <b>{{ sizedb }}</b></p>
|
||||
<p>Meest populaire genre is <b>{{ genre }}</b></p>
|
||||
<p>Het mediaan van alle geindexeerde prijzen is <b>{{ prijsmed }}</b>,-</p>
|
||||
</div>
|
||||
<div class="col mt-3">
|
||||
<!--
|
||||
|
Reference in New Issue
Block a user