diff --git a/.gitignore b/.gitignore index db87d23..c3e345a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .idea +Pipfile.lock ardas/*.ssr ardas/settings.py ardas/data/* diff --git a/Pipfile b/Pipfile index 25eae0a..237bbad 100644 --- a/Pipfile +++ b/Pipfile @@ -11,6 +11,7 @@ pyserial = "==3.4" influxdb = "==5.0.0" ntplib = "==0.3.3" numpy = "==1.14.0" +requests = "==2.20.0" [dev-packages] diff --git a/Pipfile.lock b/Pipfile.lock deleted file mode 100644 index 7213ca6..0000000 --- a/Pipfile.lock +++ /dev/null @@ -1,275 +0,0 @@ -{ - "_meta": { - "hash": { - "sha256": "02ff0ff525ef0a82b2216f1ff8438617580f5c3c3f0bb09d0810fe1fe30b8aa9" - }, - "host-environment-markers": { - "implementation_name": "cpython", - "implementation_version": "3.5.2", - "os_name": "posix", - "platform_machine": "x86_64", - "platform_python_implementation": "CPython", - "platform_release": "4.4.0-131-generic", - "platform_system": "Linux", - "platform_version": "#157-Ubuntu SMP Thu Jul 12 15:51:36 UTC 2018", - "python_full_version": "3.5.2", - "python_version": "3.5", - "sys_platform": "linux" - }, - "pipfile-spec": 6, - "requires": {}, - "sources": [ - { - "name": "pypi", - "url": "https://pypi.python.org/simple", - "verify_ssl": true - } - ] - }, - "default": { - "certifi": { - "hashes": [ - "sha256:b6e8b28b2b7e771a41ecdd12d4d43262ecab52adebbafa42c77d6b57fb6ad3a4", - "sha256:4c1d68a1408dd090d2f3a869aa94c3947cc1d967821d1ed303208c9f41f0f2f4" - ], - "version": "==2018.8.13" - }, - "chardet": { - "hashes": [ - "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691", - "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae" - ], - "version": "==3.0.4" - }, - "idna": { - "hashes": [ - "sha256:156a6814fb5ac1fc6850fb002e0852d56c0c8d2531923a51032d1b70760e186e", - "sha256:684a38a6f903c1d71d6d5fac066b58d7768af4de2b832e426ec79c30daa94a16" - ], - "version": "==2.7" - }, - "influxdb": { - "hashes": [ - "sha256:43b2fde195ee2302cfa87c8a0e1d29429f175ed584516d02e04f9b2c3c2ac2ad", - "sha256:6adba2ddfd5781a06b5204339e679d66645bf6cc2b7f493eb9d7c8986d714e80" - ], - "version": "==5.0.0" - }, - "ntplib": { - "hashes": [ - "sha256:c4621b64d50be9461d9bd9a71ba0b4af06fbbf818bbd483752d95c1a4e273ede" - ], - "version": "==0.3.3" - }, - "numpy": { - "hashes": [ - "sha256:428cd3c0b197cf857671353d8c85833193921af9fafcc169a1f29c7185833d50", - "sha256:a476e437d73e5754aa66e1e75840d0163119c3911b7361f4cd06985212a3c3fb", - "sha256:289ff717138cd9aa133adcbd3c3e284458b9c8230db4d42b39083a3407370317", - "sha256:c5eccb4bf96dbb2436c61bb3c2658139e779679b6ae0d04c5e268e6608b58053", - "sha256:75471acf298d455b035226cc609a92aee42c4bb6aa71def85f77fa2c2b646b61", - "sha256:5c54fb98ecf42da59ed93736d1c071842482b18657eb16ba6e466bd873e1b923", - "sha256:9ddf384ac3aacb72e122a8207775cc29727cbd9c531ee1a4b95754f24f42f7f3", - "sha256:781d3197da49c421a07f250750de70a52c42af08ca02a2f7bdb571c0625ae7eb", - "sha256:93b26d6c06a22e64d56aaca32aaaffd27a4143db0ac2f21a048f0b571f2bfc55", - "sha256:b2547f57d05ba59df4289493254f29f4c9082d255f1f97b7e286f40f453e33a1", - "sha256:eef6af1c752eef538a96018ef9bdf8e37bbf28aab50a1436501a4aa47a6467df", - "sha256:ff8a4b2c3ac831964f529a2da506c28d002562b230261ae5c16885f5f53d2e75", - "sha256:194074058c22a4066e1b6a4ea432486ee468d24ab16f13630c1030409e6b8666", - "sha256:4e13f1a848fde960dea33702770265837c72b796a6a3eaac7528cfe75ddefadd", - "sha256:91101216d72749df63968d86611b549438fb18af2c63849c01f9a897516133c7", - "sha256:97507349abb7d1f6b76b877258defe8720833881dc7e7fd052bac90c88587387", - "sha256:1479b46b6040b5c689831496354c8859c456b152d37315673a0c18720b41223b", - "sha256:98b1ac79c160e36093d7914244e40ee1e7164223e795aa2c71dcce367554e646", - "sha256:24bbec9a199f938eab75de8390f410969bc33c218e5430fa1ae9401b00865255", - "sha256:7880f412543e96548374a4bb1d75e4cdb8cad80f3a101ed0f8d0e0428f719c1c", - "sha256:6112f152b76a28c450bbf665da11757078a724a90330112f5b7ea2d6b6cefd67", - "sha256:7c5276763646480143d5f3a6c2acb2885460c765051a1baf4d5070f63d05010f", - "sha256:3de643935b212307b420248018323a44ec51987a336d1d747c1322afc3c099fb" - ], - "version": "==1.14.0" - }, - "pyserial": { - "hashes": [ - "sha256:e0770fadba80c31013896c7e6ef703f72e7834965954a78e71a3049488d4d7d8", - "sha256:6e2d401fdee0eab996cf734e67773a0143b932772ca8b42451440cfed942c627" - ], - "version": "==3.4" - }, - "python-dateutil": { - "hashes": [ - "sha256:1adb80e7a782c12e52ef9a8182bebeb73f1d7e24e374397af06fb4956c8dc5c0", - "sha256:e27001de32f627c22380a688bcc43ce83504a7bc5da472209b4c70f02829f0b8" - ], - "version": "==2.7.3" - }, - "pytz": { - "hashes": [ - "sha256:a061aa0a9e06881eb8b3b2b43f05b9439d6583c206d0a6c340ff72a7b6669053", - "sha256:ffb9ef1de172603304d9d2819af6f5ece76f2e85ec10692a524dd876e72bf277" - ], - "version": "==2018.5" - }, - "requests": { - "hashes": [ - "sha256:63b52e3c866428a224f97cab011de738c36aec0185aa91cfacd418b5d58911d1", - "sha256:ec22d826a36ed72a7358ff3fe56cbd4ba69dd7a6718ffd450ff0e9df7a47ce6a" - ], - "version": "==2.19.1" - }, - "six": { - "hashes": [ - "sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb", - "sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9" - ], - "version": "==1.11.0" - }, - "urllib3": { - "hashes": [ - "sha256:b5725a0bd4ba422ab0e66e89e030c806576753ea3ee08554382c14e685d117b5", - "sha256:a68ac5e15e76e7e5dd2b8f94007233e01effe3e50e8daddf69acfd81cb686baf" - ], - "version": "==1.23" - } - }, - "develop": { - "alabaster": { - "hashes": [ - "sha256:674bb3bab080f598371f4443c5008cbfeb1a5e622dd312395d2d82af2c54c456", - "sha256:b63b1f4dc77c074d386752ec4a8a7517600f6c0db8cd42980cae17ab7b3275d7" - ], - "version": "==0.7.11" - }, - "babel": { - "hashes": [ - "sha256:6778d85147d5d85345c14a26aada5e478ab04e39b078b0745ee6870c2b5cf669", - "sha256:8cba50f48c529ca3fa18cf81fa9403be176d374ac4d60738b839122dfaaa3d23" - ], - "version": "==2.6.0" - }, - "certifi": { - "hashes": [ - "sha256:b6e8b28b2b7e771a41ecdd12d4d43262ecab52adebbafa42c77d6b57fb6ad3a4", - "sha256:4c1d68a1408dd090d2f3a869aa94c3947cc1d967821d1ed303208c9f41f0f2f4" - ], - "version": "==2018.8.13" - }, - "chardet": { - "hashes": [ - "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691", - "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae" - ], - "version": "==3.0.4" - }, - "docutils": { - "hashes": [ - "sha256:7a4bd47eaf6596e1295ecb11361139febe29b084a87bf005bf899f9a42edc3c6", - "sha256:02aec4bd92ab067f6ff27a38a38a41173bf01bed8f89157768c1573f53e474a6", - "sha256:51e64ef2ebfb29cae1faa133b3710143496eca21c530f3f71424d77687764274" - ], - "version": "==0.14" - }, - "idna": { - "hashes": [ - "sha256:156a6814fb5ac1fc6850fb002e0852d56c0c8d2531923a51032d1b70760e186e", - "sha256:684a38a6f903c1d71d6d5fac066b58d7768af4de2b832e426ec79c30daa94a16" - ], - "version": "==2.7" - }, - "imagesize": { - "hashes": [ - "sha256:3620cc0cadba3f7475f9940d22431fc4d407269f1be59ec9b8edcca26440cf18", - "sha256:5b326e4678b6925158ccc66a9fa3122b6106d7c876ee32d7de6ce59385b96315" - ], - "version": "==1.0.0" - }, - "jinja2": { - "hashes": [ - "sha256:74c935a1b8bb9a3947c50a54766a969d4846290e1e788ea44c1392163723c3bd", - "sha256:f84be1bb0040caca4cea721fcbbbbd61f9be9464ca236387158b0feea01914a4" - ], - "version": "==2.10" - }, - "markupsafe": { - "hashes": [ - "sha256:a6be69091dac236ea9c6bc7d012beab42010fa914c459791d627dad4910eb665" - ], - "version": "==1.0" - }, - "packaging": { - "hashes": [ - "sha256:e9215d2d2535d3ae866c3d6efc77d5b24a0192cce0ff20e42896cc0664f889c0", - "sha256:f019b770dd64e585a99714f1fd5e01c7a8f11b45635aa953fd41c689a657375b" - ], - "version": "==17.1" - }, - "pygments": { - "hashes": [ - "sha256:78f3f434bcc5d6ee09020f92ba487f95ba50f1e3ef83ae96b9d5ffa1bab25c5d", - "sha256:dbae1046def0efb574852fab9e90209b23f556367b5a320c0bcb871c77c3e8cc" - ], - "version": "==2.2.0" - }, - "pyparsing": { - "hashes": [ - "sha256:fee43f17a9c4087e7ed1605bd6df994c6173c1e977d7ade7b651292fab2bd010", - "sha256:0832bcf47acd283788593e7a0f542407bd9550a55a8a8435214a1960e04bcb04", - "sha256:9e8143a3e15c13713506886badd96ca4b579a87fbdf49e550dbfc057d6cb218e", - "sha256:281683241b25fe9b80ec9d66017485f6deff1af5cde372469134b56ca8447a07", - "sha256:b8b3117ed9bdf45e14dcc89345ce638ec7e0e29b2b579fa1ecf32ce45ebac8a5", - "sha256:8f1e18d3fd36c6795bb7e02a39fd05c611ffc2596c1e0d995d34d67630426c18", - "sha256:e4d45427c6e20a59bf4f88c639dcc03ce30d193112047f94012102f235853a58" - ], - "version": "==2.2.0" - }, - "pytz": { - "hashes": [ - "sha256:a061aa0a9e06881eb8b3b2b43f05b9439d6583c206d0a6c340ff72a7b6669053", - "sha256:ffb9ef1de172603304d9d2819af6f5ece76f2e85ec10692a524dd876e72bf277" - ], - "version": "==2018.5" - }, - "requests": { - "hashes": [ - "sha256:63b52e3c866428a224f97cab011de738c36aec0185aa91cfacd418b5d58911d1", - "sha256:ec22d826a36ed72a7358ff3fe56cbd4ba69dd7a6718ffd450ff0e9df7a47ce6a" - ], - "version": "==2.19.1" - }, - "six": { - "hashes": [ - "sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb", - "sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9" - ], - "version": "==1.11.0" - }, - "snowballstemmer": { - "hashes": [ - "sha256:9f3bcd3c401c3e862ec0ebe6d2c069ebc012ce142cce209c098ccb5b09136e89", - "sha256:919f26a68b2c17a7634da993d91339e288964f93c274f1343e3bbbe2096e1128" - ], - "version": "==1.2.1" - }, - "sphinx": { - "hashes": [ - "sha256:a0b16810d1d1413dec006ce2b08b5c895b2aaa7dce18d579d3ef79c03d461b22", - "sha256:278b7923f3f4ed2a1d1359f0ae94d89ac90ddd4189e8362f4b4d3baa2afe6b4a" - ], - "version": "==1.7.0" - }, - "sphinxcontrib-websupport": { - "hashes": [ - "sha256:68ca7ff70785cbe1e7bccc71a48b5b6d965d79ca50629606c7861a21b206d9dd", - "sha256:9de47f375baf1ea07cdb3436ff39d7a9c76042c10a769c52353ec46e4e8fc3b9" - ], - "version": "==1.1.0" - }, - "urllib3": { - "hashes": [ - "sha256:b5725a0bd4ba422ab0e66e89e030c806576753ea3ee08554382c14e685d117b5", - "sha256:a68ac5e15e76e7e5dd2b8f94007233e01effe3e50e8daddf69acfd81cb686baf" - ], - "version": "==1.23" - } - } -} diff --git a/ardas/raspardas.py b/ardas/raspardas.py index b8e4848..c1383bc 100644 --- a/ardas/raspardas.py +++ b/ardas/raspardas.py @@ -168,7 +168,7 @@ def init_logging(): msg_logger.error('Unable to read restart_msg.txt: %s' % e) influxdb_log_event(influxdb_client=client, title=title, default_tags='net_id: ' + ARDAS_CONFIG['net_id'] + ',' + 'shield_id: ' + - ARDAS_CONFIG['shield_id'] + ',' + 'start', + ARDAS_CONFIG['shield_id'] + ',' + 'start', event_args=text, msg_logger=msg_logger) except Exception as e: msg_logger.error('*** Unable to log to database %s: %s' % (DATABASE['dbname'], e)) @@ -413,7 +413,7 @@ def listen_master(): msg_logger.info('%s: %s' %(title, event_args)) influxdb_log_event(influxdb_client=client, title=title, default_tags='net_id: ' + ARDAS_CONFIG['net_id'] + ',' + 'shield_id: ' + - ARDAS_CONFIG['shield_id'] + ',' + 'resume', + ARDAS_CONFIG['shield_id'] + ',' + 'resume', event_args=event_args, msg_logger=msg_logger) else: title = 'Paused by user' @@ -506,35 +506,49 @@ def talk_master(): def start_sequence(): - global master_queue, slave_queue, n_channels, msg_logger, starting + global master_queue, slave_queue, n_channels, msg_logger, starting, stop msg_logger.debug('Initiating start sequence...') msg_logger.debug('____________________________') msg_logger.debug('start_sequence : Wake up slave...') - if debug: - reply = False - while not reply: - msg = b'-999\r\n' # FIX: Should be \r - master_queue.put(msg) - msg_logger.debug('start_sequence : Calling all ArDAS') - k = 10 - sleep(0.75) - while k > 0 and not reply: - try: - msg = slave_queue.get(timeout=0.25) - msg_logger.debug('received reply: %s' %msg.decode('ascii', errors='ignore')) - if msg != b'': - if b'Hey!' in msg: - msg_logger.debug('start_sequence : Reply received!') - reply = True + reply = False + greeting = b"Hey! I'm ArdDAS" + while not reply: + msg = b'-999\r\n' # FIX: Should be \r + master_queue.put(msg) + msg_logger.debug('start_sequence : Calling all ArDAS') + k = 10 + sleep(0.75) + msg = b'' + while k > 0 and not reply: + try: + msg += slave_queue.get(timeout=0.5) + msg_logger.debug('received reply: %s' % msg.decode('ascii', errors='ignore')) + if msg != b'': + if (greeting in msg) and (len(msg) >= msg.find(greeting) + 19): + greeting_start = msg.find(greeting) + net_id_from_eeprom = msg[greeting_start + 16:greeting_start + 19].decode('ascii', + errors='ignore') + if net_id_from_eeprom == ARDAS_CONFIG['net_id']: + msg_logger.debug('start_sequence : Reply received from {}'.format(net_id_from_eeprom)) else: - msg_logger.debug('start_sequence : No proper reply received yet...') + msg_logger.error('start_sequence : net_id mismatch between settings {0} and ' + 'EEPROM {1}'.format(ARDAS_CONFIG['net_id'], net_id_from_eeprom)) + msg_logger.debug('Start sequence aborted...') + msg_logger.debug('___________________________') + stop = True + return 1 + reply = True + else: - msg_logger.debug('start_sequence : No message received yet...') - except queue.Empty: - msg_logger.debug('start_sequence : Timed out...') - sleep(0.25) - k -= 1 + msg_logger.debug('start_sequence : No proper reply received yet...') + else: + msg_logger.debug('start_sequence : No message received yet...') + except queue.Empty: + msg_logger.debug('start_sequence : Timed out...') + sleep(0.25) + k -= 1 + reply = False while not reply: msg = b'-' + bytes(ARDAS_CONFIG['net_id'].encode('ascii')) + b'\r\n' # FIX: Should be \r @@ -556,7 +570,10 @@ def start_sequence(): msg_logger.debug('start_sequence : No proper reply received yet...') sleep(0.25) k -= 1 - + if not reply: + msg_logger.info('start_sequence : calling ardas {0} without response yet. Please check that your net_id ' + 'parameter in your settings file corresponds to EEPROM ned_id !' + .format(ARDAS_CONFIG['net_id'])) reply = False while not reply: msg = b'#ZR ' @@ -628,6 +645,7 @@ def start_sequence(): msg_logger.debug('Start sequence completed...') msg_logger.debug('___________________________') starting = False + return 0 if __name__ == '__main__': @@ -651,33 +669,37 @@ def start_sequence(): slave_listener.start() msg_logger.info('Configuring ArDAS...') - start_sequence() - msg_logger.info('ArDAS configured !') - - master_connector = Thread(target=connect_master) - master_connector.setDaemon(True) - master_connector.start() - master_talker = Thread(target=talk_master) - master_talker.setDaemon(True) - master_talker.start() - master_listener = Thread(target=listen_master) - master_listener.setDaemon(True) - master_listener.start() - influxdb_log_event(influxdb_client=client, title='Resume logging', - default_tags='net_id: ' + ARDAS_CONFIG['net_id'] + ',' + 'shield_id: ' + - ARDAS_CONFIG['shield_id'] + ',' + 'resume', - event_args='reconfiguration complete', msg_logger=msg_logger) - pause = False - msg_logger.info('*** Starting logging... ***') + status_start_sequence = start_sequence() + if status_start_sequence != 0: + msg_logger.info('Configuration aborted !') + else: + msg_logger.info('ArDAS configured !') + + master_connector = Thread(target=connect_master) + master_connector.setDaemon(True) + master_connector.start() + master_talker = Thread(target=talk_master) + master_talker.setDaemon(True) + master_talker.start() + master_listener = Thread(target=listen_master) + master_listener.setDaemon(True) + master_listener.start() + influxdb_log_event(influxdb_client=client, title='Resume logging', + default_tags='net_id: ' + ARDAS_CONFIG['net_id'] + ',' + 'shield_id: ' + + ARDAS_CONFIG['shield_id'] + ',' + 'resume', + event_args='reconfiguration complete', msg_logger=msg_logger) + pause = False + msg_logger.info('*** Starting logging... ***') while not stop: sleep(1) msg_logger.info('Exiting - Waiting for threads to end...') slave_listener.join() - master_talker.join() - master_listener.join() - master_connector.join() + if status_start_sequence == 0: + master_talker.join() + master_listener.join() + master_connector.join() slave_talker.join() finally: diff --git a/ardas/uncalibrated_sensors_generator.py b/ardas/uncalibrated_sensors_generator.py new file mode 100644 index 0000000..0e650cf --- /dev/null +++ b/ardas/uncalibrated_sensors_generator.py @@ -0,0 +1,12 @@ +from ardas import sensor_tools as st +# Saves a set of sensors including its calibration in a binary '.ssr' file +sensors = (st.FMSensor(sensor_id='0001', log_output=True), + st.UncalibratedFMSensor(sensor_id='0002', log_output=True), + st.UncalibratedFMSensor(sensor_id='0003', log_output=True), + st.UncalibratedFMSensor(sensor_id='0004', log_output=True), + ) + +if __name__ == '__main__': + for s in sensors: + print(s.sensor_id + ' - ' + s.quantity + ' : ' + s.output_repr(10000)) + s.save() \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 9dbdf94..108a850 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,6 +7,6 @@ numpy==1.14.0 pyserial==3.4 python-dateutil==2.7.3 pytz==2018.5 -requests==2.19.1 +requests==2.20.0 six==1.11.0 urllib3==1.23