mirror of
https://github.com/buzz-lightsnack-2007/MicroBit_Compass.git
synced 2024-08-14 22:46:45 +00:00
Update pxt.json, README.md, main.blocks, main.ts, main.py
This commit is contained in:
parent
83636085d2
commit
5bb5274b26
6 changed files with 442 additions and 27 deletions
217
main.py
Normal file
217
main.py
Normal file
|
@ -0,0 +1,217 @@
|
|||
# compass system information
|
||||
compass_info = {
|
||||
'version': 2022.1211
|
||||
}
|
||||
|
||||
# compass data and settings
|
||||
compass_data = {
|
||||
'configuration': {
|
||||
'modes': {
|
||||
'previous': '',
|
||||
'current': 'measurement',
|
||||
'measurement': 'number'
|
||||
},
|
||||
'loading': False,
|
||||
'errored': False
|
||||
},
|
||||
'data': {
|
||||
'measurement': 0,
|
||||
'direction': ArrowNames.NORTH
|
||||
}
|
||||
}
|
||||
|
||||
def compass_calibrate():
|
||||
"""
|
||||
This triggers calibration.
|
||||
|
||||
Parameters: none
|
||||
Returns: none
|
||||
"""
|
||||
# Enter calibration mode, saving the previous mode.
|
||||
compass_data['configuration']['modes']['previous'] = compass_data['configuration']['modes']['current']
|
||||
compass_data['configuration']['modes']['current'] = 'calibrate'
|
||||
compass_data['configuration']['loading'] = True
|
||||
|
||||
try:
|
||||
# Calibrate the compass.
|
||||
input.calibrate_compass()
|
||||
|
||||
except:
|
||||
# Warn that an error has occured.
|
||||
compass_data['configuration']['errored'] = True
|
||||
|
||||
finally:
|
||||
# Exit calibration mode, restoring previous mode state.
|
||||
compass_data['configuration']['loading'] = False
|
||||
compass_data['configuration']['modes']['current'] = compass_data['configuration']['modes']['previous']
|
||||
compass_data['configuration']['modes']['previous'] = 'calibrate'
|
||||
|
||||
def measurement_update():
|
||||
"""
|
||||
Record the new measurement.
|
||||
|
||||
Parameters: none
|
||||
Returns: (float) heading in degrees
|
||||
"""
|
||||
|
||||
# Get the new measurement.
|
||||
compass_data['data']['measurement'] = input.compass_heading()
|
||||
|
||||
# Return the new measurement.
|
||||
return(compass_data['data']['measurement'])
|
||||
|
||||
def measurement_arrow_update(angle = None):
|
||||
"""
|
||||
Display the correct directional arrow.
|
||||
|
||||
Parameters:
|
||||
angle: (float) the heading
|
||||
Returns: (enum) directional arrow
|
||||
"""
|
||||
|
||||
# Automatically fill the angle value, if it isn't provided.
|
||||
if angle == None:
|
||||
angle = compass_data['data']['measurement']
|
||||
|
||||
# Check if the angle is negative. If it is, get the correct positive equivalent.
|
||||
if angle < 0:
|
||||
angle = 360 + angle
|
||||
|
||||
# Check which range it falls under. (Items are clockwise.)
|
||||
direction_ranges = [
|
||||
(angle < 22.5) or (angle > 337.5),
|
||||
(angle >= 22.5) and (angle <= 67.5),
|
||||
(angle > 67.5) and (angle < 112.5),
|
||||
(angle >= 112.5) and (angle <= 157.5),
|
||||
(angle > 157.5) and (angle < 202.5),
|
||||
(angle >= 202.5) and (angle <= 247.5),
|
||||
(angle > 247.5) and (angle < 292.5),
|
||||
(angle >= 292.5) and (angle <= 337.5)
|
||||
]
|
||||
|
||||
# This is the list of directions.
|
||||
directions = [
|
||||
ArrowNames.NORTH,
|
||||
ArrowNames.NORTH_EAST,
|
||||
ArrowNames.EAST,
|
||||
ArrowNames.SOUTH_EAST,
|
||||
ArrowNames.SOUTH,
|
||||
ArrowNames.SOUTH_WEST,
|
||||
ArrowNames.WEST,
|
||||
ArrowNames.NORTH_WEST
|
||||
]
|
||||
|
||||
# Set the correct direction.
|
||||
compass_data['data']['direction'] = directions[direction_ranges.index(True)]
|
||||
|
||||
# Return the direction.
|
||||
return(compass_data['data']['direction'])
|
||||
|
||||
def modes_measure_toggle(mode_measure_new = None):
|
||||
"""
|
||||
Toggle between the compass modes.
|
||||
|
||||
Parameters:
|
||||
mode_measure_new: (str) the new mode
|
||||
Returns: (str) the new mode
|
||||
"""
|
||||
|
||||
# valid modes of measurement
|
||||
mode_measure = ['number', 'arrow']
|
||||
mode_measure_current_index = mode_measure.index(compass_data['configuration']['modes']['measurement'])
|
||||
|
||||
if mode_measure_new:
|
||||
if mode_measure_new in mode_measure:
|
||||
compass_data['configuration']['modes']['measurement'] = mode_measure_new
|
||||
else:
|
||||
mode_measure_current_index =+ 1
|
||||
|
||||
# Check if it exceeds the maximum.
|
||||
if mode_measure_current_index >= len(mode_measure):
|
||||
# If so, revert it back to zero.
|
||||
mode_measure_current_index = 0
|
||||
|
||||
# Apply the new mode.
|
||||
compass_data['configuration']['modes']['measurement'] = mode_measure[mode_measure_current_index]
|
||||
|
||||
# Return the new mode.
|
||||
return(compass_data['configuration']['modes']['measurement'])
|
||||
|
||||
|
||||
def LEDs_update(status = None):
|
||||
"""
|
||||
Update the LEDs to display the corresponding pattern.
|
||||
|
||||
Parameters:
|
||||
status: (str) the pattern
|
||||
Returns: none
|
||||
"""
|
||||
|
||||
# Check if there is a custom status input.
|
||||
if status == None:
|
||||
# Check if an error has occured.
|
||||
if compass_data['configuration']['errored']:
|
||||
status = 'error'
|
||||
else:
|
||||
# Otherwise, the current mode might be the basis.
|
||||
status = compass_data['configuration']['modes']['current']
|
||||
|
||||
if (status == 'error'):
|
||||
# Display that an error has occured simply through an exclamation mark.
|
||||
basic.show_string("!")
|
||||
|
||||
elif (status == 'measurement'):
|
||||
# measurement display
|
||||
|
||||
if compass_data['configuration']['modes']['measurement'] == 'number':
|
||||
# Display the numerical data.
|
||||
basic.show_number(compass_data['data']['measurement'])
|
||||
if compass_data['configuration']['modes']['measurement'] == 'arrow':
|
||||
# Display the arrow.
|
||||
basic.show_arrow(compass_data['data']['direction'])
|
||||
|
||||
|
||||
else:
|
||||
# Display the loading screen while the current screen is still present.
|
||||
while compass_data['configuration']['loading']:
|
||||
# plot
|
||||
for x in range(0,5):
|
||||
led.plot(x, 2)
|
||||
basic.pause(100)
|
||||
# unplot
|
||||
for x in range (0,5):
|
||||
led.unplot(x, 2)
|
||||
basic.pause(100)
|
||||
|
||||
|
||||
def startup():
|
||||
"""
|
||||
startup script
|
||||
|
||||
Parameters: none
|
||||
Returns: none
|
||||
"""
|
||||
|
||||
compass_calibrate()
|
||||
|
||||
def on_forever():
|
||||
# Update the measurements.
|
||||
measurement_update()
|
||||
if compass_data['configuration']['modes']['measurement'] == 'arrow':
|
||||
measurement_arrow_update()
|
||||
|
||||
LEDs_update()
|
||||
|
||||
|
||||
def on_button_pressed_ab():
|
||||
led.stop_animation()
|
||||
compass_calibrate()
|
||||
|
||||
def on_button_pressed_a():
|
||||
led.stop_animation()
|
||||
modes_measure_toggle()
|
||||
|
||||
input.on_button_pressed(Button.AB, on_button_pressed_ab)
|
||||
input.on_button_pressed(Button.A, on_button_pressed_a)
|
||||
basic.forever(on_forever)
|
||||
startup()
|
Loading…
Add table
Add a link
Reference in a new issue