Guest User

raspi_rfm-mois.py

a guest
Jan 29th, 2022
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 19.16 KB | None | 0 0
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. '''
  4. Created on 30.03.2019
  5.  
  6. @author: M.Buchfink (buwx.de)
  7.  
  8. changed january 2022 to write readings to csv-file
  9. see changes line 550ff
  10. '''
  11.  
  12. import argparse
  13. import logging
  14. import sys
  15. import math
  16. import threading
  17. import time
  18.  
  19. import RPi.GPIO as GPIO
  20. import spidev
  21. import Adafruit_BMP.BMP085 as BMP085
  22.  
  23. IRQ_PIN = 22    # gpio irg pin
  24. CH_ID = 1       # channel id
  25.  
  26. SENSIVITY = 140
  27.  
  28. ISS_FREQUENCIES = [14222256, 14226191, 14230129, 14224227, 14228161] # frequency settings
  29. ISS_CHANNELS = len(ISS_FREQUENCIES)
  30.  
  31. TIMER_INTERVAL = (40.0 + CH_ID)/16
  32. MAX_HOPS = 8
  33.  
  34. # RFM69 register names
  35. REG_FIFO          = 0x00
  36. REG_OPMODE        = 0x01
  37. REG_DATAMODUL     = 0x02
  38. REG_BITRATEMSB    = 0x03
  39. REG_BITRATELSB    = 0x04
  40. REG_FDEVMSB       = 0x05
  41. REG_FDEVLSB       = 0x06
  42. REG_FRFMSB        = 0x07
  43. REG_FRFMID        = 0x08
  44. REG_FRFLSB        = 0x09
  45. REG_OSC1          = 0x0A
  46. REG_RXBW          = 0x19
  47. REG_AFCBW         = 0x1A
  48. REG_AFCFEI        = 0x1E
  49. REG_FEIMSB        = 0x21
  50. REG_FEILSB        = 0x22
  51. REG_RSSIVALUE     = 0x24
  52. REG_DIOMAPPING1   = 0x25
  53. REG_IRQFLAGS1     = 0x27
  54. REG_IRQFLAGS2     = 0x28
  55. REG_RSSITHRESH    = 0x29
  56. REG_PREAMBLELSB   = 0x2D
  57. REG_SYNCCONFIG    = 0x2E
  58. REG_SYNCVALUE1    = 0x2F
  59. REG_SYNCVALUE2    = 0x30
  60. REG_PACKETCONFIG1 = 0x37
  61. REG_PAYLOADLENGTH = 0x38
  62. REG_FIFOTHRESH    = 0x3C
  63. REG_PACKETCONFIG2 = 0x3D
  64. REG_TESTLNA       = 0x58
  65. REG_TESTDAGC      = 0x6F
  66.  
  67. # RFM69 register values
  68. RF_OPMODE_SLEEP       = 0x00
  69. RF_OPMODE_STANDBY     = 0x04
  70. RF_OPMODE_SYNTHESIZER = 0x08
  71. RF_OPMODE_TRANSMITTER = 0x0C
  72. RF_OPMODE_RECEIVER    = 0x10
  73.  
  74. RF_DATAMODUL_MODULATIONSHAPING_10 = 0x02
  75.  
  76. RF_BITRATEMSB_19200 = 0x06
  77. RF_BITRATELSB_19200 = 0x83
  78.  
  79. RF_FDEVMSB_4800 = 0x00
  80. RF_FDEVLSB_4800 = 0x4e
  81.  
  82. RF_RXBW_DCCFREQ_010 = 0x40
  83. RF_RXBW_MANT_20     = 0x08
  84. RF_RXBW_EXP_4       = 0x04
  85.  
  86. RF_RXBW_DCCFREQ_010 = 0x40
  87. RF_RXBW_MANT_20     = 0x08
  88. RF_RXBW_EXP_3       = 0x03
  89.  
  90. RF_OSC1_RCCAL_DONE  = 0x40
  91. RF_OSC1_RCCAL_START = 0x80
  92.  
  93. RF_AFCFEI_AFCAUTOCLEAR_ON = 0x08
  94. RF_AFCFEI_AFCAUTO_ON      = 0x04
  95.  
  96. RF_DIOMAPPING1_DIO0_01 = 0x40 # PayloadReady
  97. RF_DIOMAPPING1_DIO0_11 = 0xC0 # Rssi
  98.  
  99. RF_IRQFLAGS1_MODEREADY    = 0x80
  100. RF_IRQFLAGS2_PAYLOADREADY = 0x04
  101. RF_IRQFLAGS2_FIFOOVERRUN  = 0x10
  102.  
  103. RF_SYNC_ON            = 0x80
  104. RF_SYNC_FIFOFILL_AUTO = 0x00
  105. RF_SYNC_SIZE_2        = 0x08
  106. RF_SYNC_TOL_0         = 0x00
  107.  
  108. RF_SYNC_BYTE1_VALUE   = 0xCB
  109. RF_SYNC_BYTE2_VALUE   = 0x89
  110.  
  111. RF_PACKET1_FORMAT_FIXED      = 0x00
  112. RF_PACKET1_DCFREE_OFF        = 0x00
  113. RF_PACKET1_CRC_OFF           = 0x00
  114. RF_PACKET1_CRCAUTOCLEAR_OFF  = 0x08
  115. RF_PACKET1_ADRSFILTERING_OFF = 0x00
  116.  
  117. RF_PACKET2_RXRESTARTDELAY_2BITS = 0x10
  118. RF_PACKET2_AUTORXRESTART_ON     = 0x02
  119. RF_PACKET2_AES_OFF              = 0x00
  120.  
  121. RF69_MODE_SLEEP   = 0
  122. RF69_MODE_STANDBY = 1
  123. RF69_MODE_SYNTH   = 2
  124. RF69_MODE_RX      = 3
  125. RF69_MODE_TX      = 4
  126.  
  127. def reverse_bits(b):
  128.     b = ((b & 0b11110000) >>4 ) | ((b & 0b00001111) << 4)
  129.     b = ((b & 0b11001100) >>2 ) | ((b & 0b00110011) << 2)
  130.     b = ((b & 0b10101010) >>1 ) | ((b & 0b01010101) << 1)
  131.     return b
  132.  
  133. def msb(b):
  134.     return (b & 0xff0000) >> 16
  135.  
  136. def mid(b):
  137.     return (b & 0x00ff00) >> 8
  138.  
  139. def lsb(b):
  140.     return b & 0x0000ff
  141.  
  142. class Timer(threading.Thread):
  143.     def __init__(self, delay, callback):
  144.         threading.Thread.__init__(self)
  145.         self.delay = delay
  146.         self.callback = callback
  147.         self.condition = threading.Condition()
  148.         self.active = True
  149.         self.calibrated = False
  150.         self.timestamp = 0
  151.         self.freq_index = 0
  152.         self.daemon = True
  153.  
  154.     def run(self):
  155.         with self.condition:
  156.             while self.active:
  157.                 self.wait()
  158.                 self.do_callback()
  159.  
  160.     def wait(self):
  161.         delay = self.delay
  162.         if self.timestamp > 0:
  163.             current = time.time()
  164.             n = int((current - self.timestamp) / self.delay)
  165.             if self.calibrated:
  166.                 self.calibrated = False
  167.                 n = 0.25
  168.             else:
  169.                 n += 1.75
  170.             delay = self.timestamp + n * self.delay - current
  171.             if delay < 0.05:
  172.                 delay = 0.05
  173.  
  174.         logging.debug("wait " + str(delay))
  175.         self.condition.wait(delay)
  176.  
  177.     def do_callback(self):
  178.         if self.callback and not self.calibrated:
  179.             current = time.time()
  180.             frac = (1 + self.freq_index + (current - self.timestamp) / self.delay) % ISS_CHANNELS
  181.             self.callback(int(frac))
  182.  
  183.     def cancel(self):
  184.         with self.condition:
  185.             self.active = False
  186.             self.callback = None
  187.             self.condition.notify()
  188.         self.join()
  189.  
  190.     def calibrate(self, callback, timestamp, freq_index):
  191.         self.callback = callback
  192.         self.timestamp = timestamp
  193.         self.freq_index = freq_index
  194.         self.calibrated = True
  195.         logging.debug("notify")
  196.         self.condition.notify()
  197.  
  198. class DavisReceiver(object):
  199.     def __init__(self):
  200.         self.mode = None
  201.         self.handler = None
  202.         self.freq_index = 0
  203.         self.valid_messages = 0
  204.         self.lost_messages = 0
  205.         self.hop_count = 1
  206.         self.lock = False
  207.         self.fei_array = [0, 0, 0, 0, 0]
  208.  
  209.         GPIO.setmode(GPIO.BOARD)
  210.         GPIO.setup(IRQ_PIN, GPIO.IN)
  211.  
  212.         self.CONFIG = {
  213.           0x01: [REG_OPMODE, RF_OPMODE_STANDBY], # Standby
  214.           0x02: [REG_DATAMODUL, RF_DATAMODUL_MODULATIONSHAPING_10], # Packet Mode, FSK, Gaussian Filter, BT = 0.5
  215.           # Davis uses a datarate of 19.2 KBPS
  216.           0x03: [REG_BITRATEMSB, RF_BITRATEMSB_19200],
  217.           0x04: [REG_BITRATELSB, RF_BITRATELSB_19200],
  218.           # Davis uses a deviation of 4.8 kHz on Rx
  219.           0x05: [REG_FDEVMSB, RF_FDEVMSB_4800],
  220.           0x06: [REG_FDEVLSB, RF_FDEVLSB_4800],
  221.           # set channel frequency
  222.           0x07: [REG_FRFMSB, msb(ISS_FREQUENCIES[self.freq_index] + self.fei_array[self.freq_index])],
  223.           0x08: [REG_FRFMID, mid(ISS_FREQUENCIES[self.freq_index] + self.fei_array[self.freq_index])],
  224.           0x09: [REG_FRFLSB, lsb(ISS_FREQUENCIES[self.freq_index] + self.fei_array[self.freq_index])],
  225.           # Use 25 kHz BW (BitRate < 2 * RxBw)
  226.           0x19: [REG_RXBW, RF_RXBW_DCCFREQ_010 | RF_RXBW_MANT_20 | RF_RXBW_EXP_4],
  227.           # Use double the bandwidth during AFC as reception
  228.           0x1a: [REG_AFCBW, RF_RXBW_DCCFREQ_010 | RF_RXBW_MANT_20 | RF_RXBW_EXP_3],
  229.           0x1e: [REG_AFCFEI, RF_AFCFEI_AFCAUTOCLEAR_ON | RF_AFCFEI_AFCAUTO_ON],
  230.           0x25: [REG_DIOMAPPING1, RF_DIOMAPPING1_DIO0_01], # map DIO0 to PayloadReady IRQ
  231.           0x29: [REG_RSSITHRESH, SENSIVITY], # Rssi Threshold
  232.           # Davis has four preamble bytes 0xAAAAAAAA
  233.           0x2d: [REG_PREAMBLELSB, 4],
  234.           # Sync detection on, FIFO filling condition 0, 2 sync words, no sync errors
  235.           0x2e: [REG_SYNCCONFIG, RF_SYNC_ON | RF_SYNC_FIFOFILL_AUTO | RF_SYNC_SIZE_2 | RF_SYNC_TOL_0],
  236.           0x2f: [REG_SYNCVALUE1, RF_SYNC_BYTE1_VALUE], # Davis first sync byte 0xCB
  237.           0x30: [REG_SYNCVALUE2, RF_SYNC_BYTE2_VALUE], # Davis second sync byte 0x89
  238.           # Fixed packet length and we'll check our own CRC
  239.           0x37: [REG_PACKETCONFIG1, RF_PACKET1_FORMAT_FIXED | RF_PACKET1_DCFREE_OFF |
  240.                  RF_PACKET1_CRC_OFF | RF_PACKET1_CRCAUTOCLEAR_OFF | RF_PACKET1_ADRSFILTERING_OFF],
  241.           # Davis sends 10 bytes of payload, including CRC that we check manually
  242.           0x38: [REG_PAYLOADLENGTH, 10],
  243.           # RXRESTARTDELAY must match transmitter PA ramp-down time (bitrate dependent)
  244.           0x3d: [REG_PACKETCONFIG2, RF_PACKET2_RXRESTARTDELAY_2BITS | RF_PACKET2_AUTORXRESTART_ON | RF_PACKET2_AES_OFF],
  245.           # SensitivityBoost
  246.           0x58: [REG_TESTLNA, 0x2d],
  247.           # Improved margin
  248.           0x6f: [REG_TESTDAGC, 0x30],
  249.         }
  250.  
  251.         # initialize timer
  252.         self.timer = Timer(TIMER_INTERVAL, None)
  253.  
  254.         # initialize SPI
  255.         self.spi = spidev.SpiDev()
  256.         self.spi.open(0, 0)
  257.         self.spi.max_speed_hz = 4000000
  258.  
  259.         # verify chip is syncing?
  260.         while self.read_register(REG_SYNCVALUE1) != RF_SYNC_BYTE1_VALUE:
  261.             self.write_register(REG_SYNCVALUE1, RF_SYNC_BYTE1_VALUE)
  262.  
  263.         while self.read_register(REG_SYNCVALUE1) != RF_SYNC_BYTE2_VALUE:
  264.             self.write_register(REG_SYNCVALUE1, RF_SYNC_BYTE2_VALUE)
  265.  
  266.         # write config
  267.         for value in self.CONFIG.values():
  268.             self.write_register(value[0], value[1])
  269.  
  270.         # wait for ModeReady
  271.         while (self.read_register(REG_IRQFLAGS1) & RF_IRQFLAGS1_MODEREADY) == 0x00:
  272.             pass
  273.  
  274.         GPIO.remove_event_detect(IRQ_PIN)
  275.         GPIO.add_event_detect(IRQ_PIN, GPIO.RISING, callback=self.interrupt_handler)
  276.  
  277.     def read_register(self, addr):
  278.         return self.spi.xfer([addr & 0x7F, 0])[1]
  279.  
  280.     def write_register(self, addr, value):
  281.         self.spi.xfer([addr | 0x80, value])
  282.  
  283.     def setmode(self, newMode):
  284.         if newMode == self.mode:
  285.             return
  286.         mask = self.read_register(REG_OPMODE) & 0xE3 # 11100011
  287.         if newMode == RF69_MODE_TX:
  288.             self.write_register(REG_OPMODE, mask | RF_OPMODE_TRANSMITTER)
  289.         elif newMode == RF69_MODE_RX:
  290.             self.write_register(REG_OPMODE, mask | RF_OPMODE_RECEIVER)
  291.         elif newMode == RF69_MODE_SYNTH:
  292.             self.write_register(REG_OPMODE, mask | RF_OPMODE_SYNTHESIZER)
  293.         elif newMode == RF69_MODE_STANDBY:
  294.             self.write_register(REG_OPMODE, mask | RF_OPMODE_STANDBY)
  295.         elif newMode == RF69_MODE_SLEEP:
  296.             self.write_register(REG_OPMODE, mask | RF_OPMODE_SLEEP)
  297.         else:
  298.             return
  299.  
  300.         # we are using packet mode, so this check is not really needed
  301.         # but waiting for mode ready is necessary when going from sleep because the FIFO may not be immediately available from previous mode
  302.         while self.mode == RF69_MODE_SLEEP and self.read_register(REG_IRQFLAGS1) & RF_IRQFLAGS1_MODEREADY == 0x00:
  303.             pass
  304.  
  305.         self.mode = newMode;
  306.  
  307.     def read_rssi(self):
  308.         return -self.read_register(REG_RSSIVALUE) / 2
  309.  
  310.     def read_fei(self):
  311.         fei = (self.read_register(REG_FEIMSB) << 8) | self.read_register(REG_FEILSB)
  312.         if fei >= 32768:
  313.             fei = fei - 65536
  314.         return fei
  315.  
  316.     def calibration(self):
  317.         self.write_register(REG_OSC1, RF_OSC1_RCCAL_START)
  318.         while self.read_register(REG_OSC1) & RF_OSC1_RCCAL_DONE == 0x00:
  319.             pass
  320.  
  321.     def hop(self, freq_index):
  322.         self.freq_index = freq_index
  323.         logging.debug("hop (10" + str(self.freq_index) + ")")
  324.         self.write_register(REG_FRFMSB,
  325.             msb(ISS_FREQUENCIES[self.freq_index] + self.fei_array[self.freq_index]))
  326.         self.write_register(REG_FRFMID,
  327.             mid(ISS_FREQUENCIES[self.freq_index] + self.fei_array[self.freq_index]))
  328.         self.write_register(REG_FRFLSB,
  329.             lsb(ISS_FREQUENCIES[self.freq_index] + self.fei_array[self.freq_index]))
  330.         # optimized sequence from documentation 4.2.5
  331.         self.setmode(RF69_MODE_SYNTH)
  332.         self.setmode(RF69_MODE_RX)
  333.  
  334.     def sleep(self):
  335.         self.setmode(RF69_MODE_SLEEP)
  336.  
  337.     def receive_begin(self):
  338.         #set DIO0 to "PayloadRead" in receive mode
  339.         self.write_register(REG_DIOMAPPING1, RF_DIOMAPPING1_DIO0_01)
  340.         self.setmode(RF69_MODE_RX)
  341.         self.timer.start()
  342.  
  343.     def shutdown(self):
  344.         self.timer.cancel()
  345.         self.sleep()
  346.         GPIO.cleanup()
  347.  
  348.     def set_handler(self, handler):
  349.         self.handler = handler
  350.  
  351.     def timer_handler(self, freq_index):
  352.         with self.timer.condition:
  353.             self.hop_count += 1
  354.             if self.hop_count >= MAX_HOPS:
  355.                 self.timer.callback = None
  356.                 freq_index = 0
  357.             self.hop(freq_index)
  358.  
  359.     def interrupt_handler(self, pin):
  360.         with self.timer.condition:
  361.             if self.mode == RF69_MODE_RX and self.read_register(REG_IRQFLAGS2) & RF_IRQFLAGS2_PAYLOADREADY:
  362.                 timestamp = time.time()
  363.                 freq_index = self.freq_index
  364.                 a = self.spi.xfer2([REG_FIFO & 0x7f,0,0,0,0,0,0,0,0,0,0])[1:]
  365.                 rssi = self.read_rssi()
  366.                 fei = self.read_fei()
  367.                 message = "I " + "%3d" % (100 + freq_index)
  368.                 for idx in range(8):
  369.                     hex = "%02X" % reverse_bits(a[idx])
  370.                     message += " " + hex
  371.                 message += " %4s" % str(rssi)
  372.                 message += " %4s" % str(fei)
  373.                 message += " %2d" % self.hop_count
  374.                 if self.handler:
  375.                     if self.handler(message):
  376.                         self.fei_array[freq_index] += fei
  377.                         self.valid_messages += 1
  378.                         self.lost_messages += self.hop_count - 1
  379.                         self.hop_count = 0
  380.                         self.timer.calibrate(self.timer_handler, timestamp, freq_index)
  381.  
  382. POLYNOMIAL = 0x1021
  383. PRESET = 0
  384.  
  385. sensor = BMP085.BMP085()
  386.  
  387. def _initial(c):
  388.     crc = 0
  389.     c = c << 8
  390.     for _ in range(8):
  391.         if (crc ^ c) & 0x8000:
  392.             crc = (crc << 1) ^ POLYNOMIAL
  393.         else:
  394.             crc = crc << 1
  395.         c = c << 1
  396.     return crc
  397.  
  398. _tab = [ _initial(i) for i in range(256) ]
  399.  
  400. def _update_crc(crc, c):
  401.     cc = 0xff & c
  402.  
  403.     tmp = (crc >> 8) ^ cc
  404.     crc = (crc << 8) ^ _tab[tmp & 0xff]
  405.     crc = crc & 0xffff
  406.  
  407.     return crc
  408.  
  409. # Calculates the crc
  410. def crc(data):
  411.     crc = PRESET
  412.     for idx in range(2, 10):
  413.         crc = _update_crc(crc, int(data[idx], 16))
  414.     return crc
  415.  
  416. # Check line for crc
  417. def check(line):
  418.     return crc(line.split()) == 0
  419.  
  420. # formats the line
  421. def formatData(line):
  422.     data = line.split()
  423.     if len(data) == 0 or data[0] != 'I':
  424.         return line
  425.  
  426.     value = ""
  427.     for idx in range(len(data)):
  428.         if idx > 0:
  429.             value += " "
  430.         if idx >= 2 and idx < 10:
  431.             value += ("0" + data[idx]) if len(data[idx]) == 1 else data[idx]
  432.         elif idx == 10:
  433.             value += (" " + data[idx])
  434.         else:
  435.             value += data[idx]
  436.     return value
  437.  
  438. # Parses values from line
  439. def description(line):
  440.     description = "unknown"
  441.     data = line.split()
  442.  
  443.     if crc(data) != 0:
  444.         return "invalid crc"
  445.  
  446.     elif data[0] == 'I':
  447.         header = int(data[2], 16) >> 4
  448.         windSpeed = int(round(int(data[3], 16) * 1.609344, 0))
  449.         windDirections = (int(data[4], 16) << 2) | (int(data[6], 16) & 0x02)
  450.         windDirections = 360 if windDirections > 1024 or windDirections <= 0 else int(round(windDirections * 360.0 / 1024.0))
  451. #        windData = " w(" + str(windSpeed) + "km/h, " + str(windDirections) + ")"
  452.         windData = str(windSpeed) + "," + str(windDirections)
  453.  
  454.         # akku voltage
  455.         if header == 0x2:
  456.             voltage = round(((int(data[5], 16) << 2) + ((int(data[6], 16) & 0xC0) >> 6)) / 100.0, 1)
  457. #            description = "v=" + str(voltage) + "V"
  458.             description = ",,,,,," + str(voltage)
  459.  
  460.         elif header == 0x3:
  461. #            description = "unknown" # not implemented
  462.             description = ",,,,,,"
  463.  
  464.         # rain rate
  465.         elif header == 0x5:
  466.             rr = 0
  467.             rr1 = int(data[5], 16)
  468.             rr2 = int(data[6], 16)
  469.             if rr1 != 0xff:
  470.                 if (rr2 & 0x40) == 0:
  471.                     rr = round(11520.0/(((rr2 & 0x30) << 4) | rr1), 1)
  472.                 elif (rr2 & 0x40) == 0x40:
  473.                     rr = round(11520.0/(((rr2 & 0x30) << 8) | (rr1 << 4)), 1)
  474. #            description = "rr=" + str(rr) + "mm/h"
  475.             description = ",,," + str(rr) + ",,,"
  476.  
  477.         # solar radiation
  478.         elif header == 0x7:
  479.             sol = (int(data[5], 16) << 2) + ((int(data[6], 16) & 0xC0) >> 6)
  480. #            description = "sol=" + str(sol)
  481.             description = ",,,,," + str(sol) + ","
  482.  
  483.         # temperature
  484.         elif header == 0x8:
  485.             value = int(data[5], 16) * 256 + int(data[6], 16)
  486.             value = value - 65536 if value > 32767 else value
  487.             temperature = round((value/160.0 - 32.0)*5.0/9.0, 1)
  488. #            description = "t=" + str(temperature) + "C"
  489.             description = "," + str(temperature) + ",,,,,"
  490.  
  491.         # gust speed
  492.         elif header == 0x9:
  493.             gustSpeed = int(round(int(data[5], 16) * 1.609344, 0))
  494. #            description = "g=" + str(gustSpeed) + "km/h"
  495.             description = str(gustSpeed) + ",,,,,,"
  496.  
  497.         # humidity
  498.         elif header == 0xA:
  499.             value = ((int(data[6], 16) >> 4) << 8) + int(data[5], 16)
  500.             humidity = int(round(value * 1.01 / 10.0, 0))
  501.             humidity = 100 if humidity > 100 else humidity
  502. #            description = "h=" + str(humidity) + "%"
  503.             description = ",,,," + str(humidity) + ",,"
  504.  
  505.         # rain ticks
  506.         elif header == 0xE:
  507.             ticks = value = int(data[5], 16) & 0x7f
  508. #            description = "r=" + str(ticks)
  509.             description = ",," + str(ticks) + ",,,,"
  510.  
  511.         tempInside = sensor.read_temperature()
  512.         pressure = sensor.read_pressure()
  513.  
  514. #        description = "%-12s%s" % (description,windData)
  515.         description = str(windData) + "," + str(description) + "," + str(tempInside) + "," + str(pressure)
  516.  
  517.     return description
  518.  
  519. LOOP_TIME = 60
  520.  
  521. class DataLogger(object):
  522.     def __init__(self):
  523.         self.receiver = DavisReceiver()
  524.         self.receiver.set_handler(self.process_message)
  525.  
  526.     def loop(self):
  527.         self.receiver.calibration()
  528.         self.receiver.receive_begin()
  529.  
  530.         # main loop
  531.         while True:
  532.             ts = int(time.time())
  533.             self.sleep(ts + LOOP_TIME - ts % LOOP_TIME)
  534.  
  535.     def sleep(self, target):
  536.         while True:
  537.             ts = int(time.time())
  538.             if ts < target:
  539.                 time.sleep(target - ts)
  540.             else:
  541.                 break
  542.  
  543.     def shutdown(self):
  544.         if self.receiver:
  545.             self.receiver.shutdown()
  546.  
  547.     def process_message(self, message):
  548.         if not check(message):
  549.             logging.info("invalid message received: " + message + " " + description(message))
  550.             return False
  551.  
  552. #        logging.info(message + " " + description(message)) #me: hier wird die bildschirmausgabe zusammengesetzt
  553.         logging.info(description(message))         #me
  554.         time.sleep(0.1)
  555.         return True
  556.  
  557. # the main procedure
  558.  
  559. if __name__ == "__main__":
  560.     parser = argparse.ArgumentParser()
  561.     parser.add_argument("--debug", help="more log output", action="store_true")
  562.     args = parser.parse_args()
  563.  
  564. # me    logging.basicConfig(format='%(asctime)s\t%(levelname)s\t%(message)s', level=logging.DEBUG if args.debug else logging.INFO)
  565.     logging.basicConfig(
  566.         format='%(asctime)s,%(message)s',
  567.         datefmt='%Y-%m-%d %H:%M:%S',
  568.         level=logging.DEBUG if args.debug else logging.INFO,
  569.         handlers=[
  570.             logging.FileHandler("vueiss.csv"),
  571.             logging.StreamHandler(sys.stdout)
  572.         ]
  573.     )
  574. #    logging.info("Starting Davis-ISS logging")
  575.  
  576.     data_logger = None
  577.  
  578.     try:
  579.         data_logger = DataLogger()
  580.         data_logger.loop()
  581.     except Exception as e:
  582.         logging.critical(str(e))
  583.  
  584.     finally:
  585.         if data_logger:
  586.             data_logger.shutdown()
Advertisement
Add Comment
Please, Sign In to add comment