messageboard-2020-06-18-1232.py
01234567890123456789012345678901234567890123456789012345678901234567890123456789









115711581159116011611162116311641165116611671168116911701171117211731174117511761177    1178117911801181118211831184118511861187118811891190    1191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224  12251226122712281229123012311232123312341235123612371238123912401241124212431244








62696270627162726273627462756276627762786279628062816282628362846285628662876288 62896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323











                            <----SKIPPED LINES---->




    Boolean indicating whether the write was successful.
  """
  try:
    with open(filename, 'w') as content_file:
      content_file.write(text)
  except IOError:
    if log_exception:
      Log('Unable to write to '+filename)
    return False
  return True


def PrependFileName(full_path, prefix):
  """Converts /dir/file.png to /dir/prefixfile.png."""
  directory, file_name = os.path.split(full_path)
  file_name = prefix+file_name
  return os.path.join(directory, file_name)


def UnpickleObjectFromFile(
    full_path, date_segmentation, max_days=None, filenames=False):




  """Load a repository of pickled data into memory.

  Args:
    full_path: name (potentially including path) of the pickled file
    date_segmentation: If true, searches for all files that have a prefix of
      yyyy-mm-dd as a prefix to the file name specified in the full path, and
      loads them in sequence for unpickling; if false, uses the full_path as is
      and loads just that single file.
    max_days: Integer that, if specified, indicates maximum number of days of
      files to load back in; otherwise, loads all.  That is, at most max_days
      files will be read.
    filenames: If true, rather than returning the list of data, returns a list
      of the filenames that would have been read.





  Returns:
    Return a list - either of the data, or of all the file names that would
    have been read.
  """
  if date_segmentation:
    directory, file = os.path.split(full_path)

    d = '[0-9]'
    sep = '-'
    date_format = d*4 + sep + d*2 + sep + d*2  # yyyy-mm-dd
    exp = date_format + sep + file
    pattern = re.compile(exp)
    files = os.listdir(directory)

    if max_days:  # no need to read any files older than x days
      earliest_date = EpochDisplayTime(
          time.time() - (max_days - 1) * SECONDS_IN_DAY, '%Y-%m-%d')
      files = [f for f in files if f[:10] >= earliest_date]

    files = sorted(
        [os.path.join(directory, f) for f in files if pattern.match(f)])
  else:
    if os.path.exists(full_path):
      files = [full_path]
    else:
      return []

  data = []

  if filenames:
    return files

  for file in files:


    try:
      with open(file, 'rb') as f:
        while True:
          try:
            data.append(pickle.load(f))
          except (UnicodeDecodeError) as e:
            Log('Process %s reading file %s gave error %s' % (
                psutil.Process(os.getpid()).name(), f, e))
    except (EOFError, pickle.UnpicklingError):
      pass

  return data


cached_object_count = {}
def PickleObjectToFile(
    data, full_path, date_segmentation, timestamp=None, verify=False):
  """Append one pickled flight to the end of binary file.

  Args:




                            <----SKIPPED LINES---->




    UpdateDashboard(False)  # Send an all-clear message
    last_heartbeat_time = now
  return last_heartbeat_time


def VersionControl():
  """Copies current instances of messageboard.py and arduino.py into repository.

  To aid debugging, we want to keep past versions of the code easily
  accessible, and linked to the errors that have been logged. This function
  copies the python code into a version control directory after adding in a
  date / time stamp to the file name.
  """
  global VERSION_MESSAGEBOARD
  global VERSION_ARDUINO
  VERSION_MESSAGEBOARD = MakeVersionCopy('messageboard')
  VERSION_ARDUINO = MakeVersionCopy('arduino')


def MakeVersionCopy(python_prefix):

  file_extension = '.py'

  live_name = python_prefix + '.py'
  live_path = os.path.join(CODE_REPOSITORY, live_name)

  epoch = os.path.getmtime(live_path)
  last_modified_suffix = EpochDisplayTime(
      epoch, format_string='-%Y-%m-%d-%H%M')
  version_name = python_prefix + last_modified_suffix + file_extension
  version_path = os.path.join(VERSION_REPOSITORY, version_name)

  if not os.path.exists(version_path):
    shutil.copyfile(live_path, version_path)
  return version_name



def main():
  """Traffic cop between radio, configuration, and messageboard.

  This is the main logic, checking for new flights, augmenting the radio
  signal with additional web-scraped data, and generating messages in a
  form presentable to the messageboard.
  """
  VersionControl()

  # Since this clears log files, it should occur first before we start logging
  if '-s' in sys.argv:
    global SIMULATION_COUNTER
    SimulationSetup()

  last_heartbeat_time = HeartbeatRestart()
  init_timing = [(time.time(), 0)]

  # This flag slows down simulation time around a flight, great for




                            <----SKIPPED LINES---->





01234567890123456789012345678901234567890123456789012345678901234567890123456789









11571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254








62796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313 63146315631663176318631963206321632263236324632563266327632863296330633163326333











                            <----SKIPPED LINES---->




    Boolean indicating whether the write was successful.
  """
  try:
    with open(filename, 'w') as content_file:
      content_file.write(text)
  except IOError:
    if log_exception:
      Log('Unable to write to '+filename)
    return False
  return True


def PrependFileName(full_path, prefix):
  """Converts /dir/file.png to /dir/prefixfile.png."""
  directory, file_name = os.path.split(full_path)
  file_name = prefix+file_name
  return os.path.join(directory, file_name)


def UnpickleObjectFromFile(
    full_path,
    date_segmentation,
    max_days=None,
    filenames=False,
    heartbeat=False):
  """Load a repository of pickled data into memory.

  Args:
    full_path: name (potentially including path) of the pickled file
    date_segmentation: If true, searches for all files that have a prefix of
      yyyy-mm-dd as a prefix to the file name specified in the full path, and
      loads them in sequence for unpickling; if false, uses the full_path as is
      and loads just that single file.
    max_days: Integer that, if specified, indicates maximum number of days of
      files to load back in; otherwise, loads all.  That is, at most max_days
      files will be read.
    filenames: If true, rather than returning the list of data, returns a list
      of the filenames that would have been read.
    heartbeat: boolean indicating whether we should log heartbeats between each
      histogram to make sure monitoring does not mistake this slow procedure
      for being hung; this should be set to false if this is called from
      outside of messageboard.main.

  Returns:
    Return a list - either of the data, or of all the file names that would
    have been read.
  """
  if date_segmentation:
    directory, file = os.path.split(full_path)

    d = '[0-9]'
    sep = '-'
    date_format = d*4 + sep + d*2 + sep + d*2  # yyyy-mm-dd
    exp = date_format + sep + file
    pattern = re.compile(exp)
    files = os.listdir(directory)

    if max_days:  # no need to read any files older than x days
      earliest_date = EpochDisplayTime(
          time.time() - (max_days - 1) * SECONDS_IN_DAY, '%Y-%m-%d')
      files = [f for f in files if f[:10] >= earliest_date]

    files = sorted(
        [os.path.join(directory, f) for f in files if pattern.match(f)])
  else:
    if os.path.exists(full_path):
      files = [full_path]
    else:
      return []

  data = []

  if filenames:
    return files

  for file in files:
    if heartbeat:
      Heartbeat()
    try:
      with open(file, 'rb') as f:
        while True:
          try:
            data.append(pickle.load(f))
          except (UnicodeDecodeError) as e:
            Log('Process %s reading file %s gave error %s' % (
                psutil.Process(os.getpid()).name(), f, e))
    except (EOFError, pickle.UnpicklingError):
      pass

  return data


cached_object_count = {}
def PickleObjectToFile(
    data, full_path, date_segmentation, timestamp=None, verify=False):
  """Append one pickled flight to the end of binary file.

  Args:




                            <----SKIPPED LINES---->




    UpdateDashboard(False)  # Send an all-clear message
    last_heartbeat_time = now
  return last_heartbeat_time


def VersionControl():
  """Copies current instances of messageboard.py and arduino.py into repository.

  To aid debugging, we want to keep past versions of the code easily
  accessible, and linked to the errors that have been logged. This function
  copies the python code into a version control directory after adding in a
  date / time stamp to the file name.
  """
  global VERSION_MESSAGEBOARD
  global VERSION_ARDUINO
  VERSION_MESSAGEBOARD = MakeVersionCopy('messageboard')
  VERSION_ARDUINO = MakeVersionCopy('arduino')


def MakeVersionCopy(python_prefix):
  """Copies current instance of python file into repository."""
  file_extension = '.py'

  live_name = python_prefix + '.py'
  live_path = os.path.join(CODE_REPOSITORY, live_name)

  epoch = os.path.getmtime(live_path)
  last_modified_suffix = EpochDisplayTime(
      epoch, format_string='-%Y-%m-%d-%H%M')
  version_name = python_prefix + last_modified_suffix + file_extension
  version_path = os.path.join(VERSION_REPOSITORY, version_name)

  if not os.path.exists(version_path):
    shutil.copyfile(live_path, version_path)
  return version_name



def main():
  """Traffic cop between radio, configuration, and messageboard.

  This is the main logic, checking for new flights, augmenting the radio
  signal with additional web-scraped data, and generating messages in a
  form presentable to the messageboard.
  """
  VersionControl()

  # Since this clears log files, it should occur first before we start logging
  if '-s' in sys.argv:
    global SIMULATION_COUNTER
    SimulationSetup()

  last_heartbeat_time = HeartbeatRestart()
  init_timing = [(time.time(), 0)]

  # This flag slows down simulation time around a flight, great for




                            <----SKIPPED LINES---->