01234567890123456789012345678901234567890123456789012345678901234567890123456789
189190191192193194195196197198199200201202203204205206207208 209210211212213214215216217218219220221222223224225226227228 271272273274275276277278279280281282283284285286287288289290 291292293294295296297298299300301302303304305306307308309310 391392393394395396397398399400401402403404405406407408409410 411412413414415416417418419420421422423424425426427428429430 619361946195619661976198619962006201620262036204620562066207620862096210621162126213 6214621562166217621862196220622162226223 622462256226622762286229 62306231623262336234623562366237623862396240624162426243624462456246624762486249 65616562656365646565656665676568656965706571657265736574657565766577657865796580 65816582658365846585658665876588658965906591659265936594659565966597659865996600 66936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733 |
<----SKIPPED LINES---->
FLAG_INSIGHT_FIRST_DEST = 6
FLAG_INSIGHT_FIRST_ORIGIN = 7
FLAG_INSIGHT_FIRST_AIRLINE = 8
FLAG_INSIGHT_FIRST_AIRCRAFT = 9
FLAG_INSIGHT_LONGEST_DELAY = 10
FLAG_INSIGHT_FLIGHT_DELAY_FREQUENCY = 11
FLAG_INSIGHT_FLIGHT_DELAY_TIME = 12
FLAG_INSIGHT_AIRLINE_DELAY_FREQUENCY = 13
FLAG_INSIGHT_AIRLINE_DELAY_TIME = 14
FLAG_INSIGHT_DESTINATION_DELAY_FREQUENCY = 15
FLAG_INSIGHT_DESTINATION_DELAY_TIME = 16
FLAG_INSIGHT_HOUR_DELAY_FREQUENCY = 17
FLAG_INSIGHT_HOUR_DELAY_TIME = 18
FLAG_INSIGHT_DATE_DELAY_FREQUENCY = 19
FLAG_INSIGHT_DATE_DELAY_TIME = 20
FLAG_INSIGHT_HELICOPTER = 21
INSIGHT_TYPES = 22
TEMP_FAN_TURN_ON_CELSIUS = 65
TEMP_FAN_TURN_OFF_CELSIUS = 55
# GPIO relay connections
# format: (GPIO pin, true message, false message, relay number,
# description, initial_state)
GPIO_ERROR_VESTABOARD_CONNECTION = (
22,
'ERROR: Vestaboard unavailable',
'SUCCESS: Vestaboard available',
1, 'Vestaboard connected', False)
GPIO_ERROR_FLIGHT_AWARE_CONNECTION = (
23,
'ERROR: FlightAware not available',
'SUCCESS: FlightAware available',
2, 'FlightAware connected', False)
GPIO_ERROR_ARDUINO_SERVO_CONNECTION = (
24,
'ERROR: Servos not running or lost connection',
'SUCCESS: Handshake with servo Arduino received',
3, 'Hemisphere connected', True)
GPIO_ERROR_ARDUINO_REMOTE_CONNECTION = (
<----SKIPPED LINES---->
if RASPBERRY_PI:
PICKLE_FLIGHTS = MESSAGEBOARD_PATH + PICKLE_FLIGHTS
PICKLE_DASHBOARD = MESSAGEBOARD_PATH + PICKLE_DASHBOARD
LOGFILE = MESSAGEBOARD_PATH + LOGFILE
PICKLE_DUMP_JSON_FILE = MESSAGEBOARD_PATH + PICKLE_DUMP_JSON_FILE
PICKLE_FA_JSON_FILE = MESSAGEBOARD_PATH + PICKLE_FA_JSON_FILE
PICKLE_SCREENS = MESSAGEBOARD_PATH + PICKLE_SCREENS
CODE_REPOSITORY = MESSAGEBOARD_PATH
HISTOGRAM_CONFIG_FILE = WEBSERVER_PATH + HISTOGRAM_CONFIG_FILE
CONFIG_FILE = WEBSERVER_PATH + CONFIG_FILE
ROLLING_MESSAGE_FILE = WEBSERVER_PATH + ROLLING_MESSAGE_FILE
ALL_MESSAGE_FILE = WEBSERVER_PATH + ALL_MESSAGE_FILE
ROLLING_LOGFILE = WEBSERVER_PATH + ROLLING_LOGFILE
STDERR_FILE = WEBSERVER_PATH + STDERR_FILE
BACKUP_FILE = WEBSERVER_PATH + BACKUP_FILE
SERVICE_VERIFICATION_FILE = WEBSERVER_PATH + SERVICE_VERIFICATION_FILE
UPTIMES_FILE = WEBSERVER_PATH + UPTIMES_FILE
CODE_HISTORY_FILE = WEBSERVER_PATH + CODE_HISTORY_FILE
NEW_AIRCRAFT_FILE = WEBSERVER_PATH + NEW_AIRCRAFT_FILE
HISTOGRAM_IMAGE_HTML = WEBSERVER_PATH + HISTOGRAM_IMAGE_HTML
HOURLY_IMAGE_FILE = (
WEBSERVER_PATH + WEBSERVER_IMAGE_RELATIVE_FOLDER + HOURLY_IMAGE_FILE)
VERSION_REPOSITORY = WEBSERVER_PATH + VERSION_REPOSITORY
TIMEZONE = 'US/Pacific' # timezone of display
TZ = pytz.timezone(TIMEZONE)
# iata codes that we don't need to expand
KNOWN_AIRPORTS = ('SJC', 'SFO', 'OAK')
SPLITFLAP_CHARS_PER_LINE = 22
SPLITFLAP_LINE_COUNT = 6
DIRECTIONS_4 = ['N', 'E', 'S', 'W']
DIRECTIONS_8 = ['N', 'NE', 'E', 'SE', 'S', 'SW', 'W', 'NW']
DIRECTIONS_16 = ['N', 'NNE', 'NE', 'ENE', 'E', 'ESE', 'SE', 'SSE',
'S', 'SSW', 'SW', 'WSW', 'W', 'WNW', 'NW', 'NNW']
<----SKIPPED LINES---->
AIRCRAFT_LENGTH['Cessna Citation Sovereign (twin-jet)'] = 19.35
AIRCRAFT_LENGTH['Cessna Citation V (twin-jet)'] = 14.91
AIRCRAFT_LENGTH['Cessna Citation X (twin-jet)'] = 22.04
AIRCRAFT_LENGTH['Cessna Citation Mustang (twin-jet)'] = 12.37
AIRCRAFT_LENGTH['Cessna Skyhawk (piston-single)'] = 8.28
AIRCRAFT_LENGTH['Cessna Skylane (piston-single)'] = 8.84
AIRCRAFT_LENGTH['Cessna T206 Turbo Stationair (piston-single)'] = 8.61
AIRCRAFT_LENGTH['Cirrus SR-22 (piston-single)'] = 7.92
AIRCRAFT_LENGTH['Dassault Falcon 900 (tri-jet)'] = 20.21
AIRCRAFT_LENGTH['Dassault Falcon 2000 (twin-jet)'] = 20.23
AIRCRAFT_LENGTH['Embraer 170/175 (twin-jet)'] = (29.90 + 31.68) / 2
AIRCRAFT_LENGTH['Embraer Phenom 300 (twin-jet)'] = 15.9
AIRCRAFT_LENGTH['Embraer ERJ-135 (twin-jet)'] = 26.33
AIRCRAFT_LENGTH['Embraer ERJ-145 (twin-jet)'] = 29.87
AIRCRAFT_LENGTH['Embraer Legacy 450 (twin-jet)'] = 19.69
AIRCRAFT_LENGTH['EMBRAER 175 (long wing) (twin-jet)'] = 31.68
AIRCRAFT_LENGTH['Eurocopter EC-635 (twin-turboshaft)'] = 10.21
AIRCRAFT_LENGTH['IAI Gulfstream G280 (twin-jet)'] = 20.3
AIRCRAFT_LENGTH['Gulfstream Aerospace Gulfstream G550 (twin-jet)'] = 29.39
AIRCRAFT_LENGTH['Gulfstream Aerospace Gulfstream IV (twin-jet)'] = 26.92
AIRCRAFT_LENGTH['Learjet 45 (twin-jet)'] = 17.68
AIRCRAFT_LENGTH['McDonnell Douglas MD-11 (tri-jet)'] = 61.6
AIRCRAFT_LENGTH['Pilatus PC-12 (single-turboprop)'] = 14.4
def Log(message, file=None, rolling=None):
"""Write a message to a logfile along with a timestamp.
Args:
message: string message to write
file: string representing file name and, if needed, path to the
file to write to
rolling: name of file that will keep only the last n files of file
"""
# can't define as a default parameter because LOGFILE name is potentially
# modified based on SIMULATION flag
if not file:
file = LOGFILE
# special case: for the main logfile, we always keep a rolling log
<----SKIPPED LINES---->
for (n, flight) in enumerate(flights):
if n/25 == int(n/25):
print(' - %d' % n)
CreateFlightInsights(
flights[:n+1], configuration.get('insights', 'hide'), {})
PickleObjectToFile(flight, tmp_f, False)
if mtime == os.path.getmtime(f):
shutil.move(tmp_f, f)
else:
print('Aborted: failed to bootstrap %s: file changed while in process'
% full_path)
return
def ResetLogs(config):
"""Clears the non-scrolling logs if reset_logs in config."""
if 'reset_logs' in config:
Log('Reset logs')
for f in (
STDERR_FILE, BACKUP_FILE, SERVICE_VERIFICATION_FILE, NEW_AIRCRAFT_FILE):
if RemoveFile(f):
open(f, 'a').close()
config.pop('reset_logs')
config = BuildSettings(config)
WriteFile(CONFIG_FILE, config)
return config
def CheckTemperature():
"""Turn on fan if temperature exceeds threshold."""
if RASPBERRY_PI:
temperature = gpiozero.CPUTemperature().temperature
if temperature > TEMP_FAN_TURN_ON_CELSIUS:
UpdateStatusLight(GPIO_FAN, True, 'Temperature: %.1f' % temperature)
elif temperature < TEMP_FAN_TURN_OFF_CELSIUS:
UpdateStatusLight(GPIO_FAN, False)
pin_values = {} # caches last set value
def SetPinMode():
"""Initialize output GPIO pins for output on Raspberry Pi."""
global pin_values
if RASPBERRY_PI:
RPi.GPIO.setmode(RPi.GPIO.BCM)
pins = (
GPIO_ERROR_VESTABOARD_CONNECTION, GPIO_ERROR_FLIGHT_AWARE_CONNECTION,
GPIO_ERROR_ARDUINO_SERVO_CONNECTION, GPIO_ERROR_ARDUINO_REMOTE_CONNECTION,
GPIO_ERROR_BATTERY_CHARGE, GPIO_FAN, GPIO_UNUSED_1, GPIO_UNUSED_2)
for pin in pins:
initial_state = pin[5]
pin_values[pin[0]] = initial_state # Initialize state of pins
UpdateDashboard(initial_state, pin)
<----SKIPPED LINES---->
# Next up to print is index 0; this is a list of tuples:
# tuple element#1: flag indicating the type of message that this is
# tuple element#2: the message itself
message_queue = []
next_message_time = time.time()
# We repeat the loop every x seconds; this ensures that if the processing
# time is long, we don't wait another x seconds after processing completes
next_loop_time = time.time() + LOOP_DELAY_SECONDS
# These files are read only if the version on disk has been modified more
# recently than the last time it was read
last_dump_json_timestamp = 0
init_timing.append((time.time(), 7))
WaitUntilKillComplete(already_running_ids)
init_timing.append((time.time(), 8))
personal_message = None # Unknown what personal message is displayed
LogTimes(init_timing)
Log('Finishing initialization of %d; starting radio polling loop' %
os.getpid())
while ((not SIMULATION or SIMULATION_COUNTER < len(DUMP_JSONS))
and not SHUTDOWN_SIGNAL):
last_heartbeat_time = Heartbeat(last_heartbeat_time)
new_configuration = ReadAndParseSettings(CONFIG_FILE)
UpdateRollingLogSize(new_configuration)
CheckForNewFilterCriteria(
configuration, new_configuration, message_queue, flights)
configuration = new_configuration
ResetLogs(configuration) # clear the logs if requested
UpdateRollingLogSize(configuration)
# if this is a SIMULATION, then process every diff dump. But if it
# isn't a simulation, then only read & do related processing for the
<----SKIPPED LINES---->
RemoveFile(HISTOGRAM_CONFIG_FILE)
# We also need to make sure there are flights on which to generate a
# histogram! Why might there not be any flights? Primarily during a
# simulation, if there's a lingering histogram file at the time of
# history restart.
if histogram and not flights:
Log('Histogram requested (%s) but no flights in memory' % histogram)
if histogram and flights:
message_queue.extend(TriggerHistograms(flights, histogram))
if message_queue: # Any personal message displayed has been cleared
personal_message = None
# check time & if appropriate, display next message from queue
next_message_time = ManageMessageQueue(
message_queue, next_message_time, configuration, screen_history)
reboot = CheckRebootNeeded(
startup_time, message_queue, json_desc_dict, configuration)
CheckTemperature()
if not SIMULATION:
time.sleep(max(0, next_loop_time - time.time()))
next_loop_time = time.time() + LOOP_DELAY_SECONDS
else:
SIMULATION_COUNTER += 1
if simulation_slowdown:
SimulationSlowdownNearFlight(flights, persistent_nearby_aircraft)
if SIMULATION:
SimulationEnd(message_queue, flights, screen_history)
PerformGracefulShutdown(shutdown, reboot)
if __name__ == "__main__":
#interrupt, as in ctrl-c
signal.signal(signal.SIGINT, InterruptShutdownFromSignal)
#terminate, when another instance found or via kill
signal.signal(signal.SIGTERM, InterruptShutdownFromSignal)
<----SKIPPED LINES---->
|
01234567890123456789012345678901234567890123456789012345678901234567890123456789
189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313 394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434 619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271 658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624 67176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757 |
<----SKIPPED LINES---->
FLAG_INSIGHT_FIRST_DEST = 6
FLAG_INSIGHT_FIRST_ORIGIN = 7
FLAG_INSIGHT_FIRST_AIRLINE = 8
FLAG_INSIGHT_FIRST_AIRCRAFT = 9
FLAG_INSIGHT_LONGEST_DELAY = 10
FLAG_INSIGHT_FLIGHT_DELAY_FREQUENCY = 11
FLAG_INSIGHT_FLIGHT_DELAY_TIME = 12
FLAG_INSIGHT_AIRLINE_DELAY_FREQUENCY = 13
FLAG_INSIGHT_AIRLINE_DELAY_TIME = 14
FLAG_INSIGHT_DESTINATION_DELAY_FREQUENCY = 15
FLAG_INSIGHT_DESTINATION_DELAY_TIME = 16
FLAG_INSIGHT_HOUR_DELAY_FREQUENCY = 17
FLAG_INSIGHT_HOUR_DELAY_TIME = 18
FLAG_INSIGHT_DATE_DELAY_FREQUENCY = 19
FLAG_INSIGHT_DATE_DELAY_TIME = 20
FLAG_INSIGHT_HELICOPTER = 21
INSIGHT_TYPES = 22
TEMP_FAN_TURN_ON_CELSIUS = 65
TEMP_FAN_TURN_OFF_CELSIUS = 55
TEMPERATURE_LOG_FREQUENCY_SECONDS = 30
TEMPERATURE_LOG = 'temp.csv'
# GPIO relay connections
# format: (GPIO pin, true message, false message, relay number,
# description, initial_state)
GPIO_ERROR_VESTABOARD_CONNECTION = (
22,
'ERROR: Vestaboard unavailable',
'SUCCESS: Vestaboard available',
1, 'Vestaboard connected', False)
GPIO_ERROR_FLIGHT_AWARE_CONNECTION = (
23,
'ERROR: FlightAware not available',
'SUCCESS: FlightAware available',
2, 'FlightAware connected', False)
GPIO_ERROR_ARDUINO_SERVO_CONNECTION = (
24,
'ERROR: Servos not running or lost connection',
'SUCCESS: Handshake with servo Arduino received',
3, 'Hemisphere connected', True)
GPIO_ERROR_ARDUINO_REMOTE_CONNECTION = (
<----SKIPPED LINES---->
if RASPBERRY_PI:
PICKLE_FLIGHTS = MESSAGEBOARD_PATH + PICKLE_FLIGHTS
PICKLE_DASHBOARD = MESSAGEBOARD_PATH + PICKLE_DASHBOARD
LOGFILE = MESSAGEBOARD_PATH + LOGFILE
PICKLE_DUMP_JSON_FILE = MESSAGEBOARD_PATH + PICKLE_DUMP_JSON_FILE
PICKLE_FA_JSON_FILE = MESSAGEBOARD_PATH + PICKLE_FA_JSON_FILE
PICKLE_SCREENS = MESSAGEBOARD_PATH + PICKLE_SCREENS
CODE_REPOSITORY = MESSAGEBOARD_PATH
HISTOGRAM_CONFIG_FILE = WEBSERVER_PATH + HISTOGRAM_CONFIG_FILE
CONFIG_FILE = WEBSERVER_PATH + CONFIG_FILE
ROLLING_MESSAGE_FILE = WEBSERVER_PATH + ROLLING_MESSAGE_FILE
ALL_MESSAGE_FILE = WEBSERVER_PATH + ALL_MESSAGE_FILE
ROLLING_LOGFILE = WEBSERVER_PATH + ROLLING_LOGFILE
STDERR_FILE = WEBSERVER_PATH + STDERR_FILE
BACKUP_FILE = WEBSERVER_PATH + BACKUP_FILE
SERVICE_VERIFICATION_FILE = WEBSERVER_PATH + SERVICE_VERIFICATION_FILE
UPTIMES_FILE = WEBSERVER_PATH + UPTIMES_FILE
CODE_HISTORY_FILE = WEBSERVER_PATH + CODE_HISTORY_FILE
NEW_AIRCRAFT_FILE = WEBSERVER_PATH + NEW_AIRCRAFT_FILE
TEMPERATURE_LOG = WEBSERVER_PATH + TEMPERATURE_LOG
HISTOGRAM_IMAGE_HTML = WEBSERVER_PATH + HISTOGRAM_IMAGE_HTML
HOURLY_IMAGE_FILE = (
WEBSERVER_PATH + WEBSERVER_IMAGE_RELATIVE_FOLDER + HOURLY_IMAGE_FILE)
VERSION_REPOSITORY = WEBSERVER_PATH + VERSION_REPOSITORY
TIMEZONE = 'US/Pacific' # timezone of display
TZ = pytz.timezone(TIMEZONE)
# iata codes that we don't need to expand
KNOWN_AIRPORTS = ('SJC', 'SFO', 'OAK')
SPLITFLAP_CHARS_PER_LINE = 22
SPLITFLAP_LINE_COUNT = 6
DIRECTIONS_4 = ['N', 'E', 'S', 'W']
DIRECTIONS_8 = ['N', 'NE', 'E', 'SE', 'S', 'SW', 'W', 'NW']
DIRECTIONS_16 = ['N', 'NNE', 'NE', 'ENE', 'E', 'ESE', 'SE', 'SSE',
'S', 'SSW', 'SW', 'WSW', 'W', 'WNW', 'NW', 'NNW']
<----SKIPPED LINES---->
AIRCRAFT_LENGTH['Cessna Citation Sovereign (twin-jet)'] = 19.35
AIRCRAFT_LENGTH['Cessna Citation V (twin-jet)'] = 14.91
AIRCRAFT_LENGTH['Cessna Citation X (twin-jet)'] = 22.04
AIRCRAFT_LENGTH['Cessna Citation Mustang (twin-jet)'] = 12.37
AIRCRAFT_LENGTH['Cessna Skyhawk (piston-single)'] = 8.28
AIRCRAFT_LENGTH['Cessna Skylane (piston-single)'] = 8.84
AIRCRAFT_LENGTH['Cessna T206 Turbo Stationair (piston-single)'] = 8.61
AIRCRAFT_LENGTH['Cirrus SR-22 (piston-single)'] = 7.92
AIRCRAFT_LENGTH['Dassault Falcon 900 (tri-jet)'] = 20.21
AIRCRAFT_LENGTH['Dassault Falcon 2000 (twin-jet)'] = 20.23
AIRCRAFT_LENGTH['Embraer 170/175 (twin-jet)'] = (29.90 + 31.68) / 2
AIRCRAFT_LENGTH['Embraer Phenom 300 (twin-jet)'] = 15.9
AIRCRAFT_LENGTH['Embraer ERJ-135 (twin-jet)'] = 26.33
AIRCRAFT_LENGTH['Embraer ERJ-145 (twin-jet)'] = 29.87
AIRCRAFT_LENGTH['Embraer Legacy 450 (twin-jet)'] = 19.69
AIRCRAFT_LENGTH['EMBRAER 175 (long wing) (twin-jet)'] = 31.68
AIRCRAFT_LENGTH['Eurocopter EC-635 (twin-turboshaft)'] = 10.21
AIRCRAFT_LENGTH['IAI Gulfstream G280 (twin-jet)'] = 20.3
AIRCRAFT_LENGTH['Gulfstream Aerospace Gulfstream G550 (twin-jet)'] = 29.39
AIRCRAFT_LENGTH['Gulfstream Aerospace Gulfstream IV (twin-jet)'] = 26.92
AIRCRAFT_LENGTH['Learjet 35 (twin-jet)'] = 14.83
AIRCRAFT_LENGTH['Learjet 45 (twin-jet)'] = 17.68
AIRCRAFT_LENGTH['McDonnell Douglas MD-11 (tri-jet)'] = 61.6
AIRCRAFT_LENGTH['Pilatus PC-12 (single-turboprop)'] = 14.4
def Log(message, file=None, rolling=None):
"""Write a message to a logfile along with a timestamp.
Args:
message: string message to write
file: string representing file name and, if needed, path to the
file to write to
rolling: name of file that will keep only the last n files of file
"""
# can't define as a default parameter because LOGFILE name is potentially
# modified based on SIMULATION flag
if not file:
file = LOGFILE
# special case: for the main logfile, we always keep a rolling log
<----SKIPPED LINES---->
for (n, flight) in enumerate(flights):
if n/25 == int(n/25):
print(' - %d' % n)
CreateFlightInsights(
flights[:n+1], configuration.get('insights', 'hide'), {})
PickleObjectToFile(flight, tmp_f, False)
if mtime == os.path.getmtime(f):
shutil.move(tmp_f, f)
else:
print('Aborted: failed to bootstrap %s: file changed while in process'
% full_path)
return
def ResetLogs(config):
"""Clears the non-scrolling logs if reset_logs in config."""
if 'reset_logs' in config:
Log('Reset logs')
for f in (
STDERR_FILE, BACKUP_FILE, SERVICE_VERIFICATION_FILE,
NEW_AIRCRAFT_FILE, TEMPERATURE_LOG):
if RemoveFile(f):
open(f, 'a').close()
config.pop('reset_logs')
config = BuildSettings(config)
WriteFile(CONFIG_FILE, config)
return config
def CheckTemperature(configuration, last_logged=0):
"""Turn on fan if temperature exceeds threshold.
Args:
configuration: dictionary of configuration settings.
last_logged: epoch at which temperature was last logged.
Returns:
Epoch at which temperature was last logged.
"""
if RASPBERRY_PI:
temperature = gpiozero.CPUTemperature().temperature
if temperature > TEMP_FAN_TURN_ON_CELSIUS:
UpdateStatusLight(GPIO_FAN, True, 'Temperature: %.1f' % temperature)
elif temperature < TEMP_FAN_TURN_OFF_CELSIUS:
UpdateStatusLight(GPIO_FAN, False)
now = time.time()
if (configuration.get('log_temperature') and
now - last_logged > TEMPERATURE_LOG_FREQUENCY_SECONDS):
line = ','.join([str(now), str(temperature)])
with open(TEMPERATURE_LOG, 'a') as f:
f.write(line)
last_logged = now
return last_logged
pin_values = {} # caches last set value
def SetPinMode():
"""Initialize output GPIO pins for output on Raspberry Pi."""
global pin_values
if RASPBERRY_PI:
RPi.GPIO.setmode(RPi.GPIO.BCM)
pins = (
GPIO_ERROR_VESTABOARD_CONNECTION, GPIO_ERROR_FLIGHT_AWARE_CONNECTION,
GPIO_ERROR_ARDUINO_SERVO_CONNECTION, GPIO_ERROR_ARDUINO_REMOTE_CONNECTION,
GPIO_ERROR_BATTERY_CHARGE, GPIO_FAN, GPIO_UNUSED_1, GPIO_UNUSED_2)
for pin in pins:
initial_state = pin[5]
pin_values[pin[0]] = initial_state # Initialize state of pins
UpdateDashboard(initial_state, pin)
<----SKIPPED LINES---->
# Next up to print is index 0; this is a list of tuples:
# tuple element#1: flag indicating the type of message that this is
# tuple element#2: the message itself
message_queue = []
next_message_time = time.time()
# We repeat the loop every x seconds; this ensures that if the processing
# time is long, we don't wait another x seconds after processing completes
next_loop_time = time.time() + LOOP_DELAY_SECONDS
# These files are read only if the version on disk has been modified more
# recently than the last time it was read
last_dump_json_timestamp = 0
init_timing.append((time.time(), 7))
WaitUntilKillComplete(already_running_ids)
init_timing.append((time.time(), 8))
personal_message = None # Unknown what personal message is displayed
temp_last_logged = 0 # Keeps track of when temperature was last logged
LogTimes(init_timing)
Log('Finishing initialization of %d; starting radio polling loop' %
os.getpid())
while ((not SIMULATION or SIMULATION_COUNTER < len(DUMP_JSONS))
and not SHUTDOWN_SIGNAL):
last_heartbeat_time = Heartbeat(last_heartbeat_time)
new_configuration = ReadAndParseSettings(CONFIG_FILE)
UpdateRollingLogSize(new_configuration)
CheckForNewFilterCriteria(
configuration, new_configuration, message_queue, flights)
configuration = new_configuration
ResetLogs(configuration) # clear the logs if requested
UpdateRollingLogSize(configuration)
# if this is a SIMULATION, then process every diff dump. But if it
# isn't a simulation, then only read & do related processing for the
<----SKIPPED LINES---->
RemoveFile(HISTOGRAM_CONFIG_FILE)
# We also need to make sure there are flights on which to generate a
# histogram! Why might there not be any flights? Primarily during a
# simulation, if there's a lingering histogram file at the time of
# history restart.
if histogram and not flights:
Log('Histogram requested (%s) but no flights in memory' % histogram)
if histogram and flights:
message_queue.extend(TriggerHistograms(flights, histogram))
if message_queue: # Any personal message displayed has been cleared
personal_message = None
# check time & if appropriate, display next message from queue
next_message_time = ManageMessageQueue(
message_queue, next_message_time, configuration, screen_history)
reboot = CheckRebootNeeded(
startup_time, message_queue, json_desc_dict, configuration)
temp_last_logged = CheckTemperature(configuration, temp_last_logged)
if not SIMULATION:
time.sleep(max(0, next_loop_time - time.time()))
next_loop_time = time.time() + LOOP_DELAY_SECONDS
else:
SIMULATION_COUNTER += 1
if simulation_slowdown:
SimulationSlowdownNearFlight(flights, persistent_nearby_aircraft)
if SIMULATION:
SimulationEnd(message_queue, flights, screen_history)
PerformGracefulShutdown(shutdown, reboot)
if __name__ == "__main__":
#interrupt, as in ctrl-c
signal.signal(signal.SIGINT, InterruptShutdownFromSignal)
#terminate, when another instance found or via kill
signal.signal(signal.SIGTERM, InterruptShutdownFromSignal)
<----SKIPPED LINES---->
|