commit f5582d88c377b8d6180571d041aba2a5670f9efb Author: eKa Date: Tue Aug 27 14:47:10 2019 +0500 Наработки за 5 лет diff --git a/.csync_journal.db b/.csync_journal.db new file mode 100644 index 0000000..9587abd Binary files /dev/null and b/.csync_journal.db differ diff --git a/.csync_journal.db-shm b/.csync_journal.db-shm new file mode 100644 index 0000000..fe9ac28 Binary files /dev/null and b/.csync_journal.db-shm differ diff --git a/.csync_journal.db-wal b/.csync_journal.db-wal new file mode 100644 index 0000000..e69de29 diff --git a/.owncloudsync.log b/.owncloudsync.log new file mode 100644 index 0000000..9a0af55 --- /dev/null +++ b/.owncloudsync.log @@ -0,0 +1,1650 @@ +# timestamp | duration | file | instruction | dir | modtime | etag | size | fileId | status | errorString | http result code | other size | other modtime | other etag | other fileId | other instruction +#=#=#=# Syncrun started 2018-05-28T08:46:48 until 2018-05-28T08:51:49 (301524 msec) +#=#=#=# Syncrun started 2018-05-28T08:52:47 until 2018-05-28T08:58:28 (341041 msec) +#=#=#=# Syncrun started 2018-05-28T08:59:17 until 2018-05-28T09:02:13 (175880 msec) +#=#=#=# Syncrun started 2018-05-28T10:49:14 until 2018-05-28T10:49:38 (23608 msec) +|0|HXbot|INST_SYNC|Up|1496227388||4096||4||0|0|1518377692|5a809add3b396|00965020oca7e705dcb1|INST_NONE| +05:49:18|19234|HXbot/HXbot.py|INST_SYNC|Up|1527486552||18569||4||204|18569|1518374047|2c3dcc6dcceeb05047abd9cdba53d179|00965022oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-05-28T22:06:06 until 2018-05-28T22:06:11 (4563 msec) +#=#=#=# Syncrun started 2018-05-28T22:54:09 until 2018-05-28T22:54:37 (27364 msec) +|0|HXbot|INST_SYNC|Up|1496227388||4096||4||0|0|1527486576|5b0b9870916e8|00965020oca7e705dcb1|INST_NONE| +17:54:14|21110|HXbot/HXdb.py|INST_SYNC|Up|1527530047||4638||4||204|4638|1496228685|c443708cc2e58415725d345e0280e82a|01031131oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__|INST_SYNC|Up|1527530048||4096||4||0|0|1518377692|5a809add3b396|00965228oca7e705dcb1|INST_NONE| +17:54:15|21924|HXbot/__pycache__/HXdb.cpython-35.pyc|INST_SYNC|Up|1527530048||3815||4||204|3820|1496228685|1d5cce8edbae2bb9151e59ce751556f3|01031178oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-05-28T22:55:25 until 2018-05-28T22:55:29 (3832 msec) +#=#=#=# Syncrun started 2018-05-28T22:57:04 until 2018-05-28T22:57:27 (22980 msec) +|0|HXbot|INST_SYNC|Up|1496227388||4096||4||0|0|1527530073|5b0c425a0a44d|00965020oca7e705dcb1|INST_NONE| +17:57:08|18566|HXbot/HXdb.py|INST_SYNC|Up|1527530222||4638||4||204|4638|1527530047|258a4cf4c48d3ac8df51b9838a9e97fa|01031131oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__|INST_SYNC|Up|1527530223||4096||4||0|0|1527530073|5b0c425a0a44d|00965228oca7e705dcb1|INST_NONE| +17:57:09|18171|HXbot/__pycache__/HXdb.cpython-35.pyc|INST_SYNC|Up|1527530223||3815||4||204|3815|1527530048|a597afc96297e0b3adee095dc95923a3|01031178oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-05-28T22:58:25 until 2018-05-28T22:58:29 (4451 msec) +#=#=#=# Syncrun started 2018-05-29T06:41:02 until 2018-05-29T06:41:06 (4305 msec) +#=#=#=# Syncrun started 2018-05-29T07:11:45 until 2018-05-29T07:11:49 (3967 msec) +#=#=#=# Syncrun started 2018-05-29T08:53:53 until 2018-05-29T08:54:19 (25516 msec) +|0|HXpower3|INST_SYNC|Up|1527566031||4096||4||0|0|1518124035|5a7cbc049667f|01631642oca7e705dcb1|INST_NONE| +03:53:57|21585|HXpower3/HXpower3.ino|INST_SYNC|Up|1527566031||18846||4||204|18673|1517940900|d9bc9e3636b24d9a265c9bde045d2be7|01631643oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-05-29T08:54:28 until 2018-05-29T08:54:50 (21607 msec) +03:54:32|17320|HXpower3/HXpower3.ino|INST_SYNC|Up|1527566067||18833||4||204|18846|1527566031|6b29c2fea2ba4726672877f32437b685|01631643oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-05-29T08:55:42 until 2018-05-29T08:55:46 (4119 msec) +#=#=#=# Syncrun started 2018-05-29T08:56:59 until 2018-05-29T08:58:17 (78198 msec) +|0|HXpower3|INST_SYNC|Up|1527566217||4096||4||0|0|1527566088|5b0ccf096fd23|01631642oca7e705dcb1|INST_NONE| +|0|HXpower3/HXpower3.ino|INST_SYNC|Up|1527566217||18839||3|Operation canceled|0|18833|1527566067|974a18ef6b82be04272918aaf94989a6|01631643oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-05-29T22:38:27 until 2018-05-29T22:38:31 (4559 msec) +#=#=#=# Syncrun started 2018-05-29T22:39:16 until 2018-05-29T22:39:42 (26138 msec) +|0|HXbot|INST_SYNC|Up|1496227388||4096||4||0|0|1527530245|5b0c43063a200|00965020oca7e705dcb1|INST_NONE| +17:39:20|21879|HXbot/HXbot.py|INST_SYNC|Up|1527615554||18569||4||204|18569|1527486552|f3f7f93ea6990fd880240870f9ef92f6|00965022oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-05-29T22:40:42 until 2018-05-29T22:40:46 (3927 msec) +#=#=#=# Syncrun started 2018-05-29T23:38:42 until 2018-05-29T23:38:45 (3452 msec) +#=#=#=# Syncrun started 2018-05-30T01:39:12 until 2018-05-30T01:39:16 (3529 msec) +#=#=#=# Syncrun started 2018-05-30T03:39:42 until 2018-05-30T03:39:46 (3473 msec) +#=#=#=# Syncrun started 2018-05-30T05:40:12 until 2018-05-30T05:40:16 (3490 msec) +#=#=#=# Syncrun started 2018-05-30T07:40:42 until 2018-05-30T07:40:46 (3498 msec) +#=#=#=# Syncrun started 2018-05-30T08:31:05 until 2018-05-30T08:31:29 (23834 msec) +|0|HXpower3|INST_SYNC|Up|1527651063||4096||4||0|0|1527566239|5b0ccf9fbc38e|01631642oca7e705dcb1|INST_NONE| +03:31:10|19203|HXpower3/HXpower3.ino|INST_SYNC|Up|1527651063||18950||4||204|18839|1527566217|2dd9426714398d37cfa71717f2e7f941|01631643oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-05-30T08:32:12 until 2018-05-30T08:32:17 (4254 msec) +#=#=#=# Syncrun started 2018-05-30T10:09:03 until 2018-05-30T10:09:23 (20208 msec) +|0|trash|INST_SYNC|Up|1527656941||4096||4||0|0|1464968735|5751a61fe3990|00965024oca7e705dcb1|INST_NONE| +05:09:06|16315|trash/python3-smbus_3.1.2-3_armhf.deb|INST_NEW|Up|1527656941||9716||4||201|0|0|||INST_NONE| +#=#=#=# Syncrun started 2018-05-30T10:09:30 until 2018-05-30T10:09:50 (20003 msec) +|0|HXbot|INST_SYNC|Up|1496227388||4096||4||0|0|1527615579|5b0d905bcd5ae|00965020oca7e705dcb1|INST_NONE| +05:09:35|15424|HXbot/HXbot.py|INST_SYNC|Up|1527656952||18569||4||204|18569|1527615554|d548c7b2cbfa23edcc2ceea5d5e546d1|00965022oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-05-30T10:10:42 until 2018-05-30T10:10:46 (3926 msec) +#=#=#=# Syncrun started 2018-05-30T12:11:12 until 2018-05-30T12:11:16 (3810 msec) +#=#=#=# Syncrun started 2018-05-30T14:11:42 until 2018-05-30T14:11:46 (3590 msec) +#=#=#=# Syncrun started 2018-05-30T16:12:12 until 2018-05-30T16:12:16 (3645 msec) +#=#=#=# Syncrun started 2018-05-30T18:12:42 until 2018-05-30T18:12:46 (3804 msec) +#=#=#=# Syncrun started 2018-05-30T20:13:12 until 2018-05-30T20:13:16 (3729 msec) +#=#=#=# Syncrun started 2018-05-30T22:18:42 until 2018-05-30T22:18:46 (3596 msec) +#=#=#=# Syncrun started 2018-05-30T22:52:13 until 2018-05-30T22:52:37 (24396 msec) +|0|HXbot|INST_SYNC|Up|1496227388||4096||4||0|0|1527656989|5b0e321de30b0|00965020oca7e705dcb1|INST_NONE| +17:52:17|20183|HXbot/HXbot.py|INST_SYNC|Up|1527702731||18569||4||204|18569|1527656952|30e3c3c70249fd89d0255b4b2507a56d|00965022oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-05-30T22:53:12 until 2018-05-30T22:53:16 (3811 msec) +#=#=#=# Syncrun started 2018-05-31T00:53:42 until 2018-05-31T00:53:46 (3947 msec) +#=#=#=# Syncrun started 2018-05-31T02:54:12 until 2018-05-31T02:54:16 (3702 msec) +#=#=#=# Syncrun started 2018-05-31T04:54:42 until 2018-05-31T04:54:46 (3810 msec) +#=#=#=# Syncrun started 2018-05-31T06:55:12 until 2018-05-31T06:55:16 (3754 msec) +#=#=#=# Syncrun started 2018-05-31T08:55:42 until 2018-05-31T08:55:46 (3797 msec) +#=#=#=# Syncrun started 2018-05-31T10:56:12 until 2018-05-31T10:56:16 (3783 msec) +#=#=#=# Syncrun started 2018-05-31T12:56:42 until 2018-05-31T12:56:46 (3738 msec) +#=#=#=# Syncrun started 2018-05-31T14:57:12 until 2018-05-31T14:57:16 (3733 msec) +#=#=#=# Syncrun started 2018-05-31T16:41:06 until 2018-05-31T16:41:09 (3663 msec) +#=#=#=# Syncrun started 2018-05-31T18:41:12 until 2018-05-31T18:41:16 (3862 msec) +#=#=#=# Syncrun started 2018-05-31T20:41:42 until 2018-05-31T20:41:46 (3750 msec) +#=#=#=# Syncrun started 2018-05-31T22:42:12 until 2018-05-31T22:42:16 (3746 msec) +#=#=#=# Syncrun started 2018-06-01T00:42:42 until 2018-06-01T00:42:46 (3834 msec) +#=#=#=# Syncrun started 2018-06-01T02:09:38 until 2018-06-01T02:09:42 (3782 msec) +#=#=#=# Syncrun started 2018-06-01T04:10:12 until 2018-06-01T04:10:16 (3805 msec) +#=#=#=# Syncrun started 2018-06-01T06:10:42 until 2018-06-01T06:10:46 (3791 msec) +#=#=#=# Syncrun started 2018-06-01T08:11:12 until 2018-06-01T08:11:16 (3828 msec) +#=#=#=# Syncrun started 2018-06-01T10:11:42 until 2018-06-01T10:11:46 (3976 msec) +#=#=#=# Syncrun started 2018-06-01T12:12:12 until 2018-06-01T12:12:16 (3834 msec) +#=#=#=# Syncrun started 2018-06-01T14:12:42 until 2018-06-01T14:12:46 (3733 msec) +#=#=#=# Syncrun started 2018-06-01T16:13:12 until 2018-06-01T16:13:16 (3753 msec) +#=#=#=# Syncrun started 2018-06-01T18:13:42 until 2018-06-01T18:13:46 (3763 msec) +#=#=#=# Syncrun started 2018-06-01T20:14:12 until 2018-06-01T20:14:16 (3732 msec) +#=#=#=# Syncrun started 2018-06-01T22:14:42 until 2018-06-01T22:14:46 (3825 msec) +#=#=#=# Syncrun started 2018-06-01T23:44:02 until 2018-06-01T23:44:05 (3689 msec) +#=#=#=# Syncrun started 2018-06-02T01:49:12 until 2018-06-02T01:49:16 (3695 msec) +#=#=#=# Syncrun started 2018-06-02T03:49:42 until 2018-06-02T03:49:46 (3698 msec) +#=#=#=# Syncrun started 2018-06-02T05:50:12 until 2018-06-02T05:50:16 (3770 msec) +#=#=#=# Syncrun started 2018-06-02T07:50:42 until 2018-06-02T07:50:46 (3700 msec) +#=#=#=# Syncrun started 2018-06-02T09:51:12 until 2018-06-02T09:51:16 (3689 msec) +#=#=#=# Syncrun started 2018-06-02T11:51:42 until 2018-06-02T11:51:46 (3748 msec) +#=#=#=# Syncrun started 2018-06-02T13:52:12 until 2018-06-02T13:52:16 (3758 msec) +#=#=#=# Syncrun started 2018-06-02T15:52:42 until 2018-06-02T15:52:46 (3674 msec) +#=#=#=# Syncrun started 2018-06-02T17:53:12 until 2018-06-02T17:53:16 (3723 msec) +#=#=#=# Syncrun started 2018-06-02T19:58:42 until 2018-06-02T19:58:46 (3799 msec) +#=#=#=# Syncrun started 2018-06-02T21:59:12 until 2018-06-02T21:59:16 (3756 msec) +#=#=#=# Syncrun started 2018-06-02T23:59:42 until 2018-06-02T23:59:46 (3780 msec) +#=#=#=# Syncrun started 2018-06-03T02:00:12 until 2018-06-03T02:00:16 (3772 msec) +#=#=#=# Syncrun started 2018-06-03T03:26:30 until 2018-06-03T03:26:33 (3661 msec) +#=#=#=# Syncrun started 2018-06-03T05:26:42 until 2018-06-03T05:26:46 (3705 msec) +#=#=#=# Syncrun started 2018-06-03T06:33:06 until 2018-06-03T06:33:09 (3632 msec) +#=#=#=# Syncrun started 2018-06-03T08:33:12 until 2018-06-03T08:33:16 (3802 msec) +#=#=#=# Syncrun started 2018-06-03T08:44:18 until 2018-06-03T08:44:21 (3660 msec) +#=#=#=# Syncrun started 2018-06-03T09:51:30 until 2018-06-03T09:51:33 (3667 msec) +#=#=#=# Syncrun started 2018-06-03T10:11:14 until 2018-06-03T10:11:17 (3606 msec) +#=#=#=# Syncrun started 2018-06-03T10:36:26 until 2018-06-03T10:36:30 (3834 msec) +#=#=#=# Syncrun started 2018-06-03T10:43:46 until 2018-06-03T10:43:51 (4585 msec) +#=#=#=# Syncrun started 2018-06-03T10:55:30 until 2018-06-03T10:55:34 (3838 msec) +#=#=#=# Syncrun started 2018-06-03T10:57:06 until 2018-06-03T10:57:10 (4406 msec) +#=#=#=# Syncrun started 2018-06-03T11:06:42 until 2018-06-03T11:06:58 (16631 msec) +#=#=#=# Syncrun started 2018-06-03T11:17:23 until 2018-06-03T11:17:27 (3673 msec) +#=#=#=# Syncrun started 2018-06-03T11:19:15 until 2018-06-03T11:19:19 (3702 msec) +#=#=#=# Syncrun started 2018-06-03T11:32:21 until 2018-06-03T11:32:25 (3856 msec) +#=#=#=# Syncrun started 2018-06-03T11:38:27 until 2018-06-03T11:38:31 (4606 msec) +#=#=#=# Syncrun started 2018-06-03T11:54:14 until 2018-06-03T11:54:17 (3659 msec) +#=#=#=# Syncrun started 2018-06-03T11:55:46 until 2018-06-03T11:55:49 (3671 msec) +#=#=#=# Syncrun started 2018-06-03T12:03:19 until 2018-06-03T12:03:23 (3688 msec) +#=#=#=# Syncrun started 2018-06-03T12:07:06 until 2018-06-03T12:07:10 (3903 msec) +#=#=#=# Syncrun started 2018-06-03T12:17:53 until 2018-06-03T12:17:57 (4089 msec) +#=#=#=# Syncrun started 2018-06-03T12:24:39 until 2018-06-03T12:24:42 (3705 msec) +#=#=#=# Syncrun started 2018-06-03T12:26:57 until 2018-06-03T12:27:01 (4302 msec) +#=#=#=# Syncrun started 2018-06-03T12:30:06 until 2018-06-03T12:30:10 (3699 msec) +#=#=#=# Syncrun started 2018-06-03T12:52:00 until 2018-06-03T12:52:04 (3738 msec) +#=#=#=# Syncrun started 2018-06-03T12:54:28 until 2018-06-03T12:54:32 (3697 msec) +#=#=#=# Syncrun started 2018-06-03T13:01:54 until 2018-06-03T13:01:59 (4997 msec) +#=#=#=# Syncrun started 2018-06-03T13:04:40 until 2018-06-03T13:04:43 (3683 msec) +#=#=#=# Syncrun started 2018-06-03T13:09:38 until 2018-06-03T13:11:22 (104545 msec) +#=#=#=# Syncrun started 2018-06-03T13:11:38 until 2018-06-03T13:13:30 (111823 msec) +#=#=#=# Syncrun started 2018-06-03T13:14:24 until 2018-06-03T13:14:27 (3658 msec) +#=#=#=# Syncrun started 2018-06-03T13:23:16 until 2018-06-03T13:23:20 (4092 msec) +#=#=#=# Syncrun started 2018-06-03T13:24:50 until 2018-06-03T13:24:53 (3651 msec) +#=#=#=# Syncrun started 2018-06-03T13:27:30 until 2018-06-03T13:27:33 (3649 msec) +#=#=#=# Syncrun started 2018-06-03T13:34:58 until 2018-06-03T13:35:02 (3804 msec) +#=#=#=# Syncrun started 2018-06-03T13:41:22 until 2018-06-03T13:46:24 (302603 msec) +#=#=#=# Syncrun started 2018-06-03T13:46:52 until 2018-06-03T13:47:10 (18242 msec) +#=#=#=# Syncrun started 2018-06-03T15:47:42 until 2018-06-03T15:47:46 (3698 msec) +#=#=#=# Syncrun started 2018-06-03T17:48:12 until 2018-06-03T17:48:16 (3725 msec) +#=#=#=# Syncrun started 2018-06-03T19:48:42 until 2018-06-03T19:48:46 (3767 msec) +#=#=#=# Syncrun started 2018-06-03T21:49:12 until 2018-06-03T21:49:16 (3731 msec) +#=#=#=# Syncrun started 2018-06-03T23:49:42 until 2018-06-03T23:49:46 (3722 msec) +#=#=#=# Syncrun started 2018-06-04T01:50:12 until 2018-06-04T01:50:16 (3745 msec) +#=#=#=# Syncrun started 2018-06-04T03:50:42 until 2018-06-04T03:50:46 (3792 msec) +#=#=#=# Syncrun started 2018-06-04T05:51:12 until 2018-06-04T05:51:16 (3666 msec) +#=#=#=# Syncrun started 2018-06-04T07:51:42 until 2018-06-04T07:51:46 (3786 msec) +#=#=#=# Syncrun started 2018-06-04T09:52:12 until 2018-06-04T09:52:16 (3707 msec) +#=#=#=# Syncrun started 2018-06-04T11:52:42 until 2018-06-04T11:52:46 (3767 msec) +#=#=#=# Syncrun started 2018-06-04T13:53:12 until 2018-06-04T13:53:16 (3702 msec) +#=#=#=# Syncrun started 2018-06-04T15:53:42 until 2018-06-04T15:53:46 (3744 msec) +#=#=#=# Syncrun started 2018-06-04T17:54:12 until 2018-06-04T17:54:16 (3738 msec) +#=#=#=# Syncrun started 2018-06-04T19:54:42 until 2018-06-04T19:54:46 (3779 msec) +#=#=#=# Syncrun started 2018-06-04T21:55:12 until 2018-06-04T21:55:16 (3641 msec) +#=#=#=# Syncrun started 2018-06-04T23:55:42 until 2018-06-04T23:55:46 (3694 msec) +#=#=#=# Syncrun started 2018-06-05T01:56:12 until 2018-06-05T01:56:16 (3792 msec) +#=#=#=# Syncrun started 2018-06-05T03:56:42 until 2018-06-05T03:56:46 (3729 msec) +#=#=#=# Syncrun started 2018-06-05T05:57:12 until 2018-06-05T05:57:16 (3771 msec) +#=#=#=# Syncrun started 2018-06-05T07:57:42 until 2018-06-05T07:57:46 (3723 msec) +#=#=#=# Syncrun started 2018-06-05T09:58:12 until 2018-06-05T09:58:16 (3768 msec) +#=#=#=# Syncrun started 2018-06-05T11:58:42 until 2018-06-05T11:58:46 (3762 msec) +#=#=#=# Syncrun started 2018-06-05T13:59:12 until 2018-06-05T13:59:16 (3731 msec) +#=#=#=# Syncrun started 2018-06-05T15:59:42 until 2018-06-05T15:59:46 (3774 msec) +#=#=#=# Syncrun started 2018-06-05T18:00:12 until 2018-06-05T18:00:16 (3760 msec) +#=#=#=# Syncrun started 2018-06-05T20:00:42 until 2018-06-05T20:00:46 (3817 msec) +#=#=#=# Syncrun started 2018-06-05T22:01:12 until 2018-06-05T22:01:16 (3724 msec) +#=#=#=# Syncrun started 2018-06-06T00:01:42 until 2018-06-06T00:01:46 (3741 msec) +#=#=#=# Syncrun started 2018-06-06T02:02:12 until 2018-06-06T02:02:16 (3734 msec) +#=#=#=# Syncrun started 2018-06-06T04:07:42 until 2018-06-06T04:07:46 (3693 msec) +#=#=#=# Syncrun started 2018-06-06T06:08:12 until 2018-06-06T06:08:16 (3735 msec) +#=#=#=# Syncrun started 2018-06-06T08:08:42 until 2018-06-06T08:08:46 (3736 msec) +#=#=#=# Syncrun started 2018-06-06T10:09:12 until 2018-06-06T10:09:16 (3719 msec) +#=#=#=# Syncrun started 2018-06-06T12:09:42 until 2018-06-06T12:09:46 (3730 msec) +#=#=#=# Syncrun started 2018-06-06T14:10:12 until 2018-06-06T14:10:16 (3801 msec) +#=#=#=# Syncrun started 2018-06-06T16:10:42 until 2018-06-06T16:10:46 (3804 msec) +#=#=#=# Syncrun started 2018-06-06T18:11:12 until 2018-06-06T18:11:16 (3731 msec) +#=#=#=# Syncrun started 2018-06-06T20:11:42 until 2018-06-06T20:11:46 (3623 msec) +#=#=#=# Syncrun started 2018-06-06T22:12:12 until 2018-06-06T22:12:16 (3743 msec) +#=#=#=# Syncrun started 2018-06-07T00:12:42 until 2018-06-07T00:12:46 (3802 msec) +#=#=#=# Syncrun started 2018-06-07T02:13:12 until 2018-06-07T02:13:16 (3779 msec) +#=#=#=# Syncrun started 2018-06-07T04:13:42 until 2018-06-07T04:13:46 (3710 msec) +#=#=#=# Syncrun started 2018-06-07T06:14:12 until 2018-06-07T06:14:16 (3860 msec) +#=#=#=# Syncrun started 2018-06-07T08:14:42 until 2018-06-07T08:14:46 (3695 msec) +#=#=#=# Syncrun started 2018-06-09T22:39:24 until 2018-06-09T22:39:53 (28695 msec) +|0|HXpower3|INST_SYNC|Up|1528565624||4096||4||0|0|1527651087|5b0e1b0f62266|01631642oca7e705dcb1|INST_NONE| +17:39:28|24093|HXpower3/HXpower3.ino|INST_SYNC|Up|1528565624||18986||4||204|18950|1527651063|51a9aa11a6b81ecfaeaced059502a1eb|01631643oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-06-09T22:40:46 until 2018-06-09T22:40:51 (4209 msec) +#=#=#=# Syncrun started 2018-06-09T22:45:28 until 2018-06-09T22:46:29 (60638 msec) +|0|HXbot|INST_SYNC|Up|1496227388||4096||4||0|0|1527702755|5b0ee4e3bbe03|00965020oca7e705dcb1|INST_NONE| +17:45:36|18217|HXbot/HX.py|INST_SYNC|Up|1528566326||6200||4||204|6189|1518374047|da4c72e6006d5d4f62fd810566c14525|00965225oca7e705dcb1|INST_NONE| +17:45:36|18091|HXbot/HXbot.py|INST_SYNC|Up|1528566326||18569||4||204|18569|1527702731|913d6455ce8f89afea36d8913ee1b6a5|00965022oca7e705dcb1|INST_NONE| +17:45:36|19343|HXbot/HXpower.py|INST_SYNC|Up|1528566327||15672||4||204|15671|1518374047|e11033c4b608d8c56d131b132149ea69|00969339oca7e705dcb1|INST_NONE| +17:45:54|19585|HXbot/HXserver.py|INST_SYNC|Up|1528566327||4081||4||204|4079|1518374047|e4210cbc350216411feb7af312d05556|00971890oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__|INST_SYNC|Up|1528566327||4096||4||0|0|1527530245|5b0c43062c8ab|00965228oca7e705dcb1|INST_NONE| +17:45:54|18495|HXbot/__pycache__/HX.cpython-35.pyc|INST_SYNC|Up|1528566327||5905||4||204|5905|1518374048|c5957f24f8eea3ccd401abd7256368e5|00986822oca7e705dcb1|INST_NONE| +17:45:55|19533|HXbot/__pycache__/HXpower.cpython-35.pyc|INST_SYNC|Up|1528566327||9639||4||204|9566|1518374048|da038033a1fbaded0d968f5778feaebd|00986824oca7e705dcb1|INST_NONE| +17:46:12|16230|HXbot/__pycache__/HXserver.cpython-35.pyc|INST_SYNC|Up|1528566327||3618||4||204|3597|1518374048|99cf3c2bae05c4eaf66433bf990be794|00986825oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-06-09T22:46:41 until 2018-06-09T22:46:46 (4478 msec) +|0|HXbot/HX.py|INST_SYNC|Up|1528566374||6200||1|Operation canceled|0|6200|1528566326|13a7a24f4b4a173636f39d6740e5f956|00965225oca7e705dcb1|INST_NONE| +|0|HXbot/HXbot.py|INST_SYNC|Up|1528566375||18569||1|Connection closed|0|18569|1528566326|7eefba0940574eed5e4908d33ca11624|00965022oca7e705dcb1|INST_NONE| +|0|HXbot/HXpower.py|INST_SYNC|Up|1528566375||15672||1|Operation canceled|0|15672|1528566327|7639fd0e00728397041f5e19fe42d177|00969339oca7e705dcb1|INST_NONE| +|0|HXbot/HXserver.py|INST_SYNC|Up|1528566375||4081||0||0|4081|1528566327|5937c90f3ccbdd6b43a07f576ae9613d|00971890oca7e705dcb1|INST_NONE| +|0|HXgui|INST_SYNC|Up|1496226337||4096||0||0|0|1518124029|5a7cbbfe957b1|00972266oca7e705dcb1|INST_NONE| +|0|HXgui/HXgui.py|INST_SYNC|Up|1528566387||24325||0||0|24306|1517912590|2722d217babbc04c9b5091e316e36f16|00972267oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-06-09T22:47:46 until 2018-06-09T22:48:26 (39758 msec) +|0|HXbot|INST_SYNC|Down|1528566421|5b1c1296b4d46|0|00965020oca7e705dcb1|4||0|4096|1496227388|||INST_NONE| +17:47:50|19382|HXbot/HXbot.py|INST_SYNC|Up|1528566375||18569||4||204|18569|1528566326|7eefba0940574eed5e4908d33ca11624|00965022oca7e705dcb1|INST_NONE| +17:47:50|18859|HXbot/HXpower.py|INST_SYNC|Up|1528566375||15672||4||204|15672|1528566327|7639fd0e00728397041f5e19fe42d177|00969339oca7e705dcb1|INST_NONE| +17:47:50|19115|HXbot/HXserver.py|INST_SYNC|Up|1528566375||4081||4||204|4081|1528566327|5937c90f3ccbdd6b43a07f576ae9613d|00971890oca7e705dcb1|INST_NONE| +|0|HXgui|INST_SYNC|Up|1496226337||4096||4||0|0|1518124029|5a7cbbfe957b1|00972266oca7e705dcb1|INST_NONE| +17:48:09|16530|HXgui/HXgui.py|INST_SYNC|Up|1528566387||24325||4||204|24306|1517912590|2722d217babbc04c9b5091e316e36f16|00972267oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-06-09T22:49:16 until 2018-06-09T22:49:20 (4155 msec) +#=#=#=# Syncrun started 2018-06-09T22:52:57 until 2018-06-09T22:53:18 (21482 msec) +|0|HXgui|INST_SYNC|Up|1496226337||4096||4||0|0|1528566505|5b1c12e9bd069|00972266oca7e705dcb1|INST_NONE| +17:53:01|17064|HXgui/HXgui.py|INST_SYNC|Up|1528566775||24734||4||204|24325|1528566387|4f29de04a5450eebcd7f95fed42c848d|00972267oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-06-09T22:54:17 until 2018-06-09T22:54:20 (3771 msec) +#=#=#=# Syncrun started 2018-06-09T22:57:19 until 2018-06-09T22:57:40 (21277 msec) +|0|HXpower3|INST_SYNC|Up|1528567037||4096||4||0|0|1528565989|5b1c10e59c713|01631642oca7e705dcb1|INST_NONE| +17:57:23|16905|HXpower3/HXpower3.ino|INST_SYNC|Up|1528567037||19007||4||204|18986|1528565624|138d95d49211e345a819f4919295b8ca|01631643oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-06-09T22:58:03 until 2018-06-09T22:58:24 (21701 msec) +17:58:07|17388|HXpower3/HXpower3.ino|INST_SYNC|Up|1528567081||19003||4||204|19007|1528567037|a2afe9be5112bde953a613e0a043025c|01631643oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-06-09T23:03:46 until 2018-06-09T23:04:10 (24230 msec) +|0|HXgui|INST_SYNC|Up|1496226337||4096||4||0|0|1528566797|5b1c140d9363a|00972266oca7e705dcb1|INST_NONE| +18:03:51|19530|HXgui/HXgui.py|INST_SYNC|Up|1528567425||24738||4||204|24734|1528566775|22822b330a7a6a97ab0de4fb29aa8a7a|00972267oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-06-09T23:04:46 until 2018-06-09T23:04:50 (3784 msec) +#=#=#=# Syncrun started 2018-06-09T23:14:44 until 2018-06-09T23:15:09 (24786 msec) +|0|HXpower3|INST_SYNC|Up|1528568082||4096||4||0|0|1528567103|5b1c153fb65b5|01631642oca7e705dcb1|INST_NONE| +18:14:48|20474|HXpower3/HXpower3.ino|INST_SYNC|Up|1528568082||18771||4||204|19003|1528567081|06cca62f05e5b461cba107498c5705db|01631643oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-06-09T23:21:17 until 2018-06-09T23:21:21 (4142 msec) +#=#=#=# Syncrun started 2018-06-09T23:25:42 until 2018-06-09T23:26:07 (24666 msec) +|0|HXbot|INST_SYNC|Up|1496227388||4096||4||0|0|1528566487|5b1c12d8cd796|00965020oca7e705dcb1|INST_NONE| +18:25:46|20397|HXbot/HXbot.py|INST_SYNC|Up|1528568740||18630||4||204|18569|1528566375|2a9944423bee8b20464220017822b800|00965022oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-06-09T23:26:46 until 2018-06-09T23:26:50 (4204 msec) +#=#=#=# Syncrun started 2018-06-09T23:26:56 until 2018-06-09T23:27:19 (23138 msec) +|0|HXgui|INST_SYNC|Up|1496226337||4096||4||0|0|1528567448|5b1c16996dd07|00972266oca7e705dcb1|INST_NONE| +18:27:00|18675|HXgui/HXgui.py|INST_SYNC|Up|1528568814||24738||4||204|24738|1528567425|b5c738a3d3de68e7bcb5a3a665c4b6d7|00972267oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-06-09T23:28:16 until 2018-06-09T23:28:20 (3793 msec) +#=#=#=# Syncrun started 2018-06-10T00:26:43 until 2018-06-10T00:27:10 (27333 msec) +|0|HXbot|INST_SYNC|Up|1496227388||4096||4||0|0|1528568764|5b1c1bbda0795|00965020oca7e705dcb1|INST_NONE| +19:26:47|22871|HXbot/HXbot.py|INST_SYNC|Up|1528572401||18657||4||204|18630|1528568740|6bdfe00e85d3e6d0c6f933e18badbf60|00965022oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-06-10T00:31:46 until 2018-06-10T00:32:09 (23352 msec) +19:31:50|18951|HXbot/HXbot.py|INST_SYNC|Up|1528572704||18681||4||204|18657|1528572401|b8cf74683007c58d2fbc1938dea01a07|00965022oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-06-10T00:32:17 until 2018-06-10T00:33:15 (58546 msec) +19:32:21|18145|HXbot/HX.py|INST_SYNC|Up|1528572711||6200||4||204|6200|1528566374|f03bfc441bd5b9def6a93a5c089de111|00965225oca7e705dcb1|INST_NONE| +19:32:21|18225|HXbot/HXbot.py|INST_SYNC|Up|1528572711||18681||4||204|18681|1528572704|90e77b9eefca07997fc29ff2d7beada8|00965022oca7e705dcb1|INST_NONE| +19:32:21|18143|HXbot/HXpower.py|INST_SYNC|Up|1528572711||15672||4||204|15672|1528566375|3fee7336219e324724522a12cc4f1e68|00969339oca7e705dcb1|INST_NONE| +19:32:39|19180|HXbot/HXserver.py|INST_SYNC|Up|1528572711||4081||4||204|4081|1528566375|80c67c6164f7d1c2433bfe513ed25545|00971890oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__|INST_SYNC|Up|1528572712||4096||4||0|0|1528566388|5b1c1274bbd18|00965228oca7e705dcb1|INST_NONE| +19:32:39|19023|HXbot/__pycache__/HX.cpython-35.pyc|INST_SYNC|Up|1528572712||5905||4||204|5905|1528566327|e1c330cbb644b982b43ea652eb44e3b5|00986822oca7e705dcb1|INST_NONE| +19:32:39|18969|HXbot/__pycache__/HXpower.cpython-35.pyc|INST_SYNC|Up|1528572712||9639||4||204|9639|1528566327|a6641b53e7fa597a35e65a6bdb3b1dc6|00986824oca7e705dcb1|INST_NONE| +19:32:58|17294|HXbot/__pycache__/HXserver.cpython-35.pyc|INST_SYNC|Up|1528572712||3618||4||204|3618|1528566327|06d781d58560227bd3d8c9c0970e424a|00986825oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-06-10T00:36:28 until 2018-06-10T00:36:36 (8613 msec) +|0|HXbot/HX.py|INST_SYNC|Up|1528572986||6200||1|Operation canceled|0|6200|1528572711|f7da1e7a61ff4b070f8cc9f7a48d83fe|00965225oca7e705dcb1|INST_NONE| +|0|HXbot/HXbot.py|INST_SYNC|Up|1528572986||18678||1|Connection closed|0|18681|1528572711|36e09d35e3668c387a8f6dec046844e8|00965022oca7e705dcb1|INST_NONE| +|0|HXbot/HXpower.py|INST_SYNC|Up|1528572986||15672||1|Operation canceled|0|15672|1528572711|6b9ea88ef402b36d0b96dafc07d6ec78|00969339oca7e705dcb1|INST_NONE| +|0|HXbot/HXserver.py|INST_SYNC|Up|1528572986||4081||0||0|4081|1528572711|b022392642ed885bd5bdc09f8c3d0928|00971890oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__/HX.cpython-35.pyc|INST_SYNC|Up|1528572986||5905||0||0|5905|1528572712|08d3ca7e6847447c8d3b57e4c77cb5b1|00986822oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__/HXpower.cpython-35.pyc|INST_SYNC|Up|1528572987||9639||0||0|9639|1528572712|96fbf74f7b39a8ce932dc3123838aca3|00986824oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__/HXserver.cpython-35.pyc|INST_SYNC|Up|1528572987||3618||0||0|3618|1528572712|3e3df7a539aa3a11fb1bff51bf5063c6|00986825oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-06-10T00:41:46 until 2018-06-10T00:42:29 (42345 msec) +|0|HXbot|INST_SYNC|Down|1528573012|5b1c2c551462e|0|00965020oca7e705dcb1|4||0|4096|1496227388|||INST_NONE| +19:41:51|18831|HXbot/HXbot.py|INST_SYNC|Up|1528572986||18678||4||204|18681|1528572711|36e09d35e3668c387a8f6dec046844e8|00965022oca7e705dcb1|INST_NONE| +19:41:51|18600|HXbot/HXpower.py|INST_SYNC|Up|1528572986||15672||4||204|15672|1528572711|6b9ea88ef402b36d0b96dafc07d6ec78|00969339oca7e705dcb1|INST_NONE| +19:41:51|20110|HXbot/HXserver.py|INST_SYNC|Up|1528572986||4081||4||204|4081|1528572711|b022392642ed885bd5bdc09f8c3d0928|00971890oca7e705dcb1|INST_NONE| +19:42:09|17414|HXbot/__pycache__/HX.cpython-35.pyc|INST_SYNC|Up|1528572986||5905||4||204|5905|1528572712|08d3ca7e6847447c8d3b57e4c77cb5b1|00986822oca7e705dcb1|INST_NONE| +19:42:09|18815|HXbot/__pycache__/HXpower.cpython-35.pyc|INST_SYNC|Up|1528572987||9639||4||204|9639|1528572712|96fbf74f7b39a8ce932dc3123838aca3|00986824oca7e705dcb1|INST_NONE| +19:42:11|17699|HXbot/__pycache__/HXserver.cpython-35.pyc|INST_SYNC|Up|1528572987||3618||4||204|3618|1528572712|3e3df7a539aa3a11fb1bff51bf5063c6|00986825oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-06-10T00:42:58 until 2018-06-10T00:43:00 (2421 msec) +#=#=#=# Syncrun started 2018-06-10T00:44:12 until 2018-06-10T00:44:54 (42080 msec) +19:44:15|18259|HXbot/HX.py|INST_SYNC|Up|1528573376||6200||4||204|6200|1528572986|d67d614f81521d963334d6fa956c827c|00965225oca7e705dcb1|INST_NONE| +19:44:15|18269|HXbot/HXbot.py|INST_SYNC|Up|1528573376||18732||4||204|18678|1528572986|74850b76fb08f48f8ffa6b4270178151|00965022oca7e705dcb1|INST_NONE| +19:44:15|18258|HXbot/HXpower.py|INST_SYNC|Up|1528573376||15672||4||204|15672|1528572986|9fc1e07474ba891c29f7a2660ba68577|00969339oca7e705dcb1|INST_NONE| +19:44:34|18989|HXbot/HXserver.py|INST_SYNC|Up|1528573376||4081||4||204|4081|1528572986|7c70042177a838374003a00c884fc3af|00971890oca7e705dcb1|INST_NONE| +19:44:34|19934|HXbot/__pycache__/HX.cpython-35.pyc|INST_SYNC|Up|1528573377||5905||4||204|5905|1528572986|296609f1828e091a3c11375d643fb21e|00986822oca7e705dcb1|INST_NONE| +19:44:34|18598|HXbot/__pycache__/HXpower.cpython-35.pyc|INST_SYNC|Up|1528573377||9639||4||204|9639|1528572987|3fd194567f6db74ba1c60f97038adb94|00986824oca7e705dcb1|INST_NONE| +19:44:34|18599|HXbot/__pycache__/HXserver.cpython-35.pyc|INST_SYNC|Up|1528573377||3618||4||204|3618|1528572987|87c7ae3f4d10ee96caee515722bf1409|00986825oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-06-10T00:45:46 until 2018-06-10T00:45:50 (3785 msec) +#=#=#=# Syncrun started 2018-06-10T01:00:38 until 2018-06-10T01:00:45 (7275 msec) +|0|HXbot|INST_SYNC|Up|1496227388||4096||0||0|0|1528573492|5b1c2e353d4fb|00965020oca7e705dcb1|INST_NONE| +|0|HXbot/HX.py|INST_SYNC|Up|1528574436||6200||1|Operation canceled|0|6200|1528573376|750b0e75300458bcbfea19a506dd1228|00965225oca7e705dcb1|INST_NONE| +|0|HXbot/HXbot.py|INST_SYNC|Up|1528574436||18894||1|Connection closed|0|18732|1528573376|50e58fe4fc212adf3d875ec33c4f7846|00965022oca7e705dcb1|INST_NONE| +|0|HXbot/HXpower.py|INST_SYNC|Up|1528574436||15672||1|Operation canceled|0|15672|1528573376|c94e0144e6e45cbc797ff5b6653d6eb0|00969339oca7e705dcb1|INST_NONE| +|0|HXbot/HXserver.py|INST_SYNC|Up|1528574436||4081||0||0|4081|1528573376|d5a397c704d491aea54470aa95244fb4|00971890oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-06-10T01:01:09 until 2018-06-10T01:01:49 (39536 msec) +20:01:13|18304|HXbot/HXbot.py|INST_SYNC|Up|1528574467||18895||4||204|18732|1528573376|50e58fe4fc212adf3d875ec33c4f7846|00965022oca7e705dcb1|INST_NONE| +20:01:14|19085|HXbot/HXpower.py|INST_SYNC|Up|1528574436||15672||4||204|15672|1528573376|c94e0144e6e45cbc797ff5b6653d6eb0|00969339oca7e705dcb1|INST_NONE| +20:01:32|35054|HXbot/HXserver.py|INST_SYNC|Up|1528574436||4081||4||204|4081|1528573376|d5a397c704d491aea54470aa95244fb4|00971890oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-06-10T01:01:59 until 2018-06-10T01:02:03 (3818 msec) +|0|HXbot/HX.py|INST_SYNC|Up|1528574484||6200||1|Operation canceled|0|6200|1528574436|d494817e250cc4428bdd3db6b6d9e5db|00965225oca7e705dcb1|INST_NONE| +|0|HXbot/HXbot.py|INST_SYNC|Up|1528574484||18894||1|Connection closed|0|18895|1528574467|7439ba11477d3b02e8943337c9c25e84|00965022oca7e705dcb1|INST_NONE| +|0|HXbot/HXpower.py|INST_SYNC|Up|1528574484||15672||1|Connection closed|0|15672|1528574436|a72075f4043baf24e90d79637fb0d871|00969339oca7e705dcb1|INST_NONE| +|0|HXbot/HXserver.py|INST_SYNC|Up|1528574484||4081||0||0|4081|1528574436|be90eb11dfeebefc9f2394c24714df9c|00971890oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__|INST_SYNC|Up|1528574485||4096||0||0|0|1528573492|5b1c2e353d4fb|00965228oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__/HX.cpython-35.pyc|INST_SYNC|Up|1528574484||5905||0||0|5905|1528573377|0f50649795903416144b6fdeab0aacf4|00986822oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__/HXpower.cpython-35.pyc|INST_SYNC|Up|1528574485||9639||0||0|9639|1528573377|e9682fc8a0aeb495bbfe2524ebfaf3b9|00986824oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__/HXserver.cpython-35.pyc|INST_SYNC|Up|1528574485||3618||0||0|3618|1528573377|cc5241b22683434e38b10c2b70d06dda|00986825oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-06-10T01:05:44 until 2018-06-10T01:06:45 (61057 msec) +20:05:51|17719|HXbot/HXbot.py|INST_SYNC|Up|1528574742||18894||4||204|18895|1528574467|7439ba11477d3b02e8943337c9c25e84|00965022oca7e705dcb1|INST_NONE| +20:05:51|17790|HXbot/HXpower.py|INST_SYNC|Up|1528574742||15672||4||204|15672|1528574436|a72075f4043baf24e90d79637fb0d871|00969339oca7e705dcb1|INST_NONE| +20:06:09|35775|HXbot/HXserver.py|INST_SYNC|Up|1528574742||4081||4||204|4081|1528574436|be90eb11dfeebefc9f2394c24714df9c|00971890oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__|INST_SYNC|Up|1528574742||4096||4||0|0|1528573492|5b1c2e353d4fb|00965228oca7e705dcb1|INST_NONE| +20:06:09|35642|HXbot/__pycache__/HX.cpython-35.pyc|INST_SYNC|Up|1528574742||5905||4||204|5905|1528573377|0f50649795903416144b6fdeab0aacf4|00986822oca7e705dcb1|INST_NONE| +20:06:26|35131|HXbot/__pycache__/HXpower.cpython-35.pyc|INST_SYNC|Up|1528574742||9639||4||204|9639|1528573377|e9682fc8a0aeb495bbfe2524ebfaf3b9|00986824oca7e705dcb1|INST_NONE| +20:06:27|17935|HXbot/__pycache__/HXserver.cpython-35.pyc|INST_SYNC|Up|1528574742||3618||4||204|3618|1528573377|cc5241b22683434e38b10c2b70d06dda|00986825oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-06-10T01:08:48 until 2018-06-10T01:09:09 (21238 msec) +20:08:52|16897|HXbot/__pycache__/HX.cpython-35.pyc|INST_SYNC|Up|1528574926||5905||4||204|5905|1528574742|fb916a41617cbd6dd4c223caf608409a|00986822oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-06-10T01:10:53 until 2018-06-10T01:11:02 (8428 msec) +|0|HXbot/HX.py|INST_SYNC|Up|1528575051||6200||1|Operation canceled|0|6200|1528574484|4c74ad5c23932f5e982e685161f71402|00965225oca7e705dcb1|INST_NONE| +|0|HXbot/HXbot.py|INST_SYNC|Up|1528575051||18895||1|Connection closed|0|18894|1528574742|a58efcbcc05ced698ee5d21aef6d8a8d|00965022oca7e705dcb1|INST_NONE| +|0|HXbot/HXpower.py|INST_SYNC|Up|1528575052||15672||1|Operation canceled|0|15672|1528574742|729d3073bb8fc2f75be59f203af8b121|00969339oca7e705dcb1|INST_NONE| +|0|HXbot/HXserver.py|INST_SYNC|Up|1528575052||4081||0||0|4081|1528574742|e2789bbb44ad9b004ec8ad6560099f0b|00971890oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__/HX.cpython-35.pyc|INST_SYNC|Up|1528575052||5905||0||0|5905|1528574926|67c1056fe4dc2886b72b044437caa707|00986822oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__/HXpower.cpython-35.pyc|INST_SYNC|Up|1528575052||9639||0||0|9639|1528574742|68d482444e320b6218e4bf9a63225ffd|00986824oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__/HXserver.cpython-35.pyc|INST_SYNC|Up|1528575052||3618||0||0|3618|1528574742|b49f10d6e73e7742789cbde9bbc4a4cf|00986825oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-06-10T01:16:16 until 2018-06-10T01:16:58 (41561 msec) +|0|HXbot|INST_SYNC|Down|1528575077|5b1c34662c266|0|00965020oca7e705dcb1|4||0|4096|1528574751|||INST_NONE| +20:16:20|18556|HXbot/HXbot.py|INST_SYNC|Up|1528575051||18895||4||204|18894|1528574742|a58efcbcc05ced698ee5d21aef6d8a8d|00965022oca7e705dcb1|INST_NONE| +20:16:20|18567|HXbot/HXpower.py|INST_SYNC|Up|1528575052||15672||4||204|15672|1528574742|729d3073bb8fc2f75be59f203af8b121|00969339oca7e705dcb1|INST_NONE| +20:16:20|18622|HXbot/HXserver.py|INST_SYNC|Up|1528575052||4081||4||204|4081|1528574742|e2789bbb44ad9b004ec8ad6560099f0b|00971890oca7e705dcb1|INST_NONE| +20:16:39|18628|HXbot/__pycache__/HX.cpython-35.pyc|INST_SYNC|Up|1528575052||5905||4||204|5905|1528574926|67c1056fe4dc2886b72b044437caa707|00986822oca7e705dcb1|INST_NONE| +20:16:39|18819|HXbot/__pycache__/HXpower.cpython-35.pyc|INST_SYNC|Up|1528575052||9639||4||204|9639|1528574742|68d482444e320b6218e4bf9a63225ffd|00986824oca7e705dcb1|INST_NONE| +20:16:39|18611|HXbot/__pycache__/HXserver.cpython-35.pyc|INST_SYNC|Up|1528575052||3618||4||204|3618|1528574742|b49f10d6e73e7742789cbde9bbc4a4cf|00986825oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-06-10T01:17:46 until 2018-06-10T01:17:50 (3860 msec) +#=#=#=# Syncrun started 2018-06-10T03:18:16 until 2018-06-10T03:18:20 (3606 msec) +#=#=#=# Syncrun started 2018-06-10T05:18:46 until 2018-06-10T05:18:50 (3529 msec) +#=#=#=# Syncrun started 2018-06-10T07:19:16 until 2018-06-10T07:19:20 (3691 msec) +#=#=#=# Syncrun started 2018-06-10T09:19:46 until 2018-06-10T09:19:50 (3639 msec) +#=#=#=# Syncrun started 2018-06-10T11:20:16 until 2018-06-10T11:20:20 (3565 msec) +#=#=#=# Syncrun started 2018-06-10T13:20:46 until 2018-06-10T13:20:50 (3622 msec) +#=#=#=# Syncrun started 2018-06-10T15:00:44 until 2018-06-10T15:00:47 (3512 msec) +#=#=#=# Syncrun started 2018-06-10T17:05:46 until 2018-06-10T17:05:50 (3695 msec) +#=#=#=# Syncrun started 2018-06-10T19:06:16 until 2018-06-10T19:06:20 (3663 msec) +#=#=#=# Syncrun started 2018-06-10T21:06:46 until 2018-06-10T21:06:50 (3608 msec) +#=#=#=# Syncrun started 2018-06-10T23:07:16 until 2018-06-10T23:07:20 (3714 msec) +#=#=#=# Syncrun started 2018-06-11T01:07:46 until 2018-06-11T01:07:50 (3607 msec) +#=#=#=# Syncrun started 2018-06-11T03:08:16 until 2018-06-11T03:08:20 (3532 msec) +#=#=#=# Syncrun started 2018-06-11T05:08:46 until 2018-06-11T05:08:50 (3576 msec) +#=#=#=# Syncrun started 2018-06-11T07:09:16 until 2018-06-11T07:09:20 (3604 msec) +#=#=#=# Syncrun started 2018-06-11T09:09:46 until 2018-06-11T09:09:50 (3541 msec) +#=#=#=# Syncrun started 2018-06-11T11:10:16 until 2018-06-11T11:10:20 (3480 msec) +#=#=#=# Syncrun started 2018-06-11T13:10:46 until 2018-06-11T13:10:50 (3583 msec) +#=#=#=# Syncrun started 2018-06-11T15:11:16 until 2018-06-11T15:11:20 (3711 msec) +#=#=#=# Syncrun started 2018-06-11T17:11:46 until 2018-06-11T17:11:50 (3653 msec) +#=#=#=# Syncrun started 2018-06-11T19:12:16 until 2018-06-11T19:12:20 (3571 msec) +#=#=#=# Syncrun started 2018-06-11T21:12:46 until 2018-06-11T21:12:50 (3852 msec) +#=#=#=# Syncrun started 2018-06-11T23:13:16 until 2018-06-11T23:13:20 (3595 msec) +#=#=#=# Syncrun started 2018-06-12T01:06:04 until 2018-06-12T01:06:07 (3736 msec) +#=#=#=# Syncrun started 2018-06-12T02:07:57 until 2018-06-12T02:08:01 (4066 msec) +#=#=#=# Syncrun started 2018-06-12T04:08:16 until 2018-06-12T04:08:20 (3853 msec) +#=#=#=# Syncrun started 2018-06-12T06:10:46 until 2018-06-12T06:10:50 (3571 msec) +#=#=#=# Syncrun started 2018-06-12T08:11:16 until 2018-06-12T08:11:20 (3563 msec) +#=#=#=# Syncrun started 2018-06-12T10:11:46 until 2018-06-12T10:11:50 (3685 msec) +#=#=#=# Syncrun started 2018-06-12T12:12:16 until 2018-06-12T12:12:20 (3618 msec) +#=#=#=# Syncrun started 2018-06-12T14:12:46 until 2018-06-12T14:12:50 (3651 msec) +#=#=#=# Syncrun started 2018-06-12T16:13:16 until 2018-06-12T16:13:20 (3599 msec) +#=#=#=# Syncrun started 2018-06-12T18:13:46 until 2018-06-12T18:13:50 (3477 msec) +#=#=#=# Syncrun started 2018-06-12T20:14:16 until 2018-06-12T20:14:20 (3519 msec) +#=#=#=# Syncrun started 2018-06-12T22:14:46 until 2018-06-12T22:14:50 (3643 msec) +#=#=#=# Syncrun started 2018-06-13T00:15:16 until 2018-06-13T00:15:20 (3636 msec) +#=#=#=# Syncrun started 2018-06-13T02:15:46 until 2018-06-13T02:15:50 (3787 msec) +#=#=#=# Syncrun started 2018-06-13T04:16:16 until 2018-06-13T04:16:20 (3772 msec) +#=#=#=# Syncrun started 2018-06-13T06:16:46 until 2018-06-13T06:16:50 (3579 msec) +#=#=#=# Syncrun started 2018-06-13T08:17:16 until 2018-06-13T08:17:20 (3612 msec) +#=#=#=# Syncrun started 2018-06-13T10:19:46 until 2018-06-13T10:19:50 (3565 msec) +#=#=#=# Syncrun started 2018-06-13T12:20:16 until 2018-06-13T12:20:20 (3580 msec) +#=#=#=# Syncrun started 2018-06-13T14:20:46 until 2018-06-13T14:20:50 (3549 msec) +#=#=#=# Syncrun started 2018-06-13T16:21:16 until 2018-06-13T16:21:20 (3680 msec) +#=#=#=# Syncrun started 2018-06-13T18:21:46 until 2018-06-13T18:21:50 (3497 msec) +#=#=#=# Syncrun started 2018-06-13T20:22:16 until 2018-06-13T20:22:20 (3567 msec) +#=#=#=# Syncrun started 2018-06-13T22:22:46 until 2018-06-13T22:22:50 (3650 msec) +#=#=#=# Syncrun started 2018-06-14T00:23:16 until 2018-06-14T00:23:20 (3634 msec) +#=#=#=# Syncrun started 2018-06-14T02:09:00 until 2018-06-14T02:09:03 (3534 msec) +#=#=#=# Syncrun started 2018-06-14T04:09:16 until 2018-06-14T04:09:20 (3620 msec) +#=#=#=# Syncrun started 2018-06-14T06:09:46 until 2018-06-14T06:09:50 (3712 msec) +#=#=#=# Syncrun started 2018-06-14T08:10:16 until 2018-06-14T08:10:20 (3640 msec) +#=#=#=# Syncrun started 2018-06-14T10:10:46 until 2018-06-14T10:10:50 (3618 msec) +#=#=#=# Syncrun started 2018-06-14T12:11:16 until 2018-06-14T12:11:20 (3547 msec) +#=#=#=# Syncrun started 2018-06-14T14:11:46 until 2018-06-14T14:11:50 (3544 msec) +#=#=#=# Syncrun started 2018-06-14T16:12:16 until 2018-06-14T16:12:20 (3559 msec) +#=#=#=# Syncrun started 2018-06-14T18:12:46 until 2018-06-14T18:12:50 (3562 msec) +#=#=#=# Syncrun started 2018-06-14T20:13:16 until 2018-06-14T20:13:20 (3572 msec) +#=#=#=# Syncrun started 2018-06-14T22:13:46 until 2018-06-14T22:13:50 (3521 msec) +#=#=#=# Syncrun started 2018-06-15T00:14:16 until 2018-06-15T00:14:20 (3543 msec) +#=#=#=# Syncrun started 2018-06-15T02:14:46 until 2018-06-15T02:14:50 (3606 msec) +#=#=#=# Syncrun started 2018-06-15T04:15:16 until 2018-06-15T04:15:20 (3580 msec) +#=#=#=# Syncrun started 2018-06-15T06:15:46 until 2018-06-15T06:15:50 (3595 msec) +#=#=#=# Syncrun started 2018-06-15T08:16:16 until 2018-06-15T08:16:20 (3558 msec) +#=#=#=# Syncrun started 2018-06-15T10:16:46 until 2018-06-15T10:16:50 (3592 msec) +#=#=#=# Syncrun started 2018-06-15T12:17:16 until 2018-06-15T12:17:20 (3870 msec) +#=#=#=# Syncrun started 2018-06-15T13:55:08 until 2018-06-15T13:55:12 (3577 msec) +#=#=#=# Syncrun started 2018-06-15T15:55:16 until 2018-06-15T15:55:20 (3693 msec) +#=#=#=# Syncrun started 2018-06-15T17:48:47 until 2018-06-15T17:48:50 (3580 msec) +#=#=#=# Syncrun started 2018-06-15T19:49:16 until 2018-06-15T19:49:20 (3697 msec) +#=#=#=# Syncrun started 2018-06-15T21:49:46 until 2018-06-15T21:49:50 (3520 msec) +#=#=#=# Syncrun started 2018-06-15T23:50:16 until 2018-06-15T23:50:20 (3547 msec) +#=#=#=# Syncrun started 2018-06-16T01:50:46 until 2018-06-16T01:50:50 (3600 msec) +#=#=#=# Syncrun started 2018-06-16T03:51:16 until 2018-06-16T03:51:20 (3543 msec) +#=#=#=# Syncrun started 2018-06-16T05:51:46 until 2018-06-16T05:51:50 (3628 msec) +#=#=#=# Syncrun started 2018-06-16T07:52:16 until 2018-06-16T07:52:20 (3682 msec) +#=#=#=# Syncrun started 2018-06-16T09:52:46 until 2018-06-16T09:52:50 (3576 msec) +#=#=#=# Syncrun started 2018-06-16T11:53:16 until 2018-06-16T11:53:20 (3595 msec) +#=#=#=# Syncrun started 2018-06-16T13:53:46 until 2018-06-16T13:53:52 (5466 msec) +#=#=#=# Syncrun started 2018-06-18T16:27:03 until 2018-06-18T16:27:08 (4740 msec) +#=#=#=# Syncrun started 2018-06-18T18:27:20 until 2018-06-18T18:27:24 (3612 msec) +#=#=#=# Syncrun started 2018-06-18T20:27:50 until 2018-06-18T20:27:54 (3517 msec) +#=#=#=# Syncrun started 2018-06-18T22:29:50 until 2018-06-18T22:29:54 (3580 msec) +#=#=#=# Syncrun started 2018-06-19T00:30:20 until 2018-06-19T00:30:24 (3671 msec) +#=#=#=# Syncrun started 2018-06-19T02:30:50 until 2018-06-19T02:30:54 (3547 msec) +#=#=#=# Syncrun started 2018-06-19T04:31:20 until 2018-06-19T04:31:24 (3558 msec) +#=#=#=# Syncrun started 2018-06-19T06:31:50 until 2018-06-19T06:31:54 (3547 msec) +#=#=#=# Syncrun started 2018-06-19T08:32:20 until 2018-06-19T08:32:24 (3553 msec) +#=#=#=# Syncrun started 2018-06-19T10:32:50 until 2018-06-19T10:32:54 (3510 msec) +#=#=#=# Syncrun started 2018-06-19T12:33:20 until 2018-06-19T12:33:24 (3530 msec) +#=#=#=# Syncrun started 2018-06-19T14:33:50 until 2018-06-19T14:33:54 (3573 msec) +#=#=#=# Syncrun started 2018-06-19T16:34:20 until 2018-06-19T16:34:24 (3591 msec) +#=#=#=# Syncrun started 2018-06-19T18:34:50 until 2018-06-19T18:34:54 (3546 msec) +#=#=#=# Syncrun started 2018-06-19T20:35:20 until 2018-06-19T20:35:24 (3545 msec) +#=#=#=# Syncrun started 2018-06-19T22:35:50 until 2018-06-19T22:35:54 (3608 msec) +#=#=#=# Syncrun started 2018-06-20T00:36:20 until 2018-06-20T00:36:24 (3632 msec) +#=#=#=# Syncrun started 2018-06-20T02:36:50 until 2018-06-20T02:36:54 (3651 msec) +#=#=#=# Syncrun started 2018-06-20T04:37:20 until 2018-06-20T04:37:24 (3553 msec) +#=#=#=# Syncrun started 2018-06-20T06:37:50 until 2018-06-20T06:37:54 (3555 msec) +#=#=#=# Syncrun started 2018-06-20T08:38:20 until 2018-06-20T08:38:24 (3577 msec) +#=#=#=# Syncrun started 2018-06-20T10:38:50 until 2018-06-20T10:38:54 (3497 msec) +#=#=#=# Syncrun started 2018-06-20T12:39:20 until 2018-06-20T12:39:24 (3608 msec) +#=#=#=# Syncrun started 2018-06-20T14:39:50 until 2018-06-20T14:39:54 (3550 msec) +#=#=#=# Syncrun started 2018-06-20T16:40:20 until 2018-06-20T16:40:24 (3555 msec) +#=#=#=# Syncrun started 2018-06-20T18:40:50 until 2018-06-20T18:40:54 (3523 msec) +#=#=#=# Syncrun started 2018-06-20T20:41:20 until 2018-06-20T20:41:24 (3557 msec) +#=#=#=# Syncrun started 2018-06-20T22:41:50 until 2018-06-20T22:41:54 (3538 msec) +#=#=#=# Syncrun started 2018-06-21T00:42:20 until 2018-06-21T00:42:24 (3542 msec) +#=#=#=# Syncrun started 2018-06-21T02:42:50 until 2018-06-21T02:42:54 (3544 msec) +#=#=#=# Syncrun started 2018-06-21T04:29:22 until 2018-06-21T04:29:26 (3465 msec) +#=#=#=# Syncrun started 2018-06-21T06:29:50 until 2018-06-21T06:29:54 (3552 msec) +#=#=#=# Syncrun started 2018-06-21T08:30:20 until 2018-06-21T08:30:24 (3520 msec) +#=#=#=# Syncrun started 2018-06-21T10:30:50 until 2018-06-21T10:30:54 (3589 msec) +#=#=#=# Syncrun started 2018-06-21T12:31:20 until 2018-06-21T12:31:24 (3557 msec) +#=#=#=# Syncrun started 2018-06-21T14:36:50 until 2018-06-21T14:36:54 (3492 msec) +#=#=#=# Syncrun started 2018-06-21T16:37:20 until 2018-06-21T16:37:24 (3491 msec) +#=#=#=# Syncrun started 2018-06-21T18:37:50 until 2018-06-21T18:37:54 (3579 msec) +#=#=#=# Syncrun started 2018-06-21T20:38:20 until 2018-06-21T20:38:24 (3573 msec) +#=#=#=# Syncrun started 2018-06-21T22:38:50 until 2018-06-21T22:38:54 (3676 msec) +#=#=#=# Syncrun started 2018-06-22T00:39:20 until 2018-06-22T00:39:24 (3508 msec) +#=#=#=# Syncrun started 2018-06-22T02:39:50 until 2018-06-22T02:39:54 (3503 msec) +#=#=#=# Syncrun started 2018-06-22T04:40:20 until 2018-06-22T04:40:24 (3566 msec) +#=#=#=# Syncrun started 2018-06-22T06:42:20 until 2018-06-22T06:42:24 (3548 msec) +#=#=#=# Syncrun started 2018-06-22T08:42:50 until 2018-06-22T08:42:54 (3533 msec) +#=#=#=# Syncrun started 2018-06-22T10:43:20 until 2018-06-22T10:43:24 (3533 msec) +#=#=#=# Syncrun started 2018-06-22T12:45:50 until 2018-06-22T12:45:54 (3659 msec) +#=#=#=# Syncrun started 2018-06-22T14:46:20 until 2018-06-22T14:46:24 (3535 msec) +#=#=#=# Syncrun started 2018-06-22T16:46:50 until 2018-06-22T16:46:54 (3500 msec) +#=#=#=# Syncrun started 2018-06-22T18:47:20 until 2018-06-22T18:47:24 (3609 msec) +#=#=#=# Syncrun started 2018-06-22T20:47:50 until 2018-06-22T20:47:54 (3532 msec) +#=#=#=# Syncrun started 2018-06-22T22:48:20 until 2018-06-22T22:48:24 (3598 msec) +#=#=#=# Syncrun started 2018-06-23T00:48:50 until 2018-06-23T00:48:54 (3669 msec) +#=#=#=# Syncrun started 2018-06-23T02:06:23 until 2018-06-23T02:06:27 (3515 msec) +#=#=#=# Syncrun started 2018-06-23T04:06:50 until 2018-06-23T04:06:54 (3587 msec) +#=#=#=# Syncrun started 2018-06-23T05:09:56 until 2018-06-23T05:10:00 (3547 msec) +#=#=#=# Syncrun started 2018-06-23T07:10:20 until 2018-06-23T07:10:24 (3556 msec) +#=#=#=# Syncrun started 2018-06-23T09:10:50 until 2018-06-23T09:10:54 (3538 msec) +#=#=#=# Syncrun started 2018-06-23T11:11:20 until 2018-06-23T11:11:24 (3553 msec) +#=#=#=# Syncrun started 2018-06-23T13:11:50 until 2018-06-23T13:11:54 (3609 msec) +#=#=#=# Syncrun started 2018-06-23T15:12:20 until 2018-06-23T15:12:24 (3529 msec) +#=#=#=# Syncrun started 2018-06-23T17:12:50 until 2018-06-23T17:12:54 (3555 msec) +#=#=#=# Syncrun started 2018-06-23T19:13:20 until 2018-06-23T19:13:24 (3618 msec) +#=#=#=# Syncrun started 2018-06-23T21:13:50 until 2018-06-23T21:13:54 (3603 msec) +#=#=#=# Syncrun started 2018-07-03T09:48:27 until 2018-07-03T09:48:32 (4695 msec) +#=#=#=# Syncrun started 2018-07-03T09:49:30 until 2018-07-03T09:50:48 (78157 msec) +|0|HXbot|INST_SYNC|Up|1528574751||4096||4||0|0|1528575416|5b1c35b9384cd|00965020oca7e705dcb1|INST_NONE| +04:49:42|29512|HXbot/HX.py|INST_SYNC|Up|1530593368||6200||4||204|6200|1528575051|cef833aa6a0a3d9e7800a75fcbf5bab7|00965225oca7e705dcb1|INST_NONE| +04:49:42|28992|HXbot/HXbot.py|INST_SYNC|Up|1530593368||18895||4||204|18895|1528575051|47838d108011ce5311e477a012cf484d|00965022oca7e705dcb1|INST_NONE| +04:49:42|28960|HXbot/HXpower.py|INST_SYNC|Up|1530593368||15672||4||204|15672|1528575052|6b0c99edf22a8d1cdb5a2a825d7b6481|00969339oca7e705dcb1|INST_NONE| +04:50:11|20822|HXbot/HXserver.py|INST_SYNC|Up|1530593369||4081||4||204|4081|1528575052|68a8b74c92593efef3c71f311e4d69ef|00971890oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__|INST_SYNC|Up|1530593370||4096||4||0|0|1528575416|5b1c35b9384cd|00965228oca7e705dcb1|INST_NONE| +04:50:11|20841|HXbot/__pycache__/HX.cpython-35.pyc|INST_SYNC|Up|1530593369||5905||4||204|5905|1528575052|d8b94f9b5c8ba827076365252d1c1806|00986822oca7e705dcb1|INST_NONE| +04:50:11|20884|HXbot/__pycache__/HXpower.cpython-35.pyc|INST_SYNC|Up|1530593370||9639||4||204|9639|1528575052|f1090dd9ab410f28426208464c4432bd|00986824oca7e705dcb1|INST_NONE| +04:50:31|16549|HXbot/__pycache__/HXserver.cpython-35.pyc|INST_SYNC|Up|1530593370||3618||4||204|3618|1528575052|025e04cffd7b14a87b9a924c88f70464|00986825oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-07-03T09:51:44 until 2018-07-03T09:53:08 (83435 msec) +#=#=#=# Syncrun started 2018-07-03T09:53:47 until 2018-07-03T09:53:52 (4607 msec) +#=#=#=# Syncrun started 2018-07-22T12:55:38 until 2018-07-22T12:55:42 (4241 msec) +#=#=#=# Syncrun started 2018-07-22T13:02:13 until 2018-07-22T13:07:16 (303192 msec) +#=#=#=# Syncrun started 2018-07-22T13:08:00 until 2018-07-22T13:08:03 (3701 msec) +#=#=#=# Syncrun started 2018-07-22T15:08:30 until 2018-07-22T15:08:34 (3835 msec) +#=#=#=# Syncrun started 2018-07-22T17:09:00 until 2018-07-22T17:09:03 (3580 msec) +#=#=#=# Syncrun started 2018-07-22T19:09:30 until 2018-07-22T19:09:33 (3512 msec) +#=#=#=# Syncrun started 2018-07-22T19:11:16 until 2018-07-22T19:11:20 (3437 msec) +#=#=#=# Syncrun started 2018-07-22T20:11:32 until 2018-07-22T20:11:36 (3456 msec) +#=#=#=# Syncrun started 2018-07-22T22:12:00 until 2018-07-22T22:12:03 (3474 msec) +#=#=#=# Syncrun started 2018-07-23T15:59:29 until 2018-07-23T15:59:33 (4452 msec) +#=#=#=# Syncrun started 2018-08-13T15:24:38 until 2018-08-13T15:24:42 (4116 msec) +#=#=#=# Syncrun started 2018-08-13T17:24:52 until 2018-08-13T17:24:55 (3704 msec) +#=#=#=# Syncrun started 2018-08-24T23:54:00 until 2018-08-24T23:54:05 (4780 msec) +#=#=#=# Syncrun started 2018-08-25T01:54:26 until 2018-08-25T01:54:30 (3957 msec) +#=#=#=# Syncrun started 2018-08-25T03:54:56 until 2018-08-25T03:55:00 (3842 msec) +#=#=#=# Syncrun started 2018-08-25T04:09:07 until 2018-08-25T04:09:11 (3738 msec) +#=#=#=# Syncrun started 2018-08-25T06:09:26 until 2018-08-25T06:09:30 (3826 msec) +#=#=#=# Syncrun started 2018-08-25T08:09:56 until 2018-08-25T08:10:00 (3996 msec) +#=#=#=# Syncrun started 2018-08-25T10:41:18 until 2018-08-25T10:41:22 (3691 msec) +#=#=#=# Syncrun started 2018-08-25T11:19:42 until 2018-08-25T11:19:46 (4081 msec) +#=#=#=# Syncrun started 2018-08-25T23:14:01 until 2018-08-25T23:14:05 (4422 msec) +#=#=#=# Syncrun started 2018-08-25T23:29:22 until 2018-08-25T23:34:25 (303036 msec) +#=#=#=# Syncrun started 2018-08-25T23:40:26 until 2018-08-25T23:40:31 (4349 msec) +#=#=#=# Syncrun started 2018-08-25T23:44:48 until 2018-08-25T23:45:22 (34475 msec) +|0|HXbot|INST_SYNC|Up|1528574751||4096||4||0|0|1530593447|5b3b00a7dd629|00965020oca7e705dcb1|INST_NONE| +18:44:52|29890|HXbot/HX.py|INST_SYNC|Up|1535222686||6200||4||204|6200|1530593368|829c5a4d45525da82e62c5f96480e453|00965225oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-08-25T23:45:43 until 2018-08-25T23:46:07 (24293 msec) +|0|HXgui|INST_SYNC|Up|1496226337||4096||4||0|0|1528568837|5b1c1c05c05a3|00972266oca7e705dcb1|INST_NONE| +18:45:47|19777|HXgui/HX.py|INST_SYNC|Up|1535222741||6258||4||204|6258|1516909743|8fd0189c2e92d0ab6eac4a1b29031179|00986811oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-08-25T23:46:15 until 2018-08-25T23:46:38 (23164 msec) +|0|HXbot|INST_SYNC|Up|1528574751||4096||4||0|0|1535222714|5b81a3bb3d598|00965020oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__|INST_SYNC|Up|1535222755||4096||4||0|0|1530593447|5b3b00a7dd629|00965228oca7e705dcb1|INST_NONE| +18:46:19|18981|HXbot/__pycache__/HX.cpython-35.pyc|INST_SYNC|Up|1535222755||5896||4||204|5905|1530593369|6ab1ee42b3686d6f197f3f464e79c8a8|00986822oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-08-25T23:47:04 until 2018-08-25T23:47:28 (23212 msec) +|0|HXpower3|INST_SYNC|Up|1535222822||4096||4||0|0|1528568107|5b1c192bd0075|01631642oca7e705dcb1|INST_NONE| +18:47:09|18390|HXpower3/HXpower3.ino|INST_SYNC|Up|1535222822||18771||4||204|18771|1528568082|98b72cd08ea8d59ce4743c0219525c7a|01631643oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-08-25T23:48:10 until 2018-08-25T23:48:14 (3870 msec) +#=#=#=# Syncrun started 2018-08-26T00:14:02 until 2018-08-26T00:14:06 (3725 msec) +#=#=#=# Syncrun started 2018-08-26T02:14:09 until 2018-08-26T02:14:13 (3688 msec) +#=#=#=# Syncrun started 2018-08-26T04:14:39 until 2018-08-26T04:14:43 (3765 msec) +#=#=#=# Syncrun started 2018-08-26T06:15:09 until 2018-08-26T06:15:13 (3830 msec) +#=#=#=# Syncrun started 2018-08-26T08:18:09 until 2018-08-26T08:18:13 (3745 msec) +#=#=#=# Syncrun started 2018-08-26T10:18:39 until 2018-08-26T10:18:43 (3681 msec) +#=#=#=# Syncrun started 2018-08-26T12:19:09 until 2018-08-26T12:19:13 (3710 msec) +#=#=#=# Syncrun started 2018-08-26T14:19:39 until 2018-08-26T14:19:43 (3664 msec) +#=#=#=# Syncrun started 2018-08-26T16:20:09 until 2018-08-26T16:20:13 (3567 msec) +#=#=#=# Syncrun started 2018-08-26T18:20:39 until 2018-08-26T18:20:43 (3593 msec) +#=#=#=# Syncrun started 2018-08-26T20:21:09 until 2018-08-26T20:21:13 (3724 msec) +#=#=#=# Syncrun started 2018-08-26T22:21:39 until 2018-08-26T22:21:43 (3716 msec) +#=#=#=# Syncrun started 2018-08-27T00:22:09 until 2018-08-27T00:22:13 (3803 msec) +#=#=#=# Syncrun started 2018-08-27T02:22:39 until 2018-08-27T02:22:43 (3651 msec) +#=#=#=# Syncrun started 2018-08-27T04:23:09 until 2018-08-27T04:23:13 (3791 msec) +#=#=#=# Syncrun started 2018-08-27T06:23:39 until 2018-08-27T06:23:43 (3746 msec) +#=#=#=# Syncrun started 2018-08-27T08:24:09 until 2018-08-27T08:24:13 (3786 msec) +#=#=#=# Syncrun started 2018-08-27T10:24:39 until 2018-08-27T10:24:43 (3702 msec) +#=#=#=# Syncrun started 2018-08-27T12:28:09 until 2018-08-27T12:28:13 (3767 msec) +#=#=#=# Syncrun started 2018-08-27T14:28:39 until 2018-08-27T14:28:43 (3766 msec) +#=#=#=# Syncrun started 2018-08-27T16:29:09 until 2018-08-27T16:29:13 (4090 msec) +#=#=#=# Syncrun started 2018-08-27T18:29:39 until 2018-08-27T18:29:43 (3715 msec) +#=#=#=# Syncrun started 2018-08-27T20:30:09 until 2018-08-27T20:30:13 (3696 msec) +#=#=#=# Syncrun started 2018-08-27T22:30:39 until 2018-08-27T22:30:43 (3760 msec) +#=#=#=# Syncrun started 2018-08-28T00:31:09 until 2018-08-28T00:31:13 (3786 msec) +#=#=#=# Syncrun started 2018-08-28T02:31:39 until 2018-08-28T02:31:43 (3701 msec) +#=#=#=# Syncrun started 2018-08-28T04:32:09 until 2018-08-28T04:32:13 (3789 msec) +#=#=#=# Syncrun started 2018-08-28T06:32:39 until 2018-08-28T06:32:43 (3659 msec) +#=#=#=# Syncrun started 2018-08-28T08:33:09 until 2018-08-28T08:33:13 (3763 msec) +#=#=#=# Syncrun started 2018-08-28T10:33:39 until 2018-08-28T10:33:43 (3740 msec) +#=#=#=# Syncrun started 2018-08-28T19:26:41 until 2018-08-28T19:27:09 (28604 msec) +|0|HXgui|INST_SYNC|Up|1496226337||4096||4||0|0|1535222765|5b81a3edc9df8|00972266oca7e705dcb1|INST_NONE| +|0|HXgui/__pycache__|INST_SYNC|Up|1535460643||4096||4||0|0|1516910007|5a6a35b856e87|00973100oca7e705dcb1|INST_NONE| +14:26:44|24621|HXgui/__pycache__/HX.cpython-35.pyc|INST_SYNC|Up|1535460643||5922||4||204|5931|1516909759|7885fb2220a4461a8a7d454591697319|00986879oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-08-28T19:27:54 until 2018-08-28T19:27:58 (4179 msec) +#=#=#=# Syncrun started 2018-08-28T19:28:16 until 2018-08-28T19:28:39 (22596 msec) +|0|HXpower3|INST_SYNC|Up|1535466494||4096||4||0|0|1535222846|5b81a43f23844|01631642oca7e705dcb1|INST_NONE| +14:28:20|17915|HXpower3/HXpower3.ino|INST_SYNC|Up|1535466494||18771||4||204|18771|1535222822|6ea9dd26b9532de538f4bbc1e2a91913|01631643oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-08-28T19:29:24 until 2018-08-28T19:29:28 (3734 msec) +#=#=#=# Syncrun started 2018-08-28T19:30:39 until 2018-08-28T19:31:03 (23590 msec) +|0|HXpower3|INST_SYNC|Up|1535466637||4096||4||0|0|1535466518|5b855c1675d36|01631642oca7e705dcb1|INST_NONE| +14:30:43|19337|HXpower3/HXpower3.ino|INST_SYNC|Up|1535466637||18771||4||204|18771|1535466494|f98c571b02357cb3d02efce06a563d64|01631643oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-08-28T19:31:14 until 2018-08-28T19:31:36 (22545 msec) +14:31:18|18232|HXpower3/HXpower3.ino|INST_SYNC|Up|1535466672||18771||4||204|18771|1535466637|ae4706afe745364bf292207355182e4c|01631643oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2018-08-28T19:32:24 until 2018-08-28T19:32:28 (3779 msec) +#=#=#=# Syncrun started 2018-08-28T21:32:54 until 2018-08-28T21:32:58 (3814 msec) +#=#=#=# Syncrun started 2018-08-28T23:33:24 until 2018-08-28T23:33:28 (3705 msec) +#=#=#=# Syncrun started 2018-08-29T01:33:54 until 2018-08-29T01:33:58 (3757 msec) +#=#=#=# Syncrun started 2018-08-29T03:34:24 until 2018-08-29T03:34:28 (3835 msec) +#=#=#=# Syncrun started 2018-08-29T05:34:54 until 2018-08-29T05:34:58 (3841 msec) +#=#=#=# Syncrun started 2018-08-29T07:35:24 until 2018-08-29T07:35:28 (3581 msec) +#=#=#=# Syncrun started 2018-08-29T09:32:02 until 2018-08-29T09:32:05 (3588 msec) +#=#=#=# Syncrun started 2018-08-29T11:37:24 until 2018-08-29T11:37:28 (3621 msec) +#=#=#=# Syncrun started 2018-08-29T13:37:54 until 2018-08-29T13:37:58 (3746 msec) +#=#=#=# Syncrun started 2018-08-29T15:40:54 until 2018-08-29T15:40:58 (3820 msec) +#=#=#=# Syncrun started 2018-08-29T17:41:24 until 2018-08-29T17:41:28 (3758 msec) +#=#=#=# Syncrun started 2018-08-29T19:41:54 until 2018-08-29T19:41:58 (3761 msec) +#=#=#=# Syncrun started 2018-08-29T21:42:24 until 2018-08-29T21:42:28 (3743 msec) +#=#=#=# Syncrun started 2018-08-29T23:42:54 until 2018-08-29T23:42:58 (3801 msec) +#=#=#=# Syncrun started 2018-08-30T01:43:24 until 2018-08-30T01:43:28 (3712 msec) +#=#=#=# Syncrun started 2018-08-30T03:48:54 until 2018-08-30T03:48:58 (3785 msec) +#=#=#=# Syncrun started 2018-08-30T05:46:56 until 2018-08-30T05:46:59 (3635 msec) +#=#=#=# Syncrun started 2018-08-30T07:47:24 until 2018-08-30T07:47:28 (3710 msec) +#=#=#=# Syncrun started 2018-08-30T09:49:54 until 2018-08-30T09:49:58 (3735 msec) +#=#=#=# Syncrun started 2018-08-30T11:50:24 until 2018-08-30T11:50:28 (3745 msec) +#=#=#=# Syncrun started 2018-08-30T13:50:54 until 2018-08-30T13:50:58 (3665 msec) +#=#=#=# Syncrun started 2018-08-30T15:51:24 until 2018-08-30T15:51:28 (3700 msec) +#=#=#=# Syncrun started 2018-08-30T17:51:54 until 2018-08-30T17:51:58 (3647 msec) +#=#=#=# Syncrun started 2018-08-30T19:52:24 until 2018-08-30T19:52:28 (3596 msec) +#=#=#=# Syncrun started 2018-08-30T21:52:54 until 2018-08-30T21:52:58 (3545 msec) +#=#=#=# Syncrun started 2018-08-30T23:53:24 until 2018-08-30T23:53:28 (3607 msec) +#=#=#=# Syncrun started 2018-08-31T01:53:54 until 2018-08-31T01:53:58 (3610 msec) +#=#=#=# Syncrun started 2018-08-31T03:54:24 until 2018-08-31T03:54:28 (3697 msec) +#=#=#=# Syncrun started 2018-08-31T05:54:54 until 2018-08-31T05:54:58 (3563 msec) +#=#=#=# Syncrun started 2018-08-31T07:55:24 until 2018-08-31T07:55:28 (3516 msec) +#=#=#=# Syncrun started 2018-08-31T09:56:54 until 2018-08-31T09:56:58 (3616 msec) +#=#=#=# Syncrun started 2018-08-31T11:57:24 until 2018-08-31T11:57:28 (3598 msec) +#=#=#=# Syncrun started 2018-08-31T13:57:54 until 2018-08-31T13:57:58 (3759 msec) +#=#=#=# Syncrun started 2018-08-31T15:58:24 until 2018-08-31T15:58:28 (3584 msec) +#=#=#=# Syncrun started 2018-08-31T17:58:54 until 2018-08-31T17:58:58 (3673 msec) +#=#=#=# Syncrun started 2018-08-31T19:59:24 until 2018-08-31T19:59:28 (3645 msec) +#=#=#=# Syncrun started 2018-08-31T21:59:54 until 2018-08-31T21:59:58 (3620 msec) +#=#=#=# Syncrun started 2018-09-01T00:00:24 until 2018-09-01T00:00:28 (3721 msec) +#=#=#=# Syncrun started 2018-09-01T02:00:54 until 2018-09-01T02:00:58 (3925 msec) +#=#=#=# Syncrun started 2018-09-01T04:01:24 until 2018-09-01T04:01:28 (3600 msec) +#=#=#=# Syncrun started 2018-09-01T06:06:24 until 2018-09-01T06:06:28 (3613 msec) +#=#=#=# Syncrun started 2018-09-01T08:06:54 until 2018-09-01T08:06:58 (3707 msec) +#=#=#=# Syncrun started 2018-09-01T10:07:24 until 2018-09-01T10:07:28 (3606 msec) +#=#=#=# Syncrun started 2018-09-01T12:07:54 until 2018-09-01T12:07:58 (3610 msec) +#=#=#=# Syncrun started 2018-09-01T14:08:24 until 2018-09-01T14:08:28 (3587 msec) +#=#=#=# Syncrun started 2018-09-23T22:18:54 until 2018-09-23T22:18:58 (4496 msec) +#=#=#=# Syncrun started 2018-09-24T00:19:11 until 2018-09-24T00:19:15 (3828 msec) +#=#=#=# Syncrun started 2018-09-24T02:19:41 until 2018-09-24T02:19:45 (3789 msec) +#=#=#=# Syncrun started 2018-09-24T04:20:11 until 2018-09-24T04:20:15 (3799 msec) +#=#=#=# Syncrun started 2018-09-24T06:20:41 until 2018-09-24T06:20:44 (3746 msec) +#=#=#=# Syncrun started 2018-09-24T07:06:34 until 2018-09-24T07:06:38 (4019 msec) +#=#=#=# Syncrun started 2018-09-24T09:06:48 until 2018-09-24T09:06:52 (3615 msec) +#=#=#=# Syncrun started 2018-09-24T11:07:18 until 2018-09-24T11:07:22 (3657 msec) +#=#=#=# Syncrun started 2018-09-24T13:07:48 until 2018-09-24T13:07:52 (3756 msec) +#=#=#=# Syncrun started 2018-09-24T15:08:18 until 2018-09-24T15:08:22 (3676 msec) +#=#=#=# Syncrun started 2018-09-24T17:08:48 until 2018-09-24T17:08:52 (3611 msec) +#=#=#=# Syncrun started 2018-09-24T19:09:18 until 2018-09-24T19:09:22 (3677 msec) +#=#=#=# Syncrun started 2018-09-24T21:09:48 until 2018-09-24T21:09:52 (3543 msec) +#=#=#=# Syncrun started 2018-09-24T23:10:18 until 2018-09-24T23:10:22 (3573 msec) +#=#=#=# Syncrun started 2018-09-25T01:10:48 until 2018-09-25T01:10:52 (3659 msec) +#=#=#=# Syncrun started 2018-09-25T03:11:18 until 2018-09-25T03:11:22 (3643 msec) +#=#=#=# Syncrun started 2018-09-25T05:11:48 until 2018-09-25T05:11:52 (3566 msec) +#=#=#=# Syncrun started 2018-09-25T07:12:18 until 2018-09-25T07:12:22 (3553 msec) +#=#=#=# Syncrun started 2018-09-25T09:12:48 until 2018-09-25T09:12:52 (3613 msec) +#=#=#=# Syncrun started 2018-09-25T11:13:18 until 2018-09-25T11:13:22 (3682 msec) +#=#=#=# Syncrun started 2018-09-25T13:13:48 until 2018-09-25T13:13:52 (3611 msec) +#=#=#=# Syncrun started 2018-09-25T15:14:48 until 2018-09-25T15:14:52 (3739 msec) +#=#=#=# Syncrun started 2018-09-25T17:15:18 until 2018-09-25T17:15:22 (3690 msec) +#=#=#=# Syncrun started 2018-09-25T18:52:08 until 2018-09-25T18:52:11 (3609 msec) +#=#=#=# Syncrun started 2018-09-25T20:52:18 until 2018-09-25T20:52:22 (3581 msec) +#=#=#=# Syncrun started 2018-09-25T22:52:48 until 2018-09-25T22:52:52 (3611 msec) +#=#=#=# Syncrun started 2018-09-26T00:53:18 until 2018-09-26T00:53:22 (3629 msec) +#=#=#=# Syncrun started 2018-09-26T02:53:48 until 2018-09-26T02:53:52 (3596 msec) +#=#=#=# Syncrun started 2018-09-26T04:54:18 until 2018-09-26T04:54:22 (3693 msec) +#=#=#=# Syncrun started 2018-09-26T06:54:48 until 2018-09-26T06:54:52 (3585 msec) +#=#=#=# Syncrun started 2018-09-26T07:10:16 until 2018-09-26T07:10:19 (3603 msec) +#=#=#=# Syncrun started 2018-09-26T09:10:48 until 2018-09-26T09:10:52 (3674 msec) +#=#=#=# Syncrun started 2018-09-26T11:11:18 until 2018-09-26T11:11:22 (3552 msec) +#=#=#=# Syncrun started 2018-09-26T13:11:48 until 2018-09-26T13:11:52 (3626 msec) +#=#=#=# Syncrun started 2018-09-26T15:12:18 until 2018-09-26T15:12:22 (3566 msec) +#=#=#=# Syncrun started 2018-09-26T17:12:48 until 2018-09-26T17:12:52 (3665 msec) +#=#=#=# Syncrun started 2018-09-26T19:13:18 until 2018-09-26T19:13:22 (3736 msec) +#=#=#=# Syncrun started 2018-09-26T21:18:18 until 2018-09-26T21:23:20 (302042 msec) +#=#=#=# Syncrun started 2018-09-26T21:24:18 until 2018-09-26T21:24:22 (3576 msec) +#=#=#=# Syncrun started 2018-09-26T23:24:48 until 2018-09-26T23:24:52 (3627 msec) +#=#=#=# Syncrun started 2018-09-27T01:25:18 until 2018-09-27T01:25:22 (3603 msec) +#=#=#=# Syncrun started 2018-09-27T02:44:40 until 2018-09-27T02:44:44 (3613 msec) +#=#=#=# Syncrun started 2018-09-27T04:44:48 until 2018-09-27T04:44:52 (3620 msec) +#=#=#=# Syncrun started 2018-09-27T06:45:18 until 2018-09-27T06:45:22 (3604 msec) +#=#=#=# Syncrun started 2018-09-27T08:45:48 until 2018-09-27T08:45:52 (3930 msec) +#=#=#=# Syncrun started 2018-09-27T10:46:18 until 2018-09-27T10:46:22 (3597 msec) +#=#=#=# Syncrun started 2018-09-27T12:46:48 until 2018-09-27T12:46:52 (3571 msec) +#=#=#=# Syncrun started 2018-09-27T14:47:18 until 2018-09-27T14:47:22 (3532 msec) +#=#=#=# Syncrun started 2018-09-27T16:47:48 until 2018-09-27T16:47:52 (3510 msec) +#=#=#=# Syncrun started 2018-09-27T18:48:18 until 2018-09-27T18:48:22 (3590 msec) +#=#=#=# Syncrun started 2018-09-27T20:48:48 until 2018-09-27T20:48:52 (3686 msec) +#=#=#=# Syncrun started 2018-09-27T22:49:18 until 2018-09-27T22:49:22 (3644 msec) +#=#=#=# Syncrun started 2018-09-28T00:49:48 until 2018-09-28T00:49:52 (3595 msec) +#=#=#=# Syncrun started 2018-09-28T02:50:18 until 2018-09-28T02:50:22 (3596 msec) +#=#=#=# Syncrun started 2018-09-28T04:50:48 until 2018-09-28T04:50:52 (3685 msec) +#=#=#=# Syncrun started 2018-09-28T06:51:18 until 2018-09-28T06:51:22 (3599 msec) +#=#=#=# Syncrun started 2018-09-28T08:51:48 until 2018-09-28T08:51:52 (3793 msec) +#=#=#=# Syncrun started 2018-09-28T10:52:18 until 2018-09-28T10:52:22 (3771 msec) +#=#=#=# Syncrun started 2018-09-28T12:52:48 until 2018-09-28T12:52:52 (3675 msec) +#=#=#=# Syncrun started 2018-09-28T14:53:18 until 2018-09-28T14:53:22 (3714 msec) +#=#=#=# Syncrun started 2018-09-28T16:53:48 until 2018-09-28T16:53:52 (3636 msec) +#=#=#=# Syncrun started 2018-09-28T18:54:18 until 2018-09-28T18:54:22 (3636 msec) +#=#=#=# Syncrun started 2018-09-28T20:54:48 until 2018-09-28T20:54:52 (3647 msec) +#=#=#=# Syncrun started 2018-09-29T16:52:41 until 2018-09-29T16:52:44 (3554 msec) +#=#=#=# Syncrun started 2018-09-29T18:52:48 until 2018-09-29T18:52:52 (3633 msec) +#=#=#=# Syncrun started 2018-09-29T20:53:18 until 2018-09-29T20:53:22 (3674 msec) +#=#=#=# Syncrun started 2018-09-29T22:53:48 until 2018-09-29T22:53:52 (3596 msec) +#=#=#=# Syncrun started 2018-09-30T00:54:18 until 2018-09-30T00:54:22 (3762 msec) +#=#=#=# Syncrun started 2018-10-13T21:56:45 until 2018-10-13T21:56:50 (5136 msec) +#=#=#=# Syncrun started 2018-10-13T23:58:49 until 2018-10-13T23:58:53 (3726 msec) +#=#=#=# Syncrun started 2018-10-14T01:59:19 until 2018-10-14T01:59:23 (3894 msec) +#=#=#=# Syncrun started 2018-10-14T03:59:49 until 2018-10-14T03:59:53 (3595 msec) +#=#=#=# Syncrun started 2018-10-14T06:00:19 until 2018-10-14T06:00:23 (3680 msec) +#=#=#=# Syncrun started 2018-10-14T08:00:49 until 2018-10-14T08:00:53 (3622 msec) +#=#=#=# Syncrun started 2018-10-14T10:01:19 until 2018-10-14T10:01:23 (3728 msec) +#=#=#=# Syncrun started 2018-10-14T12:05:19 until 2018-10-14T12:05:23 (3667 msec) +#=#=#=# Syncrun started 2018-10-14T14:05:49 until 2018-10-14T14:05:53 (3777 msec) +#=#=#=# Syncrun started 2018-10-14T16:06:19 until 2018-10-14T16:06:23 (3661 msec) +#=#=#=# Syncrun started 2018-10-14T18:06:49 until 2018-10-14T18:06:53 (3631 msec) +#=#=#=# Syncrun started 2018-10-14T20:07:19 until 2018-10-14T20:07:23 (3650 msec) +#=#=#=# Syncrun started 2019-02-22T00:02:08 until 2019-02-22T00:02:35 (26113 msec) +19:02:12|2668|HXpower4|INST_NEW|Up|1550774849||4096||4||201|0|0|||INST_NONE| +19:02:15|19235|HXpower4/HXpower4.ino|INST_NEW|Up|1550774849||18881||4||201|0|0|||INST_NONE| +#=#=#=# Syncrun started 2019-02-22T00:03:26 until 2019-02-22T00:03:29 (3790 msec) +#=#=#=# Syncrun started 2019-02-22T02:03:56 until 2019-02-22T02:03:59 (3766 msec) +#=#=#=# Syncrun started 2019-02-22T04:04:25 until 2019-02-22T04:04:29 (3775 msec) +#=#=#=# Syncrun started 2019-02-22T06:33:08 until 2019-02-22T06:33:12 (4284 msec) +#=#=#=# Syncrun started 2019-02-22T06:54:09 until 2019-02-22T06:54:13 (3962 msec) +#=#=#=# Syncrun started 2019-02-23T00:33:17 until 2019-02-23T00:33:21 (3908 msec) +#=#=#=# Syncrun started 2019-02-23T02:44:56 until 2019-02-23T02:45:00 (4008 msec) +#=#=#=# Syncrun started 2019-02-23T04:32:26 until 2019-02-23T04:32:30 (3980 msec) +#=#=#=# Syncrun started 2019-02-23T06:32:42 until 2019-02-23T06:32:46 (3748 msec) +#=#=#=# Syncrun started 2019-02-23T08:33:12 until 2019-02-23T08:33:16 (3978 msec) +#=#=#=# Syncrun started 2019-02-23T10:42:54 until 2019-02-23T10:42:58 (4370 msec) +#=#=#=# Syncrun started 2019-02-23T12:43:24 until 2019-02-23T12:43:28 (3711 msec) +#=#=#=# Syncrun started 2019-02-23T14:43:54 until 2019-02-23T14:43:58 (3848 msec) +#=#=#=# Syncrun started 2019-02-23T16:44:24 until 2019-02-23T16:44:28 (3816 msec) +#=#=#=# Syncrun started 2019-02-23T18:44:54 until 2019-02-23T18:44:58 (3885 msec) +#=#=#=# Syncrun started 2019-02-23T19:40:57 until 2019-02-23T19:41:24 (26427 msec) +|0|HXpower3|INST_SYNC|Up|1550932855||4096||4||0|0|1535466695|5b855cc7d7de5|01631642oca7e705dcb1|INST_NONE| +14:41:01|22314|HXpower3/HXpower3.ino|INST_SYNC|Up|1550932855||18769||4||204|18771|1535466672|32c8795d359b8b254b1e7ecd6d51923e|01631643oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-02-23T19:42:24 until 2019-02-23T19:42:28 (3764 msec) +#=#=#=# Syncrun started 2019-02-23T19:54:25 until 2019-02-23T19:57:09 (164532 msec) +#=#=#=# Syncrun started 2019-02-23T19:57:29 until 2019-02-23T19:57:53 (23488 msec) +|0|HXpower3|INST_SYNC|Up|1550933663||4096||4||0|0|1550932881|5c715b91b9237|01631642oca7e705dcb1|INST_NONE| +14:57:33|19470|HXpower3/HXpower3.ino|INST_SYNC|Up|1550933663||18769||4||204|18769|1550932855|ef724d3c216b45c4872089cf22cdeca7|01631643oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-02-23T19:58:05 until 2019-02-23T19:58:28 (23015 msec) +|0|HXpower4|INST_SYNC|Up|1550933883||4096||4||0|0|1550775754|5c6ef5ca60714|01720338oca7e705dcb1|INST_NONE| +14:58:09|18571|HXpower4/HXpower4.ino|INST_SYNC|Up|1550933883||18879||4||204|18881|1550774849|17851b8e256ee5c90ae02ba135fb3432|01720339oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-02-23T19:59:24 until 2019-02-23T19:59:28 (3738 msec) +#=#=#=# Syncrun started 2019-02-23T22:02:24 until 2019-02-23T22:02:28 (3813 msec) +#=#=#=# Syncrun started 2019-02-24T00:02:54 until 2019-02-24T00:02:58 (3725 msec) +#=#=#=# Syncrun started 2019-02-24T00:13:52 until 2019-02-24T00:18:55 (303034 msec) +#=#=#=# Syncrun started 2019-02-24T00:19:34 until 2019-02-24T00:19:38 (3868 msec) +#=#=#=# Syncrun started 2019-02-24T01:13:52 until 2019-02-24T01:13:56 (3881 msec) +#=#=#=# Syncrun started 2019-02-24T01:15:54 until 2019-02-24T01:16:18 (24684 msec) +|0|HXpower4|INST_SYNC|Up|1550952952||4096||4||0|0|1550933907|5c715f939e22c|01720338oca7e705dcb1|INST_NONE| +20:15:58|20367|HXpower4/HXpower4.ino|INST_SYNC|Up|1550952952||18880||4||204|18879|1550933883|d52c1955a2a011b93a23ec055cd9cc09|01720339oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-02-24T01:22:40 until 2019-02-24T01:22:44 (3819 msec) +#=#=#=# Syncrun started 2019-02-24T03:23:10 until 2019-02-24T03:23:13 (3726 msec) +#=#=#=# Syncrun started 2019-02-24T05:23:40 until 2019-02-24T05:23:43 (3868 msec) +#=#=#=# Syncrun started 2019-02-24T07:24:10 until 2019-02-24T07:24:13 (3734 msec) +#=#=#=# Syncrun started 2019-02-24T09:24:40 until 2019-02-24T09:24:43 (3815 msec) +#=#=#=# Syncrun started 2019-02-24T11:25:10 until 2019-02-24T11:25:13 (3628 msec) +#=#=#=# Syncrun started 2019-02-24T13:25:40 until 2019-02-24T13:25:43 (3724 msec) +#=#=#=# Syncrun started 2019-02-24T15:26:10 until 2019-02-24T15:26:14 (4006 msec) +#=#=#=# Syncrun started 2019-02-24T17:26:40 until 2019-02-24T17:26:43 (3576 msec) +#=#=#=# Syncrun started 2019-02-24T19:27:10 until 2019-02-24T19:27:13 (3692 msec) +#=#=#=# Syncrun started 2019-02-24T20:05:05 until 2019-02-24T20:05:09 (4088 msec) +#=#=#=# Syncrun started 2019-02-24T22:05:40 until 2019-02-24T22:05:43 (3735 msec) +#=#=#=# Syncrun started 2019-02-25T00:10:40 until 2019-02-25T00:10:43 (3697 msec) +#=#=#=# Syncrun started 2019-02-25T02:11:10 until 2019-02-25T02:11:13 (3713 msec) +#=#=#=# Syncrun started 2019-02-25T04:11:40 until 2019-02-25T04:11:43 (3727 msec) +#=#=#=# Syncrun started 2019-02-25T06:12:10 until 2019-02-25T06:12:13 (3713 msec) +#=#=#=# Syncrun started 2019-02-25T08:12:40 until 2019-02-25T08:12:43 (3835 msec) +#=#=#=# Syncrun started 2019-02-25T10:13:10 until 2019-02-25T10:13:13 (3779 msec) +#=#=#=# Syncrun started 2019-02-25T12:13:40 until 2019-02-25T12:13:43 (3837 msec) +#=#=#=# Syncrun started 2019-02-25T14:08:48 until 2019-02-25T14:08:52 (3731 msec) +#=#=#=# Syncrun started 2019-02-25T16:09:10 until 2019-02-25T16:09:13 (3727 msec) +#=#=#=# Syncrun started 2019-02-25T18:13:10 until 2019-02-25T18:13:13 (3728 msec) +#=#=#=# Syncrun started 2019-02-25T20:13:40 until 2019-02-25T20:13:43 (3727 msec) +#=#=#=# Syncrun started 2019-02-25T21:08:32 until 2019-02-25T21:08:36 (3684 msec) +#=#=#=# Syncrun started 2019-02-25T23:08:40 until 2019-02-25T23:08:43 (3754 msec) +#=#=#=# Syncrun started 2019-02-26T00:09:52 until 2019-02-26T00:09:56 (3738 msec) +#=#=#=# Syncrun started 2019-02-26T01:33:36 until 2019-02-26T01:33:40 (4056 msec) +#=#=#=# Syncrun started 2019-02-26T01:42:40 until 2019-02-26T01:42:44 (3707 msec) +#=#=#=# Syncrun started 2019-02-26T03:43:10 until 2019-02-26T03:43:13 (3651 msec) +#=#=#=# Syncrun started 2019-02-26T05:43:40 until 2019-02-26T05:43:43 (3749 msec) +#=#=#=# Syncrun started 2019-02-26T07:44:10 until 2019-02-26T07:44:13 (3717 msec) +#=#=#=# Syncrun started 2019-02-26T09:44:40 until 2019-02-26T09:44:43 (3723 msec) +#=#=#=# Syncrun started 2019-02-26T10:23:44 until 2019-02-26T10:23:48 (3706 msec) +#=#=#=# Syncrun started 2019-02-26T12:24:10 until 2019-02-26T12:24:13 (3811 msec) +#=#=#=# Syncrun started 2019-02-26T14:24:40 until 2019-02-26T14:24:43 (3778 msec) +#=#=#=# Syncrun started 2019-02-26T16:25:10 until 2019-02-26T16:25:13 (3896 msec) +#=#=#=# Syncrun started 2019-02-26T18:25:40 until 2019-02-26T18:25:43 (3769 msec) +#=#=#=# Syncrun started 2019-05-06T07:09:21 until 2019-05-06T07:09:25 (4231 msec) +#=#=#=# Syncrun started 2019-05-06T08:28:57 until 2019-05-06T08:29:01 (4261 msec) +#=#=#=# Syncrun started 2019-05-06T10:29:25 until 2019-05-06T10:29:29 (3909 msec) +#=#=#=# Syncrun started 2019-05-06T11:35:10 until 2019-05-06T11:35:53 (43154 msec) +|0|HXpower4|INST_SYNC|Up|1557124508||4096||4||0|0|1550952978|5c71aa120a1f7|01720338oca7e705dcb1|INST_NONE| +06:35:14|38734|HXpower4/HXpower4.ino|INST_SYNC|Up|1557124508||18880||4||204|18880|1550952952|05afa1ed9b4bf5e2880808faee61969d|01720339oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T11:36:13 until 2019-05-06T11:41:15 (302533 msec) +#=#=#=# Syncrun started 2019-05-06T11:41:42 until 2019-05-06T11:42:23 (40834 msec) +06:41:46|36663|HXpower4/HXpower4.ino|INST_SYNC|Up|1557124827||18880||4||204|18880|1557124508|164e9b956c557f6e3e6a87ab03825418|01720339oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T11:42:55 until 2019-05-06T11:42:59 (3907 msec) +#=#=#=# Syncrun started 2019-05-06T11:59:54 until 2019-05-06T12:00:35 (41166 msec) +|0|HXpower4|INST_SYNC|Up|1557125992||4096||4||0|0|1557124943|5ccfd74f1e842|01720338oca7e705dcb1|INST_NONE| +06:59:58|37158|HXpower4/HXpower4.ino|INST_SYNC|Up|1557125992||18912||4||204|18880|1557124827|651585a1294b4cf94560d0be7eb87fb6|01720339oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T12:01:16 until 2019-05-06T12:01:20 (4132 msec) +#=#=#=# Syncrun started 2019-05-06T12:19:10 until 2019-05-06T12:19:51 (41101 msec) +|0|HXpower4|INST_SYNC|Up|1557127148||4096||4||0|0|1557126035|5ccfdb9351549|01720338oca7e705dcb1|INST_NONE| +07:19:14|37092|HXpower4/HXpower4.ino|INST_SYNC|Up|1557127148||18926||4||204|18912|1557125992|acacb99847ee26bd1a11081239e23e8b|01720339oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T12:20:01 until 2019-05-06T12:20:42 (41103 msec) +07:20:05|36847|HXpower4/HXpower4.ino|INST_SYNC|Up|1557127202||18926||4||204|18926|1557127148|bb57e042f7475a2ff2398f495cd28faf|01720339oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T12:21:22 until 2019-05-06T12:22:03 (40759 msec) +07:21:26|36848|HXpower4/HXpower4.ino|INST_SYNC|Up|1557127213||18926||4||204|18926|1557127202|44a9d897dd8df6cad2b8003f2ce3c475|01720339oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T12:22:55 until 2019-05-06T12:22:59 (4091 msec) +#=#=#=# Syncrun started 2019-05-06T12:27:35 until 2019-05-06T12:28:16 (41751 msec) +|0|HXbot|INST_SYNC|Up|1528574751||4096||4||0|0|1535222796|5b81a40d35a59|00965020oca7e705dcb1|INST_NONE| +07:27:39|37461|HXbot/HX.py|INST_SYNC|Up|1557127653||6198||4||204|6200|1535222686|df6a405c87f2efdcc898034f2e97174d|00965225oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T12:28:27 until 2019-05-06T12:28:31 (4069 msec) +|0|HXbot/HX.py|INST_SYNC|Up|1557127673||6198||1|Operation canceled|0|6198|1557127653|76732ae6bb4adbac48527026eedbb5b4|00965225oca7e705dcb1|INST_NONE| +|0|HXbot/HXbot.py|INST_SYNC|Up|1557127674||18895||1|Connection closed|0|18895|1530593368|3ba4aac7916ed8f1421621783d08d5e5|00965022oca7e705dcb1|INST_NONE| +|0|HXbot/HXpower.py|INST_SYNC|Up|1557127674||15672||1|Connection closed|0|15672|1530593368|118f55427a81795925b5f5a7e7433945|00969339oca7e705dcb1|INST_NONE| +|0|HXbot/HXserver.py|INST_SYNC|Up|1557127674||4081||0||0|4081|1530593369|ac8851ab25e69477e121593b2ff0a7ba|00971890oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__|INST_SYNC|Up|1557127675||4096||0||0|0|1535222796|5b81a40d35a59|00965228oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__/HX.cpython-35.pyc|INST_SYNC|Up|1557127674||5896||0||0|5896|1535222755|252035ab28a210c149a259b3b546f204|00986822oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__/HXpower.cpython-35.pyc|INST_SYNC|Up|1557127675||9639||0||0|9639|1530593370|e17a9fc781c115de138381d65d99d793|00986824oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__/HXserver.cpython-35.pyc|INST_SYNC|Up|1557127675||3618||0||0|3618|1530593370|03a405c296545fa3cb1a9623c79ee24e|00986825oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T12:29:25 until 2019-05-06T12:30:51 (85942 msec) +|0|HXbot|INST_SYNC|Down|1557127748|5ccfe2447a99e|0|00965020oca7e705dcb1|4||0|4096|1528574751|||INST_NONE| +07:29:29|43324|HXbot/HXbot.py|INST_SYNC|Up|1557127674||18895||4||204|18895|1530593368|3ba4aac7916ed8f1421621783d08d5e5|00965022oca7e705dcb1|INST_NONE| +07:29:29|43697|HXbot/HXpower.py|INST_SYNC|Up|1557127674||15672||4||204|15672|1530593368|118f55427a81795925b5f5a7e7433945|00969339oca7e705dcb1|INST_NONE| +07:29:29|43704|HXbot/HXserver.py|INST_SYNC|Up|1557127674||4081||4||204|4081|1530593369|ac8851ab25e69477e121593b2ff0a7ba|00971890oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__|INST_SYNC|Up|1557127675||4096||4||0|0|1535222796|5b81a40d35a59|00965228oca7e705dcb1|INST_NONE| +07:30:13|38438|HXbot/__pycache__/HX.cpython-35.pyc|INST_SYNC|Up|1557127674||5896||4||204|5896|1535222755|252035ab28a210c149a259b3b546f204|00986822oca7e705dcb1|INST_NONE| +07:30:13|38070|HXbot/__pycache__/HXpower.cpython-35.pyc|INST_SYNC|Up|1557127675||9639||4||204|9639|1530593370|e17a9fc781c115de138381d65d99d793|00986824oca7e705dcb1|INST_NONE| +07:30:13|38056|HXbot/__pycache__/HXserver.cpython-35.pyc|INST_SYNC|Up|1557127675||3618||4||204|3618|1530593370|03a405c296545fa3cb1a9623c79ee24e|00986825oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T12:31:25 until 2019-05-06T12:31:30 (4372 msec) +#=#=#=# Syncrun started 2019-05-06T12:35:52 until 2019-05-06T12:36:33 (41251 msec) +|0|HXpower4|INST_SYNC|Up|1557128150||4096||4||0|0|1557127323|5ccfe09b12031|01720338oca7e705dcb1|INST_NONE| +07:35:56|37081|HXpower4/HXpower4.ino|INST_SYNC|Up|1557128150||18900||4||204|18926|1557127213|829f1e789631e37a082feab4a85cd567|01720339oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T12:36:56 until 2019-05-06T12:37:37 (41513 msec) +|0|HXbot|INST_SYNC|Up|1528574751||4096||4||0|0|1557127812|5ccfe2ab270fd|00965020oca7e705dcb1|INST_NONE| +07:37:00|37064|HXbot/HX.py|INST_SYNC|Up|1557128214||6198||4||204|6198|1557127673|f84f3cd8e106f889c4d6cd25848e6bf9|00965225oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T12:38:25 until 2019-05-06T12:38:29 (4026 msec) +#=#=#=# Syncrun started 2019-05-06T12:45:44 until 2019-05-06T12:46:26 (41822 msec) +|0|HXbot|INST_SYNC|Up|1528574751||4096||4||0|0|1557128257|5ccfe44130f58|00965020oca7e705dcb1|INST_NONE| +07:45:49|37319|HXbot/HXpower.py|INST_SYNC|Up|1557128742||15672||4||204|15672|1557127674|4475c06b25720a4271ffba3b6d311347|00969339oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T12:47:25 until 2019-05-06T12:48:06 (41151 msec) +07:47:30|36555|HXbot/HXpower.py|INST_SYNC|Up|1557128843||15672||4||204|15672|1557128742|ccd9cb8984f2afe0d03fb2486e7d5ea0|00969339oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T12:48:16 until 2019-05-06T12:48:57 (40796 msec) +07:48:20|36680|HXbot/HX.py|INST_SYNC|Up|1557128887||6198||4||204|6198|1557128214|c4f4ca804b2e7589df96a4f5f1109a4c|00965225oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T12:49:55 until 2019-05-06T12:49:59 (4126 msec) +#=#=#=# Syncrun started 2019-05-06T12:52:34 until 2019-05-06T12:53:15 (41274 msec) +|0|HXbot|INST_SYNC|Up|1528574751||4096||4||0|0|1557128937|5ccfe6e9320b9|00965020oca7e705dcb1|INST_NONE| +07:52:38|37148|HXbot/HXpower.py|INST_SYNC|Up|1557129151||15667||4||204|15672|1557128843|aedbfb6e6ce61271963c15d4708ebb35|00969339oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T12:53:25 until 2019-05-06T12:55:23 (117642 msec) +07:53:29|37747|HXbot/HX.py|INST_SYNC|Up|1557129180||6198||4||204|6198|1557128887|82b6133430d768abdeaaa81da4eca46f|00965225oca7e705dcb1|INST_NONE| +07:53:29|37832|HXbot/HXbot.py|INST_SYNC|Up|1557129180||18895||4||204|18895|1557127674|11f89ad67d83eb4b903eb4ce40d1054d|00965022oca7e705dcb1|INST_NONE| +07:53:29|38198|HXbot/HXpower.py|INST_SYNC|Up|1557129180||15667||4||204|15667|1557129151|85bb7a0b3714080a0185c18b45aaab92|00969339oca7e705dcb1|INST_NONE| +07:54:07|38169|HXbot/HXserver.py|INST_SYNC|Up|1557129180||4081||4||204|4081|1557127674|7ab7c9f92a34e55b9222c0f741071041|00971890oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__|INST_SYNC|Up|1557129181||4096||4||0|0|1557127851|5ccfe2ab270fd|00965228oca7e705dcb1|INST_NONE| +07:54:07|38061|HXbot/__pycache__/HX.cpython-35.pyc|INST_SYNC|Up|1557129181||5896||4||204|5896|1557127674|a188f8bb0d49e87c99a52b6f19999e24|00986822oca7e705dcb1|INST_NONE| +07:54:08|37818|HXbot/__pycache__/HXpower.cpython-35.pyc|INST_SYNC|Up|1557129181||9676||4||204|9639|1557127675|66cb27d6871867d68376f2433cc507bb|00986824oca7e705dcb1|INST_NONE| +07:54:45|37455|HXbot/__pycache__/HXserver.cpython-35.pyc|INST_SYNC|Up|1557129181||3618||4||204|3618|1557127675|7e3d40ebec8cda463302c5e1f86133b4|00986825oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T12:56:23 until 2019-05-06T12:56:28 (4678 msec) +|0|HXbot/HX.py|INST_SYNC|Up|1557129232||6198||1|Operation canceled|0|6198|1557129180|bef7e06794a678d361a032a90face29d|00965225oca7e705dcb1|INST_NONE| +|0|HXbot/HXbot.py|INST_SYNC|Up|1557129232||18895||1|Connection closed|0|18895|1557129180|364f810741335f8ed838a5b84f18e528|00965022oca7e705dcb1|INST_NONE| +|0|HXbot/HXpower.py|INST_SYNC|Up|1557129233||15667||1|Operation canceled|0|15667|1557129180|5f6e2765b6c38d13f0561a6ba411d21a|00969339oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T12:56:39 until 2019-05-06T12:57:28 (49031 msec) +|0|HXbot/HX.py|INST_SYNC|Up|1557129232||6198||3|Error downloading https://box.itphx.ru/owncloud/remote.php/webdav/hxbot/HXbot/HX.py - server replied: Locked ("hxbot/HXbot/HX.py" is locked)|423|6198|1557129180|bef7e06794a678d361a032a90face29d|00965225oca7e705dcb1|INST_NONE| +07:56:44|43507|HXbot/HXbot.py|INST_SYNC|Up|1557129232||18895||4||204|18895|1557129180|364f810741335f8ed838a5b84f18e528|00965022oca7e705dcb1|INST_NONE| +07:56:44|43494|HXbot/HXpower.py|INST_SYNC|Up|1557129233||15667||4||204|15667|1557129180|5f6e2765b6c38d13f0561a6ba411d21a|00969339oca7e705dcb1|INST_NONE| +07:56:44|44327|HXbot/REflex.py|INST_SYNC|Up|1557129397||6312||4||204|6399|1518374047|61e932e2734f663ac63a78e57b41d6b3|00965267oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T12:57:39 until 2019-05-06T12:57:43 (3809 msec) +#=#=#=# Syncrun started 2019-05-06T13:06:41 until 2019-05-06T13:06:48 (7032 msec) +|0|HXbot|INST_SYNC|Up|1528574751||4096||0||0|0|1557129448|5ccfe8e877f26|00965020oca7e705dcb1|INST_NONE| +|0|HXbot/HX.py|INST_SYNC|Up|1557129999||6198||1|Operation canceled|0|6198|1557129232|e417a92976b0f1f1775f58f7536e7553|00965225oca7e705dcb1|INST_NONE| +|0|HXbot/HXbot.py|INST_SYNC|Up|1557129999||18895||1|Connection closed|0|18895|1557129232|99bbc42f1bdaa37b2b6951b0761d93a1|00965022oca7e705dcb1|INST_NONE| +|0|HXbot/HXpower.py|INST_SYNC|Up|1557130000||15667||1|Operation canceled|0|15667|1557129233|5c76095445afb4051893c27e191d935c|00969339oca7e705dcb1|INST_NONE| +|0|HXbot/HXserver.py|INST_SYNC|Up|1557130000||4081||0||0|4081|1557129233|195fe9c37cb36f984bab669f71fcfaf1|00971890oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T13:07:07 until 2019-05-06T13:09:11 (123920 msec) +|0|HXbot|INST_SYNC|Up|1528574751||4096||4||0|0|1557129448|5ccfe8e877f26|00965020oca7e705dcb1|INST_NONE| +|0|HXbot/HX.py|INST_SYNC|Up|1557130025||6198||3|Error downloading https://box.itphx.ru/owncloud/remote.php/webdav/hxbot/HXbot/HX.py - server replied: Locked ("hxbot/HXbot/HX.py" is locked)|423|6198|1557129232|e417a92976b0f1f1775f58f7536e7553|00965225oca7e705dcb1|INST_NONE| +08:07:16|38139|HXbot/HXbot.py|INST_SYNC|Up|1557130025||18895||4||204|18895|1557129232|99bbc42f1bdaa37b2b6951b0761d93a1|00965022oca7e705dcb1|INST_NONE| +08:07:16|38916|HXbot/HXpower.py|INST_SYNC|Up|1557130025||15667||4||204|15667|1557129233|5c76095445afb4051893c27e191d935c|00969339oca7e705dcb1|INST_NONE| +08:07:17|37947|HXbot/HXserver.py|INST_SYNC|Up|1557130025||4081||4||204|4081|1557129233|195fe9c37cb36f984bab669f71fcfaf1|00971890oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__|INST_SYNC|Up|1557130026||4096||4||0|0|1557129322|5ccfe86b0245f|00965228oca7e705dcb1|INST_NONE| +08:07:54|37429|HXbot/__pycache__/HX.cpython-35.pyc|INST_SYNC|Up|1557130026||5896||4||204|5896|1557129181|c68655f0bcf4dee6a22a83d55a1f6b5b|00986822oca7e705dcb1|INST_NONE| +08:07:55|37352|HXbot/__pycache__/HXpower.cpython-35.pyc|INST_SYNC|Up|1557130026||9676||4||204|9676|1557129181|10930671a7d6c914e31556749e610f9e|00986824oca7e705dcb1|INST_NONE| +08:07:55|36980|HXbot/__pycache__/HXserver.cpython-35.pyc|INST_SYNC|Up|1557130026||3618||4||204|3618|1557129181|17633e8933599e4beea48d926b26338f|00986825oca7e705dcb1|INST_NONE| +08:08:32|38531|HXbot/__pycache__/REflex.cpython-35.pyc|INST_SYNC|Up|1557130026||4963||4||204|4995|1518374048|ec203fbc323549d3ec12c13e19ef404a|00986826oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T13:09:28 until 2019-05-06T13:09:33 (4765 msec) +#=#=#=# Syncrun started 2019-05-06T13:09:42 until 2019-05-06T13:10:23 (41415 msec) +|0|HXbot|INST_SYNC|Up|1557130173||4096||4||0|0|1557130074|5ccfeba6cf21c|00965020oca7e705dcb1|INST_NONE| +08:09:46|36634|HXbot/HXserver.py|INST_SYNC|Up|1557130180||4079||4||204|4081|1557130025|a19fc737540a386672a44f0a2b97ca7c|00971890oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T13:10:33 until 2019-05-06T13:10:38 (4373 msec) +|0|HXbot/HX.py|INST_SYNC|Up|1557130190||6198||1|Operation canceled|0|6198|1557129999|ba4f86be7f35aa2c70056cba15b8f666|00965225oca7e705dcb1|INST_NONE| +|0|HXbot/HXbot.py|INST_SYNC|Up|1557130190||18895||1|Connection closed|0|18895|1557130025|920570e8d4ce87ecfe2d45e5c9153e9e|00965022oca7e705dcb1|INST_NONE| +|0|HXbot/HXpower.py|INST_SYNC|Up|1557130190||15667||1|Operation canceled|0|15667|1557130025|b3aa2d0ac48be9e7705cb1a387ac4aae|00969339oca7e705dcb1|INST_NONE| +|0|HXbot/HXserver.py|INST_SYNC|Up|1557130190||4079||0||0|4079|1557130180|7dd0da062cfcb4e290dfcfc2bffd1285|00971890oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__|INST_SYNC|Up|1557130191||4096||0||0|0|1557130150|5ccfeba6cf21c|00965228oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__/HX.cpython-35.pyc|INST_SYNC|Up|1557130190||5896||0||0|5896|1557130026|f19b81cba8c3e6005e8d2c590d6aed17|00986822oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__/HXpower.cpython-35.pyc|INST_SYNC|Up|1557130191||9676||0||0|9676|1557130026|01a5db29393e2e553d8afb690bf83c26|00986824oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__/HXserver.cpython-35.pyc|INST_SYNC|Up|1557130191||3616||0||0|3618|1557130026|6124a59544be9a3f51e9157ebecfdf6b|00986825oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T13:11:03 until 2019-05-06T13:12:27 (84617 msec) +|0|HXbot/HX.py|INST_SYNC|Up|1557130261||6198||3|Error downloading https://box.itphx.ru/owncloud/remote.php/webdav/hxbot/HXbot/HX.py - server replied: Locked ("hxbot/HXbot/HX.py" is locked)|423|6198|1557129999|ba4f86be7f35aa2c70056cba15b8f666|00965225oca7e705dcb1|INST_NONE| +08:11:13|37095|HXbot/HXbot.py|INST_SYNC|Up|1557130261||18895||4||204|18895|1557130025|920570e8d4ce87ecfe2d45e5c9153e9e|00965022oca7e705dcb1|INST_NONE| +08:11:13|37181|HXbot/HXpower.py|INST_SYNC|Up|1557130261||15667||4||204|15667|1557130025|b3aa2d0ac48be9e7705cb1a387ac4aae|00969339oca7e705dcb1|INST_NONE| +08:11:13|37021|HXbot/HXserver.py|INST_SYNC|Up|1557130261||4079||4||204|4079|1557130180|7dd0da062cfcb4e290dfcfc2bffd1285|00971890oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__|INST_SYNC|Up|1557130262||4096||4||0|0|1557130150|5ccfeba6cf21c|00965228oca7e705dcb1|INST_NONE| +08:11:50|37613|HXbot/__pycache__/HX.cpython-35.pyc|INST_SYNC|Up|1557130262||5896||4||204|5896|1557130026|f19b81cba8c3e6005e8d2c590d6aed17|00986822oca7e705dcb1|INST_NONE| +08:11:50|37607|HXbot/__pycache__/HXpower.cpython-35.pyc|INST_SYNC|Up|1557130262||9663||4||204|9676|1557130026|01a5db29393e2e553d8afb690bf83c26|00986824oca7e705dcb1|INST_NONE| +08:11:50|37531|HXbot/__pycache__/HXserver.cpython-35.pyc|INST_SYNC|Up|1557130262||3616||4||204|3618|1557130026|6124a59544be9a3f51e9157ebecfdf6b|00986825oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T13:12:42 until 2019-05-06T13:14:25 (103158 msec) +|0|HXbot|INST_SYNC|Down|1557130310|5ccfec6ba937e|0|00965020oca7e705dcb1|4||0|4096|1557130173|||INST_NONE| +08:12:46|62141|HXbot/HXbot.py|INST_SYNC|Up|1557130317||18895||4||204|18895|1557130261|0bb573e722d5f7dbf7fc7cf01aff0d4b|00965022oca7e705dcb1|INST_NONE| +08:12:46|61534|HXbot/HXpower.py|INST_SYNC|Up|1557130318||15667||4||204|15667|1557130261|b6356346bc34d6bd9cc9acdf46d1e6b3|00969339oca7e705dcb1|INST_NONE| +08:12:46|54627|HXbot/HXserver.py|INST_SYNC|Up|1557130318||4079||4||204|4079|1557130261|c2a0e13856aa5f618495e018b356329a|00971890oca7e705dcb1|INST_NONE| +08:12:46|62411|HXbot/__pycache__/HX.cpython-35.pyc|INST_SYNC|Up|1557130318||5896||4||204|5896|1557130262|37b9da54f7c6e21008269264a0eaa864|00986822oca7e705dcb1|INST_NONE| +08:13:48|37253|HXbot/__pycache__/HXpower.cpython-35.pyc|INST_SYNC|Up|1557130318||9663||4||204|9663|1557130262|bda7d96cfc06cf10dc6b0c3224f0a82d|00986824oca7e705dcb1|INST_NONE| +08:13:48|36698|HXbot/__pycache__/HXserver.cpython-35.pyc|INST_SYNC|Up|1557130318||3616||4||204|3616|1557130262|d5191c0b2a066cb9fa539e0af7d06ece|00986825oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T13:15:25 until 2019-05-06T13:15:30 (4459 msec) +#=#=#=# Syncrun started 2019-05-06T13:17:56 until 2019-05-06T13:22:59 (303557 msec) +#=#=#=# Syncrun started 2019-05-06T13:23:26 until 2019-05-06T13:23:30 (4245 msec) +|0|HXgui|INST_SYNC|Up|1557130873||4096||0||0|0|1535466423|5b855bb876d8c|00972266oca7e705dcb1|INST_NONE| +|0|HXgui/HX.pyc|INST_NEW|Up|1557130873||6760||1|Operation canceled|0|0|0|||INST_NONE| +|0|HXgui/HXgui.py|INST_SYNC|Up|1557130674||24736||1|Connection closed|0|24738|1528568814|8fac610eea4e1bdd7b898abaf8dcda47|00972267oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T13:24:25 until 2019-05-06T13:25:06 (41217 msec) +08:24:30|36648|HXgui/HXgui.py|INST_SYNC|Up|1557130674||24736||4||204|24738|1528568814|8fac610eea4e1bdd7b898abaf8dcda47|00972267oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T13:25:55 until 2019-05-06T13:26:00 (4342 msec) +#=#=#=# Syncrun started 2019-05-06T13:28:03 until 2019-05-06T13:28:45 (41778 msec) +|0|HXgui|INST_SYNC|Up|1557130873||4096||4||0|0|1557131106|5ccfef628bf23|00972266oca7e705dcb1|INST_NONE| +08:28:09|36436|HXgui/HXgui.py|INST_SYNC|Up|1557131281||24791||4||204|24736|1557130674|e66f94e41c8bd1fe3087432112002dbd|00972267oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T13:29:25 until 2019-05-06T13:29:30 (4656 msec) +#=#=#=# Syncrun started 2019-05-06T13:31:08 until 2019-05-06T13:31:50 (42387 msec) +|0|HXgui|INST_SYNC|Up|1557130873||4096||4||0|0|1557131325|5ccff03d42727|00972266oca7e705dcb1|INST_NONE| +08:31:13|36827|HXgui/HXgui.py|INST_SYNC|Up|1557131465||24601||4||204|24791|1557131281|907a5707aa32aa39a8828db87e6a5cf6|00972267oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T13:35:18 until 2019-05-06T13:36:00 (41751 msec) +08:35:23|36221|HXgui/HXgui.py|INST_SYNC|Up|1557131716||25013||4||204|24601|1557131465|46037e6bdcef19e04d9cb28478b81d7c|00972267oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T13:36:13 until 2019-05-06T13:41:16 (303039 msec) +#=#=#=# Syncrun started 2019-05-06T13:41:43 until 2019-05-06T13:42:24 (40759 msec) +08:41:47|36649|HXgui/HXgui.py|INST_SYNC|Up|1557131963||25096||4||204|25013|1557131716|3d4ab9b436a42e40051530113e75fec7|00972267oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T13:43:26 until 2019-05-06T13:43:30 (3942 msec) +#=#=#=# Syncrun started 2019-05-06T13:44:29 until 2019-05-06T13:45:09 (40742 msec) +|0|HXbot|INST_SYNC|Up|1557130366||4096||4||0|0|1557130428|5ccfece18e465|00965020oca7e705dcb1|INST_NONE| +08:44:33|36539|HXbot/HXbot.py|INST_SYNC|Up|1557132267||18857||4||204|18895|1557130317|c3dcc46b87df52e681837d0be40aba31|00965022oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T13:45:19 until 2019-05-06T13:47:14 (114770 msec) +08:45:23|36577|HXbot/HX.py|INST_SYNC|Up|1557132288||6198||4||204|6198|1557130190|059f0bd0a06fe01f5a74cb12eb32b884|00965225oca7e705dcb1|INST_NONE| +08:45:23|36655|HXbot/HXbot.py|INST_SYNC|Up|1557132288||18857||4||204|18857|1557132267|d7e150bffb215d9a57e96a8541abdaca|00965022oca7e705dcb1|INST_NONE| +08:45:23|37060|HXbot/HXpower.py|INST_SYNC|Up|1557132288||15667||4||204|15667|1557130318|43907799d5b1b0d7cd686847e807cc53|00969339oca7e705dcb1|INST_NONE| +08:46:00|37126|HXbot/HXserver.py|INST_SYNC|Up|1557132288||4079||4||204|4079|1557130318|417d91fd404c69533df0f6966e75914f|00971890oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__|INST_SYNC|Up|1557132288||4096||4||0|0|1557130465|5ccfece18e465|00965228oca7e705dcb1|INST_NONE| +08:46:00|37365|HXbot/__pycache__/HX.cpython-35.pyc|INST_SYNC|Up|1557132288||5896||4||204|5896|1557130318|7d405cb8733d2bce0b827582c290afe7|00986822oca7e705dcb1|INST_NONE| +08:46:00|36916|HXbot/__pycache__/HXpower.cpython-35.pyc|INST_SYNC|Up|1557132288||9663||4||204|9663|1557130318|49960a368cd6a944e9c44f3de95e75e9|00986824oca7e705dcb1|INST_NONE| +08:46:37|36656|HXbot/__pycache__/HXserver.cpython-35.pyc|INST_SYNC|Up|1557132288||3616||4||204|3616|1557130318|2e77fab50d8f9af130c0a710997d15d3|00986825oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T13:48:14 until 2019-05-06T13:48:19 (4466 msec) +|0|HXbot/HX.py|INST_SYNC|Up|1557132360||6198||1|Operation canceled|0|6198|1557132288|0b524e87d624b8d8d0b63509b1d3971b|00965225oca7e705dcb1|INST_NONE| +|0|HXbot/HXbot.py|INST_SYNC|Up|1557132360||18857||1|Connection closed|0|18857|1557132288|7760d3fc801577ee9848bd280e7e2b0a|00965022oca7e705dcb1|INST_NONE| +|0|HXbot/HXpower.py|INST_SYNC|Up|1557132360||15667||1|Operation canceled|0|15667|1557132288|f8a236089fc03545cb03dc7209657d35|00969339oca7e705dcb1|INST_NONE| +|0|HXbot/HXserver.py|INST_SYNC|Up|1557132361||4079||0||0|4079|1557132288|e0de4723572e50013e2d7ce1b1571f1c|00971890oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__/HX.cpython-35.pyc|INST_SYNC|Up|1557132361||5896||0||0|5896|1557132288|971ba9e3c9bed6645ca8149085bc3ab2|00986822oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__/HXpower.cpython-35.pyc|INST_SYNC|Up|1557132361||9663||0||0|9663|1557132288|09af480c92293cbd54906f27446bf3b7|00986824oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T13:48:55 until 2019-05-06T13:50:23 (87303 msec) +08:48:59|44221|HXbot/HXbot.py|INST_SYNC|Up|1557132360||18857||4||204|18857|1557132288|7760d3fc801577ee9848bd280e7e2b0a|00965022oca7e705dcb1|INST_NONE| +08:48:59|44239|HXbot/HXpower.py|INST_SYNC|Up|1557132360||15667||4||204|15667|1557132288|f8a236089fc03545cb03dc7209657d35|00969339oca7e705dcb1|INST_NONE| +08:48:59|44244|HXbot/HXserver.py|INST_SYNC|Up|1557132361||4079||4||204|4079|1557132288|e0de4723572e50013e2d7ce1b1571f1c|00971890oca7e705dcb1|INST_NONE| +08:49:44|38878|HXbot/__pycache__/HX.cpython-35.pyc|INST_SYNC|Up|1557132361||5896||4||204|5896|1557132288|971ba9e3c9bed6645ca8149085bc3ab2|00986822oca7e705dcb1|INST_NONE| +08:49:43|38030|HXbot/__pycache__/HXpower.cpython-35.pyc|INST_SYNC|Up|1557132361||9663||4||204|9663|1557132288|09af480c92293cbd54906f27446bf3b7|00986824oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T13:50:37 until 2019-05-06T13:50:45 (7899 msec) +|0|HXbot/HX.py|INST_SYNC|Up|1557132637||6198||1|Operation canceled|0|6198|1557132360|0c49e5b9b1959ec675b21f286bdca708|00965225oca7e705dcb1|INST_NONE| +|0|HXbot/HXbot.py|INST_SYNC|Up|1557132637||18857||1|Connection closed|0|18857|1557132360|0749e634311123e2632cafe54c3bf95c|00965022oca7e705dcb1|INST_NONE| +|0|HXbot/HXpower.py|INST_SYNC|Up|1557132637||15667||1|Operation canceled|0|15667|1557132360|131b6e659eae59ce9196ef49be34d005|00969339oca7e705dcb1|INST_NONE| +|0|HXbot/HXserver.py|INST_SYNC|Up|1557132637||4079||0||0|4079|1557132361|094424d64983d484ed8a19404e173bc0|00971890oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T13:50:50 until 2019-05-06T13:51:32 (42203 msec) +|0|HXbot/HX.py|INST_SYNC|Up|1557132637||6198||3|Error downloading https://box.itphx.ru/owncloud/remote.php/webdav/hxbot/HXbot/HX.py - server replied: Locked ("hxbot/HXbot/HX.py" is locked)|423|6198|1557132360|0c49e5b9b1959ec675b21f286bdca708|00965225oca7e705dcb1|INST_NONE| +08:50:54|37794|HXbot/HXbot.py|INST_SYNC|Up|1557132637||18857||4||204|18857|1557132360|0749e634311123e2632cafe54c3bf95c|00965022oca7e705dcb1|INST_NONE| +08:50:54|37311|HXbot/HXpower.py|INST_SYNC|Up|1557132637||15667||4||204|15667|1557132360|131b6e659eae59ce9196ef49be34d005|00969339oca7e705dcb1|INST_NONE| +08:50:54|36867|HXbot/HXserver.py|INST_SYNC|Up|1557132637||4079||4||204|4079|1557132361|094424d64983d484ed8a19404e173bc0|00971890oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T13:51:42 until 2019-05-06T13:52:13 (31213 msec) +|0|HXbot/HXbot.py|INST_SYNC|Up|1557132660||18857||3|Operation canceled|0|18857|1557132637|1b94116fdc8319d4a44cb13ca6c0eee0|00965022oca7e705dcb1|INST_NONE| +|0|HXbot/HXpower.py|INST_SYNC|Up|1557132661||15667||3|Operation canceled|0|15667|1557132637|5b6f5b49e3615c3a153f9d85c8ef2b57|00969339oca7e705dcb1|INST_NONE| +|0|HXbot/HXserver.py|INST_SYNC|Up|1557132661||4079||3|Operation canceled|0|4079|1557132637|6f453dfd300ced53717b29aaff222df1|00971890oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__|INST_SYNC|Up|1557132661||4096||0||0|0|1557132622|5ccff54e9cef9|00965228oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__/HX.cpython-35.pyc|INST_SYNC|Up|1557132661||5896||3|Operation canceled|0|5896|1557132361|dcc7baf514cf2ab83dd367a27227c967|00986822oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__/HXpower.cpython-35.pyc|INST_SYNC|Up|1557132661||9663||0||0|9663|1557132361|92c1d9784f0dde4862b2aeca414dd6bc|00986824oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__/HXserver.cpython-35.pyc|INST_SYNC|Up|1557132661||3616||0||0|3616|1557132361|be348cceb787376af7458e99acca91e0|00986825oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T13:52:44 until 2019-05-06T13:53:26 (41480 msec) +08:52:48|37088|HXbot/__pycache__/HXpower.cpython-35.pyc|INST_SYNC|Up|1557132661||9663||4||204|9663|1557132361|92c1d9784f0dde4862b2aeca414dd6bc|00986824oca7e705dcb1|INST_NONE| +08:52:48|36983|HXbot/__pycache__/HXserver.cpython-35.pyc|INST_SYNC|Up|1557132661||3616||4||204|3616|1557132361|be348cceb787376af7458e99acca91e0|00986825oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T15:16:11 until 2019-05-06T15:16:53 (41080 msec) +10:16:16|36188|HXbot/__pycache__/HX.cpython-35.pyc|INST_SYNC|Up|1557137772||5896||4||204|5896|1557132661|81cc27d1a00f778380d89c43fa7d6782|00986822oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-06T15:17:03 until 2019-05-06T15:17:07 (4383 msec) +#=#=#=# Syncrun started 2019-05-06T17:17:38 until 2019-05-06T17:17:42 (3837 msec) +#=#=#=# Syncrun started 2019-05-06T19:18:08 until 2019-05-06T19:18:12 (3974 msec) +#=#=#=# Syncrun started 2019-05-06T21:18:38 until 2019-05-06T21:18:42 (3933 msec) +#=#=#=# Syncrun started 2019-05-06T23:19:08 until 2019-05-06T23:19:12 (3956 msec) +#=#=#=# Syncrun started 2019-05-07T01:19:38 until 2019-05-07T01:19:42 (3867 msec) +#=#=#=# Syncrun started 2019-05-07T03:20:08 until 2019-05-07T03:20:12 (3917 msec) +#=#=#=# Syncrun started 2019-05-07T05:20:38 until 2019-05-07T05:20:42 (3887 msec) +#=#=#=# Syncrun started 2019-05-07T07:21:08 until 2019-05-07T07:21:12 (3848 msec) +#=#=#=# Syncrun started 2019-05-07T09:21:38 until 2019-05-07T09:21:42 (3788 msec) +#=#=#=# Syncrun started 2019-05-07T10:06:32 until 2019-05-07T10:08:39 (126662 msec) +|0|HXbot|INST_SYNC|Up|1557132706||4096||4||0|0|1557137772|5cd00994abbc1|00965020oca7e705dcb1|INST_NONE| +05:06:39|43112|HXbot/HX.py|INST_SYNC|Up|1557205590||6198||4||204|6198|1557132637|aabf566f3c2265d2701bf08033be0dde|00965225oca7e705dcb1|INST_NONE| +05:06:39|43205|HXbot/HXbot.py|INST_SYNC|Up|1557205590||18920||4||204|18857|1557132660|a67638b5e0daf2aa5538cd1d30893a93|00965022oca7e705dcb1|INST_NONE| +05:06:39|43105|HXbot/HXpower.py|INST_SYNC|Up|1557205590||15667||4||204|15667|1557132661|39dfc5dbea1cb15a01dd6262cd11fb99|00969339oca7e705dcb1|INST_NONE| +05:07:22|37968|HXbot/HXserver.py|INST_SYNC|Up|1557205590||4079||4||204|4079|1557132661|0090955c11b5a1a51353979e2a125f8a|00971890oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__|INST_SYNC|Up|1557205591||4096||4||0|0|1557137812|5cd00994abbc1|00965228oca7e705dcb1|INST_NONE| +05:07:22|37976|HXbot/__pycache__/HX.cpython-35.pyc|INST_SYNC|Up|1557205591||5896||4||204|5896|1557137772|838a3db8fc07001eac37d07ac053bf2d|00986822oca7e705dcb1|INST_NONE| +05:07:22|37890|HXbot/__pycache__/HXpower.cpython-35.pyc|INST_SYNC|Up|1557205591||9663||4||204|9663|1557132661|c6db170e64e1b40b9282cd7dfdf9273f|00986824oca7e705dcb1|INST_NONE| +05:08:00|37659|HXbot/__pycache__/HXserver.cpython-35.pyc|INST_SYNC|Up|1557205591||3616||4||204|3616|1557132661|50ad589d9e6bc8cb7228b6013e644b5f|00986825oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-07T10:08:56 until 2019-05-07T10:09:01 (4787 msec) +|0|HXbot/HX.py|INST_SYNC|Up|1557205713||6198||1|Operation canceled|0|6198|1557205590|1ae7b44aa7c05c420729fa9c58589b3f|00965225oca7e705dcb1|INST_NONE| +|0|HXbot/HXbot.py|INST_SYNC|Up|1557205714||18795||1|Connection closed|0|18920|1557205590|214078dbbc7c144db31d89653ee1a9ff|00965022oca7e705dcb1|INST_NONE| +|0|HXbot/HXpower.py|INST_SYNC|Up|1557205714||15667||1|Operation canceled|0|15667|1557205590|457423096ead2b02b2ad0864ae31ffff|00969339oca7e705dcb1|INST_NONE| +|0|HXbot/HXserver.py|INST_SYNC|Up|1557205714||4079||0||0|4079|1557205590|873f810dab5cdb7bf6940fa6c2ecc6ae|00971890oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__/HX.cpython-35.pyc|INST_SYNC|Up|1557205715||5896||0||0|5896|1557205591|9f32a11dd4ab0eafb9c681a61ee1a3a2|00986822oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__/HXpower.cpython-35.pyc|INST_SYNC|Up|1557205715||9663||0||0|9663|1557205591|d1d5d79d1fd0deba0ec8d3f1f2b1374e|00986824oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__/HXserver.cpython-35.pyc|INST_SYNC|Up|1557205715||3616||0||0|3616|1557205591|e2e7fdbc0427896f74726322b1c81e66|00986825oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-07T10:09:29 until 2019-05-07T10:10:50 (81196 msec) +|0|HXbot/HX.py|INST_SYNC|Up|1557205713||6198||3|Error downloading https://box.itphx.ru/owncloud/remote.php/webdav/hxbot/HXbot/HX.py - server replied: Locked ("hxbot/HXbot/HX.py" is locked)|423|6198|1557205590|1ae7b44aa7c05c420729fa9c58589b3f|00965225oca7e705dcb1|INST_NONE| +05:09:34|38433|HXbot/HXbot.py|INST_SYNC|Up|1557205767||18795||4||204|18920|1557205590|214078dbbc7c144db31d89653ee1a9ff|00965022oca7e705dcb1|INST_NONE| +05:09:34|38922|HXbot/HXpower.py|INST_SYNC|Up|1557205714||15667||4||204|15667|1557205590|457423096ead2b02b2ad0864ae31ffff|00969339oca7e705dcb1|INST_NONE| +05:09:34|38368|HXbot/HXserver.py|INST_SYNC|Up|1557205714||4079||4||204|4079|1557205590|873f810dab5cdb7bf6940fa6c2ecc6ae|00971890oca7e705dcb1|INST_NONE| +05:10:12|37297|HXbot/__pycache__/HX.cpython-35.pyc|INST_SYNC|Up|1557205715||5896||4||204|5896|1557205591|9f32a11dd4ab0eafb9c681a61ee1a3a2|00986822oca7e705dcb1|INST_NONE| +05:10:12|37312|HXbot/__pycache__/HXpower.cpython-35.pyc|INST_SYNC|Up|1557205715||9663||4||204|9663|1557205591|d1d5d79d1fd0deba0ec8d3f1f2b1374e|00986824oca7e705dcb1|INST_NONE| +05:10:12|37350|HXbot/__pycache__/HXserver.cpython-35.pyc|INST_SYNC|Up|1557205715||3616||4||204|3616|1557205591|e2e7fdbc0427896f74726322b1c81e66|00986825oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-07T10:11:04 until 2019-05-07T10:12:38 (94413 msec) +|0|HXbot|INST_SYNC|Down|1557205812|5cd1135a3462d|0|00965020oca7e705dcb1|4||0|4096|1557132706|||INST_NONE| +05:11:09|51944|HXbot/HXbot.py|INST_SYNC|Up|1557205854||18795||4||204|18795|1557205767|bfafa08e36c259d918dfefd8a8548b21|00965022oca7e705dcb1|INST_NONE| +05:11:09|51523|HXbot/HXpower.py|INST_SYNC|Up|1557205854||15667||4||204|15667|1557205714|9517fab7dc3a2e6dbe3f7cd2bfe7c51a|00969339oca7e705dcb1|INST_NONE| +05:11:09|49047|HXbot/HXserver.py|INST_SYNC|Up|1557205854||4079||4||204|4079|1557205714|b998725f7d01099a64923ef4be0b2522|00971890oca7e705dcb1|INST_NONE| +05:11:09|52145|HXbot/__pycache__/HX.cpython-35.pyc|INST_SYNC|Up|1557205854||5896||4||204|5896|1557205779|b35325972e9408ad479c56591420f05b|00986822oca7e705dcb1|INST_NONE| +05:12:00|37692|HXbot/__pycache__/HXpower.cpython-35.pyc|INST_SYNC|Up|1557205855||9663||4||204|9663|1557205779|4f0c09a68be78384aa5bb1a2e0e7089d|00986824oca7e705dcb1|INST_NONE| +05:12:01|37292|HXbot/__pycache__/HXserver.cpython-35.pyc|INST_SYNC|Up|1557205855||3616||4||204|3616|1557205779|1c11c5a7e9ff9df8463bdb034f41bf54|00986825oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-07T10:13:39 until 2019-05-07T10:13:44 (4686 msec) +|0|HXbot/HX.py|INST_SYNC|Up|1557205996||6198||1|Operation canceled|0|6198|1557205713|ef97869ca7f1ee2c75dfc06b459392f7|00965225oca7e705dcb1|INST_NONE| +|0|HXbot/HXbot.py|INST_SYNC|Up|1557205996||18795||1|Connection closed|0|18795|1557205854|799212ca8ec89130d41fc167454cdd2d|00965022oca7e705dcb1|INST_NONE| +|0|HXbot/HXpower.py|INST_SYNC|Up|1557205996||15667||1|Operation canceled|0|15667|1557205854|5a3f2c0d9c7fd499ffb3454f1dc7b863|00969339oca7e705dcb1|INST_NONE| +|0|HXbot/HXserver.py|INST_SYNC|Up|1557205996||4079||0||0|4079|1557205854|80f427fc01cc048102f81c61744d29f0|00971890oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__/HX.cpython-35.pyc|INST_SYNC|Up|1557205997||5896||0||0|5896|1557205854|5752b6b6c226a3179091fc922077aa59|00986822oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__/HXpower.cpython-35.pyc|INST_SYNC|Up|1557205997||9637||0||0|9663|1557205855|cab2b8962c1bc02f34f96d3b9acbeb39|00986824oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__/HXserver.cpython-35.pyc|INST_SYNC|Up|1557205997||3616||0||0|3616|1557205855|9853b27a2be2a201b7d3aba030563c97|00986825oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-07T10:14:38 until 2019-05-07T10:15:57 (78874 msec) +05:14:42|37084|HXbot/HXbot.py|INST_SYNC|Up|1557205996||18795||4||204|18795|1557205854|799212ca8ec89130d41fc167454cdd2d|00965022oca7e705dcb1|INST_NONE| +05:14:42|37088|HXbot/HXpower.py|INST_SYNC|Up|1557205996||15667||4||204|15667|1557205854|5a3f2c0d9c7fd499ffb3454f1dc7b863|00969339oca7e705dcb1|INST_NONE| +05:14:42|37309|HXbot/HXserver.py|INST_SYNC|Up|1557205996||4079||4||204|4079|1557205854|80f427fc01cc048102f81c61744d29f0|00971890oca7e705dcb1|INST_NONE| +05:15:19|36679|HXbot/__pycache__/HX.cpython-35.pyc|INST_SYNC|Up|1557205997||5896||4||204|5896|1557205854|5752b6b6c226a3179091fc922077aa59|00986822oca7e705dcb1|INST_NONE| +05:15:19|36874|HXbot/__pycache__/HXpower.cpython-35.pyc|INST_SYNC|Up|1557205997||9637||4||204|9663|1557205855|cab2b8962c1bc02f34f96d3b9acbeb39|00986824oca7e705dcb1|INST_NONE| +05:15:20|37108|HXbot/__pycache__/HXserver.cpython-35.pyc|INST_SYNC|Up|1557205997||3616||4||204|3616|1557205855|9853b27a2be2a201b7d3aba030563c97|00986825oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-07T10:16:38 until 2019-05-07T10:16:43 (4668 msec) +#=#=#=# Syncrun started 2019-05-07T10:41:55 until 2019-05-07T10:42:05 (10394 msec) +|0|HXbot|INST_SYNC|Up|1557205869||4096||0||0|0|1557206120|5cd1148ce5fbc|00965020oca7e705dcb1|INST_NONE| +|0|HXbot/HX.py|INST_SYNC|Up|1557207713||6198||1|Operation canceled|0|6198|1557205996|7504446f3468eb1df54ead74b4269ead|00965225oca7e705dcb1|INST_NONE| +|0|HXbot/HXbot.py|INST_SYNC|Up|1557207713||18795||1|Connection closed|0|18795|1557205996|8748a45e0bd9a88dda206ff47c190214|00965022oca7e705dcb1|INST_NONE| +|0|HXbot/HXpower.py|INST_SYNC|Up|1557207714||15667||1|Operation canceled|0|15667|1557205996|e042ec5c67a62dc44c0dacc71cffce49|00969339oca7e705dcb1|INST_NONE| +|0|HXbot/HXserver.py|INST_SYNC|Up|1557207714||4079||0||0|4079|1557205996|ec6bd939d54f4e1974a40cd9f194cab1|00971890oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__|INST_SYNC|Up|1557207714||4096||0||0|0|1557206156|5cd1148ce5fbc|00965228oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__/HX.cpython-35.pyc|INST_SYNC|Up|1557207714||5896||0||0|5896|1557205997|f1cd456715508050bd7f66ec71a09fb5|00986822oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__/HXpower.cpython-35.pyc|INST_SYNC|Up|1557207714||9637||0||0|9637|1557205997|0e7b1714961edd86619ff7a9a6ead642|00986824oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__/HXserver.cpython-35.pyc|INST_SYNC|Up|1557207714||3616||0||0|3616|1557205997|cc729160b666ccda921f927c5e34ccfb|00986825oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-07T10:42:38 until 2019-05-07T10:43:56 (77724 msec) +|0|HXbot|INST_SYNC|Up|1557205869||4096||4||0|0|1557206120|5cd1148ce5fbc|00965020oca7e705dcb1|INST_NONE| +|0|HXbot/HX.py|INST_SYNC|Up|1557207713||6198||3|Error downloading https://box.itphx.ru/owncloud/remote.php/webdav/hxbot/HXbot/HX.py - server replied: Locked ("hxbot/HXbot/HX.py" is locked)|423|6198|1557205996|7504446f3468eb1df54ead74b4269ead|00965225oca7e705dcb1|INST_NONE| +05:42:42|36712|HXbot/HXbot.py|INST_SYNC|Up|1557207713||18795||4||204|18795|1557205996|8748a45e0bd9a88dda206ff47c190214|00965022oca7e705dcb1|INST_NONE| +05:42:42|37093|HXbot/HXpower.py|INST_SYNC|Up|1557207714||15667||4||204|15667|1557205996|e042ec5c67a62dc44c0dacc71cffce49|00969339oca7e705dcb1|INST_NONE| +05:42:42|36637|HXbot/HXserver.py|INST_SYNC|Up|1557207714||4079||4||204|4079|1557205996|ec6bd939d54f4e1974a40cd9f194cab1|00971890oca7e705dcb1|INST_NONE| +|0|HXbot/__pycache__|INST_SYNC|Up|1557207714||4096||4||0|0|1557206156|5cd1148ce5fbc|00965228oca7e705dcb1|INST_NONE| +05:43:18|36973|HXbot/__pycache__/HX.cpython-35.pyc|INST_SYNC|Up|1557207714||5896||4||204|5896|1557205997|f1cd456715508050bd7f66ec71a09fb5|00986822oca7e705dcb1|INST_NONE| +05:43:18|36895|HXbot/__pycache__/HXpower.cpython-35.pyc|INST_SYNC|Up|1557207714||9637||4||204|9637|1557205997|0e7b1714961edd86619ff7a9a6ead642|00986824oca7e705dcb1|INST_NONE| +05:43:19|36594|HXbot/__pycache__/HXserver.cpython-35.pyc|INST_SYNC|Up|1557207714||3616||4||204|3616|1557205997|cc729160b666ccda921f927c5e34ccfb|00986825oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-07T10:44:10 until 2019-05-07T10:44:14 (4247 msec) +#=#=#=# Syncrun started 2019-05-07T10:46:22 until 2019-05-07T10:47:04 (42165 msec) +|0|HXpower4|INST_SYNC|Up|1557207980||4096||4||0|0|1557128193|5ccfe401038cc|01720338oca7e705dcb1|INST_NONE| +05:46:27|36909|HXpower4/HXpower4.ino|INST_SYNC|Up|1557207980||18914||4||204|18900|1557128150|1a8259c8c8a3793142aff18316da19d7|01720339oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-07T10:47:38 until 2019-05-07T10:47:42 (4022 msec) +#=#=#=# Syncrun started 2019-05-07T10:48:29 until 2019-05-07T10:49:12 (42205 msec) +|0|HXpower4|INST_SYNC|Up|1557208108||4096||4||0|0|1557208024|5cd11bd831d33|01720338oca7e705dcb1|INST_NONE| +05:48:34|37008|HXpower4/HXpower4.ino|INST_SYNC|Up|1557208108||18902||4||204|18914|1557207980|e18a10a1627cdce4877022f1f2b1174d|01720339oca7e705dcb1|INST_NONE| +#=#=#=# Syncrun started 2019-05-07T10:50:08 until 2019-05-07T10:50:12 (3833 msec) +#=#=#=# Syncrun started 2019-05-07T12:50:38 until 2019-05-07T12:50:42 (3804 msec) +#=#=#=# Syncrun started 2019-05-07T14:51:08 until 2019-05-07T14:51:12 (3914 msec) +#=#=#=# Syncrun started 2019-05-08T20:54:22 until 2019-05-08T20:54:26 (4476 msec) +#=#=#=# Syncrun started 2019-05-08T22:54:45 until 2019-05-08T22:54:49 (3833 msec) +#=#=#=# Syncrun started 2019-05-09T00:58:15 until 2019-05-09T00:58:19 (3650 msec) +#=#=#=# Syncrun started 2019-05-09T02:58:45 until 2019-05-09T02:58:49 (3650 msec) +#=#=#=# Syncrun started 2019-05-09T04:59:15 until 2019-05-09T04:59:19 (3694 msec) +#=#=#=# Syncrun started 2019-05-09T06:59:45 until 2019-05-09T06:59:49 (3681 msec) +#=#=#=# Syncrun started 2019-05-09T09:00:15 until 2019-05-09T09:00:19 (3645 msec) +#=#=#=# Syncrun started 2019-05-09T11:00:45 until 2019-05-09T11:00:49 (3752 msec) +#=#=#=# Syncrun started 2019-05-09T13:01:15 until 2019-05-09T13:01:19 (3727 msec) +#=#=#=# Syncrun started 2019-05-09T15:01:45 until 2019-05-09T15:01:49 (3660 msec) +#=#=#=# Syncrun started 2019-05-09T17:02:15 until 2019-05-09T17:02:19 (3690 msec) +#=#=#=# Syncrun started 2019-05-09T19:02:45 until 2019-05-09T19:02:49 (3692 msec) +#=#=#=# Syncrun started 2019-05-09T21:03:15 until 2019-05-09T21:03:19 (3761 msec) +#=#=#=# Syncrun started 2019-05-09T23:03:45 until 2019-05-09T23:03:49 (3639 msec) +#=#=#=# Syncrun started 2019-05-10T01:04:15 until 2019-05-10T01:04:19 (3752 msec) +#=#=#=# Syncrun started 2019-05-10T03:04:45 until 2019-05-10T03:04:49 (3643 msec) +#=#=#=# Syncrun started 2019-05-10T05:05:15 until 2019-05-10T05:05:19 (3832 msec) +#=#=#=# Syncrun started 2019-05-10T07:05:45 until 2019-05-10T07:05:49 (3729 msec) +#=#=#=# Syncrun started 2019-05-10T09:06:15 until 2019-05-10T09:06:19 (3690 msec) +#=#=#=# Syncrun started 2019-05-10T11:06:45 until 2019-05-10T11:06:49 (3736 msec) +#=#=#=# Syncrun started 2019-05-10T13:07:15 until 2019-05-10T13:07:19 (3741 msec) +#=#=#=# Syncrun started 2019-05-10T15:07:45 until 2019-05-10T15:07:49 (3693 msec) +#=#=#=# Syncrun started 2019-05-10T17:08:15 until 2019-05-10T17:08:19 (3813 msec) +#=#=#=# Syncrun started 2019-05-10T19:08:45 until 2019-05-10T19:08:49 (3688 msec) +#=#=#=# Syncrun started 2019-05-10T21:09:15 until 2019-05-10T21:09:19 (3750 msec) +#=#=#=# Syncrun started 2019-05-10T23:09:45 until 2019-05-10T23:09:49 (3806 msec) +#=#=#=# Syncrun started 2019-05-11T01:10:15 until 2019-05-11T01:10:19 (3639 msec) +#=#=#=# Syncrun started 2019-05-11T03:10:45 until 2019-05-11T03:10:49 (3713 msec) +#=#=#=# Syncrun started 2019-05-11T05:11:15 until 2019-05-11T05:11:19 (3625 msec) +#=#=#=# Syncrun started 2019-05-11T07:11:45 until 2019-05-11T07:11:49 (3754 msec) +#=#=#=# Syncrun started 2019-05-11T09:12:15 until 2019-05-11T09:12:19 (3721 msec) +#=#=#=# Syncrun started 2019-05-11T11:12:45 until 2019-05-11T11:12:49 (3778 msec) +#=#=#=# Syncrun started 2019-05-11T13:13:15 until 2019-05-11T13:13:19 (3719 msec) +#=#=#=# Syncrun started 2019-05-11T15:13:45 until 2019-05-11T15:13:49 (3644 msec) +#=#=#=# Syncrun started 2019-05-11T17:14:15 until 2019-05-11T17:14:19 (3824 msec) +#=#=#=# Syncrun started 2019-05-11T18:12:34 until 2019-05-11T18:12:38 (4242 msec) +#=#=#=# Syncrun started 2019-05-11T18:15:37 until 2019-05-11T18:15:40 (3888 msec) +#=#=#=# Syncrun started 2019-05-11T18:24:09 until 2019-05-11T18:24:13 (4028 msec) +#=#=#=# Syncrun started 2019-05-11T18:34:12 until 2019-05-11T18:34:30 (18411 msec) +#=#=#=# Syncrun started 2019-05-11T18:36:16 until 2019-05-11T18:37:02 (46033 msec) +#=#=#=# Syncrun started 2019-05-11T18:45:56 until 2019-05-11T18:46:38 (41685 msec) +#=#=#=# Syncrun started 2019-05-11T18:53:53 until 2019-05-11T18:54:38 (44877 msec) +#=#=#=# Syncrun started 2019-05-11T19:10:29 until 2019-05-11T19:11:10 (41147 msec) +#=#=#=# Syncrun started 2019-05-11T19:15:05 until 2019-05-11T19:15:09 (3801 msec) +#=#=#=# Syncrun started 2019-05-11T19:20:29 until 2019-05-11T19:21:18 (49573 msec) +#=#=#=# Syncrun started 2019-05-11T19:24:36 until 2019-05-11T19:25:34 (58076 msec) +#=#=#=# Syncrun started 2019-05-11T19:27:15 until 2019-05-11T19:27:23 (8513 msec) +#=#=#=# Syncrun started 2019-05-11T19:30:27 until 2019-05-11T19:30:54 (27581 msec) +#=#=#=# Syncrun started 2019-05-11T19:34:53 until 2019-05-11T19:35:42 (49526 msec) +#=#=#=# Syncrun started 2019-05-11T19:41:21 until 2019-05-11T19:41:31 (10087 msec) +#=#=#=# Syncrun started 2019-05-11T19:44:38 until 2019-05-11T19:44:44 (6590 msec) +#=#=#=# Syncrun started 2019-05-11T19:59:43 until 2019-05-11T20:00:14 (31523 msec) +#=#=#=# Syncrun started 2019-05-11T20:06:16 until 2019-05-11T20:06:19 (3859 msec) +#=#=#=# Syncrun started 2019-05-11T20:08:49 until 2019-05-11T20:08:54 (4812 msec) +#=#=#=# Syncrun started 2019-05-11T20:15:21 until 2019-05-11T20:16:07 (46046 msec) +#=#=#=# Syncrun started 2019-05-11T20:20:48 until 2019-05-11T20:21:00 (11639 msec) +#=#=#=# Syncrun started 2019-05-11T20:31:04 until 2019-05-11T20:31:15 (11208 msec) +#=#=#=# Syncrun started 2019-05-11T20:36:28 until 2019-05-11T20:36:53 (25062 msec) +#=#=#=# Syncrun started 2019-05-11T20:47:18 until 2019-05-11T20:47:21 (3678 msec) +#=#=#=# Syncrun started 2019-05-11T21:00:01 until 2019-05-11T21:00:16 (15410 msec) +#=#=#=# Syncrun started 2019-05-11T21:14:22 until 2019-05-11T21:14:27 (5038 msec) +#=#=#=# Syncrun started 2019-05-11T21:19:19 until 2019-05-11T21:19:31 (11588 msec) +#=#=#=# Syncrun started 2019-05-11T21:25:19 until 2019-05-11T21:26:06 (47153 msec) +#=#=#=# Syncrun started 2019-05-11T22:16:47 until 2019-05-11T22:17:01 (13512 msec) +#=#=#=# Syncrun started 2019-05-11T22:22:11 until 2019-05-11T22:22:29 (17872 msec) +#=#=#=# Syncrun started 2019-05-11T22:29:26 until 2019-05-11T22:29:29 (3816 msec) +#=#=#=# Syncrun started 2019-05-11T22:31:55 until 2019-05-11T22:32:01 (6097 msec) +#=#=#=# Syncrun started 2019-05-11T23:25:53 until 2019-05-11T23:26:06 (13157 msec) +#=#=#=# Syncrun started 2019-05-11T23:27:54 until 2019-05-11T23:27:58 (3632 msec) +#=#=#=# Syncrun started 2019-05-11T23:30:32 until 2019-05-11T23:30:45 (13253 msec) +#=#=#=# Syncrun started 2019-05-11T23:52:54 until 2019-05-11T23:53:50 (56519 msec) +#=#=#=# Syncrun started 2019-05-11T23:54:31 until 2019-05-11T23:54:36 (5575 msec) +#=#=#=# Syncrun started 2019-05-11T23:58:47 until 2019-05-11T23:59:42 (55539 msec) +#=#=#=# Syncrun started 2019-05-12T00:00:39 until 2019-05-12T00:00:43 (3962 msec) +#=#=#=# Syncrun started 2019-05-12T00:05:15 until 2019-05-12T00:05:19 (3927 msec) +#=#=#=# Syncrun started 2019-05-12T00:12:06 until 2019-05-12T00:12:09 (3661 msec) +#=#=#=# Syncrun started 2019-05-12T02:12:15 until 2019-05-12T02:12:19 (3789 msec) +#=#=#=# Syncrun started 2019-05-12T04:12:45 until 2019-05-12T04:12:49 (3776 msec) +#=#=#=# Syncrun started 2019-05-12T06:13:15 until 2019-05-12T06:13:19 (3951 msec) +#=#=#=# Syncrun started 2019-05-12T08:13:45 until 2019-05-12T08:13:49 (3693 msec) +#=#=#=# Syncrun started 2019-05-12T10:14:15 until 2019-05-12T10:14:19 (3717 msec) +#=#=#=# Syncrun started 2019-05-12T12:14:45 until 2019-05-12T12:14:49 (3690 msec) +#=#=#=# Syncrun started 2019-05-12T14:15:15 until 2019-05-12T14:15:19 (3645 msec) +#=#=#=# Syncrun started 2019-05-12T16:15:45 until 2019-05-12T16:15:49 (3706 msec) +#=#=#=# Syncrun started 2019-05-12T18:16:15 until 2019-05-12T18:16:19 (3745 msec) +#=#=#=# Syncrun started 2019-05-12T20:16:45 until 2019-05-12T20:16:49 (3663 msec) +#=#=#=# Syncrun started 2019-05-12T20:38:13 until 2019-05-12T20:38:18 (4263 msec) +#=#=#=# Syncrun started 2019-05-12T20:41:26 until 2019-05-12T20:41:30 (4195 msec) +#=#=#=# Syncrun started 2019-05-12T21:01:38 until 2019-05-12T21:01:42 (4503 msec) +#=#=#=# Syncrun started 2019-05-13T08:39:45 until 2019-05-13T08:39:49 (3663 msec) +#=#=#=# Syncrun started 2019-05-13T10:39:54 until 2019-05-13T10:39:58 (3785 msec) +#=#=#=# Syncrun started 2019-05-13T10:53:37 until 2019-05-13T10:53:41 (3595 msec) +#=#=#=# Syncrun started 2019-05-13T12:53:54 until 2019-05-13T12:53:58 (3761 msec) +#=#=#=# Syncrun started 2019-05-13T14:54:24 until 2019-05-13T14:54:28 (3704 msec) +#=#=#=# Syncrun started 2019-05-13T16:54:54 until 2019-05-13T16:54:58 (3826 msec) +#=#=#=# Syncrun started 2019-05-13T18:55:24 until 2019-05-13T18:55:27 (3695 msec) +#=#=#=# Syncrun started 2019-05-13T20:55:54 until 2019-05-13T20:55:58 (3748 msec) +#=#=#=# Syncrun started 2019-05-13T22:56:24 until 2019-05-13T22:56:27 (3648 msec) +#=#=#=# Syncrun started 2019-05-14T00:56:54 until 2019-05-14T00:56:58 (3763 msec) +#=#=#=# Syncrun started 2019-05-14T02:57:24 until 2019-05-14T02:57:27 (3685 msec) +#=#=#=# Syncrun started 2019-05-14T04:57:54 until 2019-05-14T04:57:58 (3709 msec) +#=#=#=# Syncrun started 2019-05-14T06:58:24 until 2019-05-14T06:58:27 (3593 msec) +#=#=#=# Syncrun started 2019-05-14T08:58:54 until 2019-05-14T08:58:58 (3709 msec) +#=#=#=# Syncrun started 2019-05-14T10:59:24 until 2019-05-14T10:59:28 (3770 msec) +#=#=#=# Syncrun started 2019-05-14T12:59:54 until 2019-05-14T12:59:57 (3667 msec) +#=#=#=# Syncrun started 2019-05-14T15:00:24 until 2019-05-14T15:00:28 (3705 msec) +#=#=#=# Syncrun started 2019-05-14T17:00:54 until 2019-05-14T17:00:57 (3664 msec) +#=#=#=# Syncrun started 2019-05-14T19:01:24 until 2019-05-14T19:01:28 (3783 msec) +#=#=#=# Syncrun started 2019-05-14T21:01:54 until 2019-05-14T21:01:58 (3754 msec) +#=#=#=# Syncrun started 2019-05-14T23:02:24 until 2019-05-14T23:02:27 (3678 msec) +#=#=#=# Syncrun started 2019-05-15T01:02:54 until 2019-05-15T01:02:58 (3941 msec) +#=#=#=# Syncrun started 2019-05-15T03:03:24 until 2019-05-15T03:03:28 (3850 msec) +#=#=#=# Syncrun started 2019-05-15T05:03:54 until 2019-05-15T05:03:57 (3676 msec) +#=#=#=# Syncrun started 2019-05-15T07:04:24 until 2019-05-15T07:04:27 (3687 msec) +#=#=#=# Syncrun started 2019-05-15T09:04:54 until 2019-05-15T09:04:58 (3707 msec) +#=#=#=# Syncrun started 2019-05-15T11:05:24 until 2019-05-15T11:05:28 (3718 msec) +#=#=#=# Syncrun started 2019-05-15T12:32:17 until 2019-05-15T12:32:21 (3633 msec) +#=#=#=# Syncrun started 2019-05-15T14:32:24 until 2019-05-15T14:32:28 (3716 msec) +#=#=#=# Syncrun started 2019-05-15T16:32:54 until 2019-05-15T16:32:57 (3673 msec) +#=#=#=# Syncrun started 2019-05-15T18:33:24 until 2019-05-15T18:33:27 (3632 msec) +#=#=#=# Syncrun started 2019-05-15T20:33:54 until 2019-05-15T20:33:58 (3722 msec) +#=#=#=# Syncrun started 2019-05-15T22:34:24 until 2019-05-15T22:34:28 (3736 msec) +#=#=#=# Syncrun started 2019-05-16T00:34:54 until 2019-05-16T00:34:57 (3585 msec) +#=#=#=# Syncrun started 2019-05-16T02:35:24 until 2019-05-16T02:35:27 (3657 msec) +#=#=#=# Syncrun started 2019-05-16T04:35:54 until 2019-05-16T04:35:58 (3748 msec) +#=#=#=# Syncrun started 2019-05-16T06:36:24 until 2019-05-16T06:36:28 (3710 msec) +#=#=#=# Syncrun started 2019-05-16T08:36:54 until 2019-05-16T08:36:58 (3750 msec) +#=#=#=# Syncrun started 2019-05-16T10:37:24 until 2019-05-16T10:37:28 (3743 msec) +#=#=#=# Syncrun started 2019-05-16T12:37:54 until 2019-05-16T12:37:58 (3722 msec) +#=#=#=# Syncrun started 2019-05-16T14:38:24 until 2019-05-16T14:38:28 (3990 msec) +#=#=#=# Syncrun started 2019-05-16T16:38:54 until 2019-05-16T16:38:58 (3850 msec) +#=#=#=# Syncrun started 2019-05-16T18:39:24 until 2019-05-16T18:39:27 (3653 msec) +#=#=#=# Syncrun started 2019-05-16T20:39:54 until 2019-05-16T20:39:57 (3688 msec) +#=#=#=# Syncrun started 2019-05-16T22:40:24 until 2019-05-16T22:40:28 (3739 msec) +#=#=#=# Syncrun started 2019-05-17T00:40:54 until 2019-05-17T00:40:57 (3651 msec) +#=#=#=# Syncrun started 2019-05-17T02:41:24 until 2019-05-17T02:41:28 (3757 msec) +#=#=#=# Syncrun started 2019-05-17T04:41:54 until 2019-05-17T04:41:58 (3746 msec) +#=#=#=# Syncrun started 2019-05-17T06:42:24 until 2019-05-17T06:42:27 (3612 msec) +#=#=#=# Syncrun started 2019-05-17T08:42:54 until 2019-05-17T08:42:57 (3557 msec) +#=#=#=# Syncrun started 2019-05-17T10:43:24 until 2019-05-17T10:43:28 (3751 msec) +#=#=#=# Syncrun started 2019-05-17T11:01:37 until 2019-05-17T11:01:41 (3589 msec) +#=#=#=# Syncrun started 2019-05-17T12:04:33 until 2019-05-17T12:04:37 (3576 msec) +#=#=#=# Syncrun started 2019-05-17T12:14:41 until 2019-05-17T12:14:45 (3551 msec) +#=#=#=# Syncrun started 2019-05-17T12:21:38 until 2019-05-17T12:21:42 (3527 msec) +#=#=#=# Syncrun started 2019-05-17T14:21:54 until 2019-05-17T14:21:57 (3683 msec) +#=#=#=# Syncrun started 2019-05-17T15:12:49 until 2019-05-17T15:12:53 (3718 msec) +#=#=#=# Syncrun started 2019-05-17T15:16:01 until 2019-05-17T15:16:05 (3584 msec) +#=#=#=# Syncrun started 2019-05-17T17:16:24 until 2019-05-17T17:16:28 (3725 msec) +#=#=#=# Syncrun started 2019-05-17T19:16:54 until 2019-05-17T19:16:58 (3714 msec) +#=#=#=# Syncrun started 2019-05-17T21:17:24 until 2019-05-17T21:17:27 (3619 msec) +#=#=#=# Syncrun started 2019-05-17T22:14:41 until 2019-05-17T22:14:45 (3631 msec) +#=#=#=# Syncrun started 2019-05-25T13:35:53 until 2019-05-25T13:35:57 (4536 msec) +#=#=#=# Syncrun started 2019-05-25T13:44:25 until 2019-05-25T13:44:29 (4001 msec) +#=#=#=# Syncrun started 2019-05-25T15:49:37 until 2019-05-25T15:49:41 (3713 msec) +#=#=#=# Syncrun started 2019-05-25T16:03:04 until 2019-05-25T16:03:08 (3706 msec) +#=#=#=# Syncrun started 2019-05-25T17:56:40 until 2019-05-25T17:56:44 (3671 msec) +#=#=#=# Syncrun started 2019-05-25T19:59:37 until 2019-05-25T19:59:41 (3737 msec) +#=#=#=# Syncrun started 2019-05-25T22:00:07 until 2019-05-25T22:00:11 (3795 msec) +#=#=#=# Syncrun started 2019-05-26T00:00:37 until 2019-05-26T00:00:41 (3717 msec) +#=#=#=# Syncrun started 2019-05-26T02:01:07 until 2019-05-26T02:01:11 (3981 msec) +#=#=#=# Syncrun started 2019-05-26T04:01:37 until 2019-05-26T04:01:41 (3744 msec) +#=#=#=# Syncrun started 2019-05-26T04:07:13 until 2019-05-26T04:08:17 (63546 msec) +#=#=#=# Syncrun started 2019-05-26T04:09:01 until 2019-05-26T04:09:55 (54038 msec) +#=#=#=# Syncrun started 2019-05-26T04:10:20 until 2019-05-26T04:10:25 (4612 msec) +#=#=#=# Syncrun started 2019-05-26T04:12:11 until 2019-05-26T04:13:05 (53591 msec) +#=#=#=# Syncrun started 2019-05-26T04:14:57 until 2019-05-26T04:15:25 (28058 msec) +#=#=#=# Syncrun started 2019-05-26T04:16:32 until 2019-05-26T04:17:53 (81074 msec) +#=#=#=# Syncrun started 2019-05-26T04:25:42 until 2019-05-26T04:26:25 (42543 msec) +#=#=#=# Syncrun started 2019-05-26T04:27:07 until 2019-05-26T04:28:01 (53460 msec) +#=#=#=# Syncrun started 2019-05-26T04:28:54 until 2019-05-26T04:29:37 (42988 msec) +#=#=#=# Syncrun started 2019-05-26T04:34:37 until 2019-05-26T04:34:42 (4687 msec) +#=#=#=# Syncrun started 2019-05-26T04:41:07 until 2019-05-26T04:41:53 (45465 msec) +#=#=#=# Syncrun started 2019-05-26T04:45:18 until 2019-05-26T04:46:09 (50542 msec) +#=#=#=# Syncrun started 2019-05-26T04:47:08 until 2019-05-26T04:47:45 (36394 msec) +#=#=#=# Syncrun started 2019-05-26T04:49:49 until 2019-05-26T04:50:12 (22995 msec) +#=#=#=# Syncrun started 2019-05-26T04:51:09 until 2019-05-26T04:52:01 (51546 msec) +#=#=#=# Syncrun started 2019-05-26T04:55:57 until 2019-05-26T04:56:49 (51599 msec) +#=#=#=# Syncrun started 2019-05-26T05:03:07 until 2019-05-26T05:03:45 (37597 msec) +#=#=#=# Syncrun started 2019-05-26T05:09:39 until 2019-05-26T05:09:44 (4787 msec) +#=#=#=# Syncrun started 2019-05-26T07:12:37 until 2019-05-26T07:12:41 (3753 msec) +#=#=#=# Syncrun started 2019-05-26T09:13:07 until 2019-05-26T09:13:10 (3635 msec) +#=#=#=# Syncrun started 2019-05-26T11:13:37 until 2019-05-26T11:13:41 (3745 msec) +#=#=#=# Syncrun started 2019-05-26T13:18:07 until 2019-05-26T13:18:11 (3703 msec) +#=#=#=# Syncrun started 2019-05-26T15:18:37 until 2019-05-26T15:18:41 (3724 msec) +#=#=#=# Syncrun started 2019-05-26T17:19:07 until 2019-05-26T17:19:10 (3648 msec) +#=#=#=# Syncrun started 2019-05-26T19:19:37 until 2019-05-26T19:19:41 (3683 msec) +#=#=#=# Syncrun started 2019-05-26T21:20:07 until 2019-05-26T21:20:11 (3674 msec) +#=#=#=# Syncrun started 2019-05-26T23:24:07 until 2019-05-26T23:24:11 (3685 msec) +#=#=#=# Syncrun started 2019-05-27T01:24:37 until 2019-05-27T01:24:40 (3619 msec) +#=#=#=# Syncrun started 2019-05-27T03:25:07 until 2019-05-27T03:25:11 (3763 msec) +#=#=#=# Syncrun started 2019-05-27T05:25:37 until 2019-05-27T05:25:41 (3722 msec) +#=#=#=# Syncrun started 2019-05-27T07:26:07 until 2019-05-27T07:26:11 (3746 msec) +#=#=#=# Syncrun started 2019-05-27T09:26:37 until 2019-05-27T09:26:41 (3714 msec) +#=#=#=# Syncrun started 2019-05-27T11:27:07 until 2019-05-27T11:27:11 (3742 msec) +#=#=#=# Syncrun started 2019-05-27T13:27:37 until 2019-05-27T13:27:41 (3771 msec) +#=#=#=# Syncrun started 2019-05-27T14:20:40 until 2019-05-27T14:20:44 (3648 msec) +#=#=#=# Syncrun started 2019-05-27T16:21:07 until 2019-05-27T16:21:11 (3745 msec) +#=#=#=# Syncrun started 2019-05-27T18:21:37 until 2019-05-27T18:21:41 (3754 msec) +#=#=#=# Syncrun started 2019-05-27T20:22:07 until 2019-05-27T20:22:11 (3694 msec) +#=#=#=# Syncrun started 2019-05-27T22:22:37 until 2019-05-27T22:22:41 (3699 msec) +#=#=#=# Syncrun started 2019-05-28T00:23:07 until 2019-05-28T00:23:11 (3721 msec) +#=#=#=# Syncrun started 2019-05-28T02:23:37 until 2019-05-28T02:23:41 (3688 msec) +#=#=#=# Syncrun started 2019-05-28T04:24:07 until 2019-05-28T04:24:11 (3723 msec) +#=#=#=# Syncrun started 2019-05-28T06:24:37 until 2019-05-28T06:24:41 (3792 msec) +#=#=#=# Syncrun started 2019-05-28T08:06:17 until 2019-05-28T08:06:20 (3671 msec) +#=#=#=# Syncrun started 2019-05-28T09:39:36 until 2019-05-28T09:39:40 (3890 msec) +#=#=#=# Syncrun started 2019-05-28T11:40:07 until 2019-05-28T11:40:10 (3495 msec) +#=#=#=# Syncrun started 2019-05-28T13:40:37 until 2019-05-28T13:40:40 (3533 msec) +#=#=#=# Syncrun started 2019-05-28T15:41:07 until 2019-05-28T15:41:10 (3619 msec) +#=#=#=# Syncrun started 2019-05-28T17:41:37 until 2019-05-28T17:41:40 (3647 msec) +#=#=#=# Syncrun started 2019-05-28T19:42:07 until 2019-05-28T19:42:10 (3568 msec) +#=#=#=# Syncrun started 2019-05-28T21:16:40 until 2019-05-28T21:16:44 (3562 msec) +#=#=#=# Syncrun started 2019-05-28T23:17:07 until 2019-05-28T23:17:10 (3588 msec) +#=#=#=# Syncrun started 2019-05-29T01:17:37 until 2019-05-29T01:17:40 (3610 msec) +#=#=#=# Syncrun started 2019-05-29T03:18:07 until 2019-05-29T03:18:10 (3578 msec) +#=#=#=# Syncrun started 2019-05-29T05:18:37 until 2019-05-29T05:18:41 (3715 msec) +#=#=#=# Syncrun started 2019-05-29T07:19:07 until 2019-05-29T07:19:10 (3596 msec) +#=#=#=# Syncrun started 2019-05-29T09:19:37 until 2019-05-29T09:19:40 (3657 msec) +#=#=#=# Syncrun started 2019-05-29T11:20:07 until 2019-05-29T11:20:10 (3612 msec) +#=#=#=# Syncrun started 2019-05-29T13:20:37 until 2019-05-29T13:20:40 (3652 msec) +#=#=#=# Syncrun started 2019-05-29T15:21:07 until 2019-05-29T15:21:10 (3558 msec) +#=#=#=# Syncrun started 2019-05-29T17:21:37 until 2019-05-29T17:21:40 (3519 msec) +#=#=#=# Syncrun started 2019-05-29T19:22:07 until 2019-05-29T19:22:10 (3483 msec) +#=#=#=# Syncrun started 2019-05-29T21:22:37 until 2019-05-29T21:22:40 (3576 msec) +#=#=#=# Syncrun started 2019-05-29T23:23:07 until 2019-05-29T23:23:10 (3530 msec) +#=#=#=# Syncrun started 2019-05-30T01:23:37 until 2019-05-30T01:23:40 (3562 msec) +#=#=#=# Syncrun started 2019-05-30T03:24:07 until 2019-05-30T03:24:10 (3641 msec) +#=#=#=# Syncrun started 2019-05-30T05:24:37 until 2019-05-30T05:24:41 (3697 msec) +#=#=#=# Syncrun started 2019-05-30T07:25:07 until 2019-05-30T07:25:10 (3606 msec) +#=#=#=# Syncrun started 2019-05-30T09:25:37 until 2019-05-30T09:25:40 (3560 msec) +#=#=#=# Syncrun started 2019-05-30T11:26:07 until 2019-05-30T11:26:10 (3594 msec) +#=#=#=# Syncrun started 2019-05-30T13:26:37 until 2019-05-30T13:26:41 (3721 msec) +#=#=#=# Syncrun started 2019-05-30T15:27:07 until 2019-05-30T15:27:10 (3615 msec) +#=#=#=# Syncrun started 2019-05-30T17:27:37 until 2019-05-30T17:27:41 (3818 msec) +#=#=#=# Syncrun started 2019-05-30T19:32:07 until 2019-05-30T19:32:10 (3548 msec) +#=#=#=# Syncrun started 2019-05-30T21:32:37 until 2019-05-30T21:32:40 (3548 msec) +#=#=#=# Syncrun started 2019-05-30T21:57:12 until 2019-05-30T21:57:16 (3518 msec) +#=#=#=# Syncrun started 2019-05-31T00:02:07 until 2019-05-31T00:02:11 (3700 msec) +#=#=#=# Syncrun started 2019-05-31T02:07:37 until 2019-05-31T02:07:40 (3518 msec) +#=#=#=# Syncrun started 2019-05-31T04:08:07 until 2019-05-31T04:08:10 (3625 msec) +#=#=#=# Syncrun started 2019-05-31T06:08:37 until 2019-05-31T06:08:41 (3811 msec) +#=#=#=# Syncrun started 2019-05-31T08:09:07 until 2019-05-31T08:09:10 (3565 msec) +#=#=#=# Syncrun started 2019-05-31T10:09:37 until 2019-05-31T10:09:40 (3594 msec) +#=#=#=# Syncrun started 2019-05-31T12:10:07 until 2019-05-31T12:10:10 (3537 msec) +#=#=#=# Syncrun started 2019-05-31T14:10:37 until 2019-05-31T14:10:40 (3603 msec) +#=#=#=# Syncrun started 2019-05-31T16:11:07 until 2019-05-31T16:11:10 (3604 msec) +#=#=#=# Syncrun started 2019-05-31T18:11:37 until 2019-05-31T18:11:40 (3614 msec) +#=#=#=# Syncrun started 2019-05-31T20:12:07 until 2019-05-31T20:12:10 (3522 msec) +#=#=#=# Syncrun started 2019-05-31T20:59:36 until 2019-05-31T20:59:40 (3504 msec) +#=#=#=# Syncrun started 2019-05-31T23:00:07 until 2019-05-31T23:00:10 (3448 msec) +#=#=#=# Syncrun started 2019-06-01T01:00:37 until 2019-06-01T01:00:40 (3495 msec) +#=#=#=# Syncrun started 2019-06-01T03:01:07 until 2019-06-01T03:01:10 (3584 msec) +#=#=#=# Syncrun started 2019-06-01T05:01:37 until 2019-06-01T05:01:40 (3538 msec) +#=#=#=# Syncrun started 2019-06-01T07:02:07 until 2019-06-01T07:02:10 (3590 msec) +#=#=#=# Syncrun started 2019-06-01T09:02:37 until 2019-06-01T09:02:40 (3639 msec) +#=#=#=# Syncrun started 2019-06-01T11:03:07 until 2019-06-01T11:03:10 (3603 msec) +#=#=#=# Syncrun started 2019-06-01T12:12:40 until 2019-06-01T12:12:43 (3494 msec) +#=#=#=# Syncrun started 2019-06-01T14:13:07 until 2019-06-01T14:13:10 (3548 msec) +#=#=#=# Syncrun started 2019-06-01T16:13:37 until 2019-06-01T16:13:40 (3529 msec) +#=#=#=# Syncrun started 2019-06-01T18:14:07 until 2019-06-01T18:14:10 (3661 msec) +#=#=#=# Syncrun started 2019-06-01T20:14:37 until 2019-06-01T20:14:40 (3582 msec) +#=#=#=# Syncrun started 2019-06-01T22:06:16 until 2019-06-01T22:06:20 (3555 msec) +#=#=#=# Syncrun started 2019-06-02T00:11:37 until 2019-06-02T00:11:40 (3433 msec) +#=#=#=# Syncrun started 2019-06-02T02:12:07 until 2019-06-02T02:12:10 (3557 msec) +#=#=#=# Syncrun started 2019-06-02T02:58:05 until 2019-06-02T02:58:09 (3498 msec) +#=#=#=# Syncrun started 2019-06-02T03:08:40 until 2019-06-02T03:08:44 (3520 msec) +#=#=#=# Syncrun started 2019-06-02T03:49:44 until 2019-06-02T03:49:47 (3486 msec) +#=#=#=# Syncrun started 2019-06-02T04:32:56 until 2019-06-02T04:33:00 (3450 msec) +#=#=#=# Syncrun started 2019-06-02T06:33:07 until 2019-06-02T06:33:10 (3604 msec) +#=#=#=# Syncrun started 2019-06-02T06:37:12 until 2019-06-02T06:37:16 (3553 msec) +#=#=#=# Syncrun started 2019-06-02T06:53:44 until 2019-06-02T06:53:48 (3566 msec) +#=#=#=# Syncrun started 2019-06-02T08:51:36 until 2019-06-02T08:51:39 (3526 msec) +#=#=#=# Syncrun started 2019-06-02T09:13:02 until 2019-06-02T09:13:06 (3692 msec) +#=#=#=# Syncrun started 2019-06-02T09:14:32 until 2019-06-02T09:14:36 (3540 msec) +#=#=#=# Syncrun started 2019-06-02T09:23:05 until 2019-06-02T09:23:10 (4219 msec) +#=#=#=# Syncrun started 2019-06-02T09:36:57 until 2019-06-02T09:37:00 (3538 msec) +#=#=#=# Syncrun started 2019-06-02T09:40:40 until 2019-06-02T09:40:43 (3517 msec) +#=#=#=# Syncrun started 2019-06-02T09:51:52 until 2019-06-02T09:51:56 (3571 msec) +#=#=#=# Syncrun started 2019-06-02T09:54:34 until 2019-06-02T09:54:37 (3530 msec) +#=#=#=# Syncrun started 2019-06-02T09:59:52 until 2019-06-02T09:59:56 (3713 msec) +#=#=#=# Syncrun started 2019-06-02T10:02:01 until 2019-06-02T10:02:05 (3489 msec) +#=#=#=# Syncrun started 2019-06-02T10:06:16 until 2019-06-02T10:06:19 (3503 msec) +#=#=#=# Syncrun started 2019-06-02T10:09:28 until 2019-06-02T10:09:33 (4862 msec) +#=#=#=# Syncrun started 2019-06-02T10:13:12 until 2019-06-02T10:13:16 (3854 msec) +#=#=#=# Syncrun started 2019-06-02T10:15:20 until 2019-06-02T10:15:24 (3828 msec) +#=#=#=# Syncrun started 2019-06-02T10:21:44 until 2019-06-02T10:21:48 (3572 msec) +#=#=#=# Syncrun started 2019-06-02T10:24:30 until 2019-06-02T10:24:34 (3497 msec) +#=#=#=# Syncrun started 2019-06-02T10:28:08 until 2019-06-02T10:28:11 (3482 msec) +#=#=#=# Syncrun started 2019-06-02T10:30:50 until 2019-06-02T10:30:54 (3561 msec) +#=#=#=# Syncrun started 2019-06-02T10:46:48 until 2019-06-02T10:46:52 (3646 msec) +#=#=#=# Syncrun started 2019-06-02T11:09:13 until 2019-06-02T11:09:16 (3565 msec) +#=#=#=# Syncrun started 2019-06-02T11:10:48 until 2019-06-02T11:10:52 (3471 msec) +#=#=#=# Syncrun started 2019-06-02T11:26:49 until 2019-06-02T11:26:52 (3540 msec) +#=#=#=# Syncrun started 2019-06-02T11:31:07 until 2019-06-02T11:33:05 (118093 msec) +#=#=#=# Syncrun started 2019-06-02T11:33:22 until 2019-06-02T11:33:25 (3535 msec) +#=#=#=# Syncrun started 2019-06-02T11:48:40 until 2019-06-02T11:48:44 (4099 msec) +#=#=#=# Syncrun started 2019-06-02T11:51:52 until 2019-06-02T11:51:56 (3512 msec) +#=#=#=# Syncrun started 2019-06-02T11:55:39 until 2019-06-02T11:55:46 (6872 msec) +#=#=#=# Syncrun started 2019-06-02T11:57:55 until 2019-06-02T11:57:59 (3485 msec) +#=#=#=# Syncrun started 2019-06-02T12:06:41 until 2019-06-02T12:06:45 (4097 msec) +#=#=#=# Syncrun started 2019-06-02T12:12:42 until 2019-06-02T12:12:46 (4065 msec) +#=#=#=# Syncrun started 2019-06-02T12:18:33 until 2019-06-02T12:18:37 (3821 msec) +#=#=#=# Syncrun started 2019-06-02T12:20:42 until 2019-06-02T12:20:47 (5299 msec) +#=#=#=# Syncrun started 2019-06-02T12:25:30 until 2019-06-02T12:25:34 (3779 msec) +#=#=#=# Syncrun started 2019-06-02T13:08:35 until 2019-06-02T13:09:05 (30030 msec) +#=#=#=# Syncrun started 2019-06-02T13:09:14 until 2019-06-02T13:09:17 (3844 msec) +#=#=#=# Syncrun started 2019-06-02T13:24:41 until 2019-06-02T13:24:44 (3497 msec) +#=#=#=# Syncrun started 2019-06-02T15:26:07 until 2019-06-02T15:26:09 (2021 msec) +#=#=#=# Syncrun started 2019-06-02T15:26:16 until 2019-06-02T15:26:20 (3564 msec) +#=#=#=# Syncrun started 2019-06-02T17:26:37 until 2019-06-02T17:26:40 (3608 msec) +#=#=#=# Syncrun started 2019-06-02T19:27:07 until 2019-06-02T19:27:10 (3567 msec) +#=#=#=# Syncrun started 2019-06-02T21:19:52 until 2019-06-02T21:19:56 (3576 msec) +#=#=#=# Syncrun started 2019-06-02T23:20:07 until 2019-06-02T23:20:10 (3497 msec) +#=#=#=# Syncrun started 2019-06-03T01:20:37 until 2019-06-03T01:20:40 (3550 msec) +#=#=#=# Syncrun started 2019-06-03T03:21:07 until 2019-06-03T03:21:10 (3586 msec) +#=#=#=# Syncrun started 2019-06-03T03:23:04 until 2019-06-03T03:23:07 (3538 msec) +#=#=#=# Syncrun started 2019-06-03T05:27:37 until 2019-06-03T05:27:40 (3626 msec) +#=#=#=# Syncrun started 2019-06-03T07:28:07 until 2019-06-03T07:28:10 (3467 msec) +#=#=#=# Syncrun started 2019-06-03T09:28:37 until 2019-06-03T09:28:40 (3532 msec) +#=#=#=# Syncrun started 2019-06-03T11:29:07 until 2019-06-03T11:29:10 (3593 msec) +#=#=#=# Syncrun started 2019-06-03T13:29:37 until 2019-06-03T13:29:41 (3687 msec) +#=#=#=# Syncrun started 2019-06-03T15:30:07 until 2019-06-03T15:30:10 (3500 msec) +#=#=#=# Syncrun started 2019-06-03T17:30:37 until 2019-06-03T17:30:40 (3520 msec) +#=#=#=# Syncrun started 2019-06-03T19:31:07 until 2019-06-03T19:31:10 (3462 msec) +#=#=#=# Syncrun started 2019-06-03T21:31:37 until 2019-06-03T21:31:40 (3537 msec) +#=#=#=# Syncrun started 2019-06-23T01:38:46 until 2019-06-23T01:38:50 (4499 msec) +#=#=#=# Syncrun started 2019-06-23T03:41:03 until 2019-06-23T03:41:07 (4109 msec) +#=#=#=# Syncrun started 2019-06-23T05:42:33 until 2019-06-23T05:42:37 (3670 msec) +#=#=#=# Syncrun started 2019-06-23T07:43:03 until 2019-06-23T07:43:07 (3702 msec) +#=#=#=# Syncrun started 2019-06-23T09:43:33 until 2019-06-23T09:43:37 (3908 msec) +#=#=#=# Syncrun started 2019-06-23T11:44:03 until 2019-06-23T11:44:07 (3634 msec) +#=#=#=# Syncrun started 2019-06-23T13:44:33 until 2019-06-23T13:44:37 (3756 msec) +#=#=#=# Syncrun started 2019-06-23T15:45:03 until 2019-06-23T15:45:07 (3755 msec) +#=#=#=# Syncrun started 2019-06-23T17:45:33 until 2019-06-23T17:45:37 (3692 msec) +#=#=#=# Syncrun started 2019-06-23T19:46:03 until 2019-06-23T19:46:07 (3920 msec) +#=#=#=# Syncrun started 2019-06-23T21:46:33 until 2019-06-23T21:46:37 (3778 msec) +#=#=#=# Syncrun started 2019-06-23T23:47:03 until 2019-06-23T23:47:07 (3748 msec) +#=#=#=# Syncrun started 2019-06-24T01:47:33 until 2019-06-24T01:47:37 (3874 msec) +#=#=#=# Syncrun started 2019-06-24T03:48:03 until 2019-06-24T03:48:07 (3741 msec) +#=#=#=# Syncrun started 2019-06-24T05:48:33 until 2019-06-24T05:48:37 (3672 msec) +#=#=#=# Syncrun started 2019-06-24T07:49:03 until 2019-06-24T07:49:07 (3677 msec) +#=#=#=# Syncrun started 2019-06-24T09:49:33 until 2019-06-24T09:49:37 (3676 msec) +#=#=#=# Syncrun started 2019-06-24T11:50:03 until 2019-06-24T11:50:08 (4110 msec) +#=#=#=# Syncrun started 2019-06-24T13:50:33 until 2019-06-24T13:50:37 (3759 msec) +#=#=#=# Syncrun started 2019-06-24T15:51:03 until 2019-06-24T15:51:07 (4028 msec) +#=#=#=# Syncrun started 2019-06-24T15:56:22 until 2019-06-24T15:56:26 (3710 msec) +#=#=#=# Syncrun started 2019-06-24T17:56:33 until 2019-06-24T17:56:38 (4112 msec) +#=#=#=# Syncrun started 2019-06-24T20:01:33 until 2019-06-24T20:01:37 (4041 msec) +#=#=#=# Syncrun started 2019-06-24T22:02:03 until 2019-06-24T22:02:07 (4022 msec) +#=#=#=# Syncrun started 2019-06-25T00:02:33 until 2019-06-25T00:02:37 (3725 msec) +#=#=#=# Syncrun started 2019-07-13T10:55:23 until 2019-07-13T10:55:28 (4783 msec) +#=#=#=# Syncrun started 2019-07-13T12:55:53 until 2019-07-13T12:55:57 (3931 msec) +#=#=#=# Syncrun started 2019-07-13T14:01:13 until 2019-07-13T14:01:17 (3757 msec) +#=#=#=# Syncrun started 2019-07-13T16:01:23 until 2019-07-13T16:01:26 (3727 msec) +#=#=#=# Syncrun started 2019-07-13T18:01:53 until 2019-07-13T18:01:56 (3720 msec) +#=#=#=# Syncrun started 2019-07-13T20:02:23 until 2019-07-13T20:02:26 (3694 msec) +#=#=#=# Syncrun started 2019-07-13T22:02:53 until 2019-07-13T22:02:56 (3752 msec) +#=#=#=# Syncrun started 2019-07-14T00:03:23 until 2019-07-14T00:03:26 (3698 msec) +#=#=#=# Syncrun started 2019-07-14T02:03:53 until 2019-07-14T02:03:56 (3708 msec) +#=#=#=# Syncrun started 2019-07-14T04:04:23 until 2019-07-14T04:04:26 (3681 msec) +#=#=#=# Syncrun started 2019-07-14T06:04:53 until 2019-07-14T06:04:56 (3724 msec) +#=#=#=# Syncrun started 2019-07-14T08:05:23 until 2019-07-14T08:05:26 (3694 msec) +#=#=#=# Syncrun started 2019-07-14T10:05:53 until 2019-07-14T10:05:56 (3717 msec) +#=#=#=# Syncrun started 2019-07-14T12:06:23 until 2019-07-14T12:06:26 (3757 msec) +#=#=#=# Syncrun started 2019-07-14T14:06:53 until 2019-07-14T14:06:56 (3720 msec) +#=#=#=# Syncrun started 2019-07-14T16:07:23 until 2019-07-14T16:07:27 (3786 msec) +#=#=#=# Syncrun started 2019-07-14T18:07:53 until 2019-07-14T18:07:57 (3803 msec) +#=#=#=# Syncrun started 2019-07-14T20:08:23 until 2019-07-14T20:08:27 (3785 msec) +#=#=#=# Syncrun started 2019-07-14T22:08:53 until 2019-07-14T22:08:56 (3719 msec) +#=#=#=# Syncrun started 2019-07-15T00:09:23 until 2019-07-15T00:09:27 (3846 msec) +#=#=#=# Syncrun started 2019-07-15T02:09:53 until 2019-07-15T02:09:57 (3789 msec) +#=#=#=# Syncrun started 2019-07-15T04:10:23 until 2019-07-15T04:10:27 (3826 msec) +#=#=#=# Syncrun started 2019-07-15T06:10:53 until 2019-07-15T06:10:57 (3806 msec) +#=#=#=# Syncrun started 2019-07-15T08:11:23 until 2019-07-15T08:11:26 (3730 msec) +#=#=#=# Syncrun started 2019-07-15T10:11:53 until 2019-07-15T10:11:56 (3672 msec) +#=#=#=# Syncrun started 2019-07-15T12:12:23 until 2019-07-15T12:12:26 (3632 msec) +#=#=#=# Syncrun started 2019-07-15T14:12:53 until 2019-07-15T14:12:56 (3655 msec) +#=#=#=# Syncrun started 2019-07-15T16:13:23 until 2019-07-15T16:13:26 (3695 msec) +#=#=#=# Syncrun started 2019-07-15T18:13:53 until 2019-07-15T18:13:56 (3723 msec) +#=#=#=# Syncrun started 2019-07-15T20:14:23 until 2019-07-15T20:14:26 (3722 msec) +#=#=#=# Syncrun started 2019-07-15T22:14:53 until 2019-07-15T22:14:57 (3801 msec) +#=#=#=# Syncrun started 2019-07-16T00:15:23 until 2019-07-16T00:15:27 (3762 msec) +#=#=#=# Syncrun started 2019-07-16T02:15:53 until 2019-07-16T02:15:57 (3777 msec) +#=#=#=# Syncrun started 2019-07-16T04:16:23 until 2019-07-16T04:16:27 (3799 msec) +#=#=#=# Syncrun started 2019-07-16T06:16:53 until 2019-07-16T06:16:57 (3789 msec) +#=#=#=# Syncrun started 2019-07-16T08:17:23 until 2019-07-16T08:17:26 (3743 msec) +#=#=#=# Syncrun started 2019-07-16T10:17:53 until 2019-07-16T10:17:56 (3740 msec) +#=#=#=# Syncrun started 2019-07-16T12:18:23 until 2019-07-16T12:18:26 (3741 msec) +#=#=#=# Syncrun started 2019-07-16T14:18:53 until 2019-07-16T14:18:56 (3701 msec) +#=#=#=# Syncrun started 2019-07-16T16:19:23 until 2019-07-16T16:19:27 (3791 msec) +#=#=#=# Syncrun started 2019-07-16T18:19:53 until 2019-07-16T18:19:57 (3798 msec) +#=#=#=# Syncrun started 2019-07-16T20:20:23 until 2019-07-16T20:20:26 (3719 msec) +#=#=#=# Syncrun started 2019-07-16T22:20:53 until 2019-07-16T22:20:56 (3705 msec) +#=#=#=# Syncrun started 2019-07-17T00:21:23 until 2019-07-17T00:21:27 (3778 msec) +#=#=#=# Syncrun started 2019-07-17T02:21:53 until 2019-07-17T02:21:57 (3800 msec) +#=#=#=# Syncrun started 2019-07-17T04:22:23 until 2019-07-17T04:22:26 (3749 msec) +#=#=#=# Syncrun started 2019-07-17T06:22:53 until 2019-07-17T06:22:56 (3751 msec) +#=#=#=# Syncrun started 2019-07-17T08:23:23 until 2019-07-17T08:23:27 (3780 msec) +#=#=#=# Syncrun started 2019-07-17T10:23:53 until 2019-07-17T10:23:56 (3661 msec) +#=#=#=# Syncrun started 2019-07-17T12:24:23 until 2019-07-17T12:24:27 (3783 msec) +#=#=#=# Syncrun started 2019-07-17T14:24:53 until 2019-07-17T14:24:57 (3766 msec) +#=#=#=# Syncrun started 2019-07-17T16:25:23 until 2019-07-17T16:25:27 (3813 msec) +#=#=#=# Syncrun started 2019-07-17T18:25:53 until 2019-07-17T18:25:56 (3672 msec) +#=#=#=# Syncrun started 2019-07-17T20:26:23 until 2019-07-17T20:26:26 (3731 msec) +#=#=#=# Syncrun started 2019-07-17T22:26:53 until 2019-07-17T22:26:57 (3803 msec) +#=#=#=# Syncrun started 2019-07-18T00:27:23 until 2019-07-18T00:27:27 (3770 msec) +#=#=#=# Syncrun started 2019-07-18T02:27:53 until 2019-07-18T02:27:57 (3797 msec) +#=#=#=# Syncrun started 2019-07-18T04:28:23 until 2019-07-18T04:28:26 (3683 msec) +#=#=#=# Syncrun started 2019-07-18T06:28:53 until 2019-07-18T06:28:56 (3698 msec) +#=#=#=# Syncrun started 2019-07-18T08:29:23 until 2019-07-18T08:29:27 (3774 msec) +#=#=#=# Syncrun started 2019-07-18T10:29:53 until 2019-07-18T10:29:56 (3720 msec) +#=#=#=# Syncrun started 2019-07-18T12:30:23 until 2019-07-18T12:30:26 (3740 msec) +#=#=#=# Syncrun started 2019-07-18T14:30:53 until 2019-07-18T14:30:56 (3707 msec) +#=#=#=# Syncrun started 2019-07-18T16:31:23 until 2019-07-18T16:31:27 (3763 msec) +#=#=#=# Syncrun started 2019-07-18T18:31:53 until 2019-07-18T18:31:56 (3686 msec) +#=#=#=# Syncrun started 2019-07-18T20:32:23 until 2019-07-18T20:32:27 (3825 msec) +#=#=#=# Syncrun started 2019-07-18T22:32:53 until 2019-07-18T22:32:57 (3825 msec) +#=#=#=# Syncrun started 2019-07-19T00:33:23 until 2019-07-19T00:33:27 (3780 msec) +#=#=#=# Syncrun started 2019-07-19T02:33:53 until 2019-07-19T02:33:57 (3881 msec) +#=#=#=# Syncrun started 2019-07-19T04:34:23 until 2019-07-19T04:34:27 (3824 msec) +#=#=#=# Syncrun started 2019-07-19T06:34:53 until 2019-07-19T06:34:56 (3749 msec) +#=#=#=# Syncrun started 2019-07-19T08:35:23 until 2019-07-19T08:35:26 (3690 msec) +#=#=#=# Syncrun started 2019-07-19T10:35:53 until 2019-07-19T10:35:57 (3763 msec) +#=#=#=# Syncrun started 2019-07-19T12:36:23 until 2019-07-19T12:36:26 (3686 msec) +#=#=#=# Syncrun started 2019-07-19T14:36:53 until 2019-07-19T14:36:56 (3723 msec) +#=#=#=# Syncrun started 2019-07-19T16:37:23 until 2019-07-19T16:37:26 (3731 msec) +#=#=#=# Syncrun started 2019-07-19T18:37:53 until 2019-07-19T18:37:56 (3700 msec) +#=#=#=# Syncrun started 2019-07-19T20:38:23 until 2019-07-19T20:38:26 (3695 msec) +#=#=#=# Syncrun started 2019-07-19T22:38:53 until 2019-07-19T22:38:57 (3785 msec) +#=#=#=# Syncrun started 2019-07-20T00:39:23 until 2019-07-20T00:39:27 (3843 msec) +#=#=#=# Syncrun started 2019-07-20T02:39:53 until 2019-07-20T02:39:57 (3914 msec) +#=#=#=# Syncrun started 2019-07-20T04:40:23 until 2019-07-20T04:40:27 (3792 msec) +#=#=#=# Syncrun started 2019-07-20T06:40:53 until 2019-07-20T06:40:56 (3760 msec) +#=#=#=# Syncrun started 2019-07-20T08:41:23 until 2019-07-20T08:41:27 (3786 msec) +#=#=#=# Syncrun started 2019-07-20T10:41:53 until 2019-07-20T10:41:57 (3833 msec) +#=#=#=# Syncrun started 2019-07-20T12:42:23 until 2019-07-20T12:42:26 (3732 msec) +#=#=#=# Syncrun started 2019-07-20T14:42:53 until 2019-07-20T14:42:57 (3800 msec) +#=#=#=# Syncrun started 2019-07-20T16:43:23 until 2019-07-20T16:43:27 (3759 msec) +#=#=#=# Syncrun started 2019-07-20T18:43:53 until 2019-07-20T18:43:57 (3795 msec) +#=#=#=# Syncrun started 2019-07-20T20:44:23 until 2019-07-20T20:44:26 (3580 msec) +#=#=#=# Syncrun started 2019-07-20T22:44:53 until 2019-07-20T22:44:56 (3726 msec) +#=#=#=# Syncrun started 2019-07-21T00:45:23 until 2019-07-21T00:45:26 (3662 msec) +#=#=#=# Syncrun started 2019-07-21T02:45:53 until 2019-07-21T02:45:56 (3741 msec) +#=#=#=# Syncrun started 2019-07-21T04:46:23 until 2019-07-21T04:46:26 (3680 msec) +#=#=#=# Syncrun started 2019-07-21T06:46:53 until 2019-07-21T06:46:56 (3592 msec) +#=#=#=# Syncrun started 2019-07-21T08:47:23 until 2019-07-21T08:47:26 (3659 msec) +#=#=#=# Syncrun started 2019-07-21T10:47:53 until 2019-07-21T10:47:56 (3653 msec) +#=#=#=# Syncrun started 2019-07-21T12:48:23 until 2019-07-21T12:48:26 (3609 msec) +#=#=#=# Syncrun started 2019-07-21T14:48:53 until 2019-07-21T14:48:56 (3638 msec) +#=#=#=# Syncrun started 2019-07-21T16:49:23 until 2019-07-21T16:49:26 (3667 msec) +#=#=#=# Syncrun started 2019-07-21T18:49:53 until 2019-07-21T18:49:56 (3687 msec) +#=#=#=# Syncrun started 2019-07-21T20:50:23 until 2019-07-21T20:50:26 (3663 msec) +#=#=#=# Syncrun started 2019-07-21T22:50:53 until 2019-07-21T22:50:56 (3736 msec) +#=#=#=# Syncrun started 2019-07-22T00:51:23 until 2019-07-22T00:51:26 (3654 msec) +#=#=#=# Syncrun started 2019-07-22T02:51:53 until 2019-07-22T02:51:57 (3846 msec) +#=#=#=# Syncrun started 2019-07-22T04:52:23 until 2019-07-22T04:52:26 (3619 msec) +#=#=#=# Syncrun started 2019-07-22T06:52:53 until 2019-07-22T06:52:56 (3675 msec) +#=#=#=# Syncrun started 2019-07-22T08:53:23 until 2019-07-22T08:53:26 (3600 msec) +#=#=#=# Syncrun started 2019-07-22T10:53:53 until 2019-07-22T10:53:56 (3671 msec) +#=#=#=# Syncrun started 2019-07-22T12:54:23 until 2019-07-22T12:54:26 (3645 msec) +#=#=#=# Syncrun started 2019-07-22T14:54:53 until 2019-07-22T14:54:56 (3689 msec) +#=#=#=# Syncrun started 2019-07-22T16:55:23 until 2019-07-22T16:55:27 (3767 msec) +#=#=#=# Syncrun started 2019-07-22T18:55:53 until 2019-07-22T18:55:56 (3631 msec) +#=#=#=# Syncrun started 2019-07-22T20:56:23 until 2019-07-22T20:56:26 (3653 msec) +#=#=#=# Syncrun started 2019-07-22T22:56:53 until 2019-07-22T22:56:56 (3638 msec) +#=#=#=# Syncrun started 2019-07-23T00:57:23 until 2019-07-23T00:57:26 (3664 msec) +#=#=#=# Syncrun started 2019-07-23T02:57:53 until 2019-07-23T02:57:56 (3649 msec) +#=#=#=# Syncrun started 2019-07-23T04:58:23 until 2019-07-23T04:58:26 (3665 msec) +#=#=#=# Syncrun started 2019-07-23T06:58:53 until 2019-07-23T06:58:56 (3568 msec) +#=#=#=# Syncrun started 2019-07-23T08:59:23 until 2019-07-23T08:59:26 (3682 msec) +#=#=#=# Syncrun started 2019-07-23T10:59:53 until 2019-07-23T10:59:56 (3634 msec) +#=#=#=# Syncrun started 2019-07-23T13:00:23 until 2019-07-23T13:00:26 (3579 msec) +#=#=#=# Syncrun started 2019-07-23T15:00:53 until 2019-07-23T15:00:56 (3675 msec) +#=#=#=# Syncrun started 2019-07-23T17:01:23 until 2019-07-23T17:01:26 (3696 msec) +#=#=#=# Syncrun started 2019-07-23T19:01:53 until 2019-07-23T19:01:56 (3599 msec) +#=#=#=# Syncrun started 2019-07-23T21:02:23 until 2019-07-23T21:02:26 (3603 msec) +#=#=#=# Syncrun started 2019-07-23T23:02:53 until 2019-07-23T23:02:56 (3674 msec) +#=#=#=# Syncrun started 2019-07-24T01:03:23 until 2019-07-24T01:03:26 (3689 msec) +#=#=#=# Syncrun started 2019-07-24T03:03:53 until 2019-07-24T03:03:56 (3587 msec) +#=#=#=# Syncrun started 2019-07-24T05:04:23 until 2019-07-24T05:04:26 (3655 msec) +#=#=#=# Syncrun started 2019-07-24T07:04:53 until 2019-07-24T07:04:56 (3647 msec) +#=#=#=# Syncrun started 2019-07-24T09:05:23 until 2019-07-24T09:05:26 (3552 msec) +#=#=#=# Syncrun started 2019-07-24T11:05:53 until 2019-07-24T11:05:56 (3621 msec) +#=#=#=# Syncrun started 2019-07-24T13:06:23 until 2019-07-24T13:06:26 (3671 msec) +#=#=#=# Syncrun started 2019-07-24T15:06:53 until 2019-07-24T15:06:56 (3683 msec) +#=#=#=# Syncrun started 2019-07-24T17:07:23 until 2019-07-24T17:07:26 (3626 msec) +#=#=#=# Syncrun started 2019-07-24T19:07:53 until 2019-07-24T19:07:56 (3648 msec) +#=#=#=# Syncrun started 2019-07-24T21:08:23 until 2019-07-24T21:08:26 (3555 msec) +#=#=#=# Syncrun started 2019-07-24T23:08:53 until 2019-07-24T23:08:56 (3671 msec) +#=#=#=# Syncrun started 2019-07-25T01:09:23 until 2019-07-25T01:09:26 (3622 msec) +#=#=#=# Syncrun started 2019-07-25T03:09:53 until 2019-07-25T03:09:56 (3645 msec) +#=#=#=# Syncrun started 2019-07-25T05:10:23 until 2019-07-25T05:10:26 (3607 msec) +#=#=#=# Syncrun started 2019-07-25T07:10:53 until 2019-07-25T07:10:56 (3593 msec) +#=#=#=# Syncrun started 2019-07-25T09:11:23 until 2019-07-25T09:11:26 (3548 msec) +#=#=#=# Syncrun started 2019-07-25T11:11:53 until 2019-07-25T11:11:56 (3549 msec) +#=#=#=# Syncrun started 2019-07-25T13:12:23 until 2019-07-25T13:12:26 (3583 msec) +#=#=#=# Syncrun started 2019-07-25T15:12:53 until 2019-07-25T15:12:56 (3553 msec) +#=#=#=# Syncrun started 2019-07-25T17:13:23 until 2019-07-25T17:13:26 (3662 msec) +#=#=#=# Syncrun started 2019-07-25T19:13:53 until 2019-07-25T19:13:56 (3677 msec) +#=#=#=# Syncrun started 2019-07-25T21:14:23 until 2019-07-25T21:14:26 (3695 msec) +#=#=#=# Syncrun started 2019-07-25T23:14:53 until 2019-07-25T23:14:56 (3637 msec) +#=#=#=# Syncrun started 2019-07-26T01:15:23 until 2019-07-26T01:15:26 (3629 msec) +#=#=#=# Syncrun started 2019-07-26T03:15:53 until 2019-07-26T03:15:56 (3677 msec) +#=#=#=# Syncrun started 2019-07-26T05:16:23 until 2019-07-26T05:16:26 (3582 msec) +#=#=#=# Syncrun started 2019-07-26T07:16:53 until 2019-07-26T07:16:56 (3622 msec) +#=#=#=# Syncrun started 2019-07-26T09:17:23 until 2019-07-26T09:17:26 (3612 msec) +#=#=#=# Syncrun started 2019-07-26T11:17:53 until 2019-07-26T11:17:56 (3622 msec) +#=#=#=# Syncrun started 2019-07-26T13:18:23 until 2019-07-26T13:18:26 (3615 msec) +#=#=#=# Syncrun started 2019-07-26T15:18:53 until 2019-07-26T15:18:56 (3612 msec) +#=#=#=# Syncrun started 2019-07-26T17:19:23 until 2019-07-26T17:19:26 (3644 msec) +#=#=#=# Syncrun started 2019-07-26T19:19:53 until 2019-07-26T19:19:56 (3703 msec) +#=#=#=# Syncrun started 2019-07-26T21:20:23 until 2019-07-26T21:20:26 (3669 msec) +#=#=#=# Syncrun started 2019-07-26T23:20:53 until 2019-07-26T23:20:56 (3653 msec) +#=#=#=# Syncrun started 2019-07-27T01:21:23 until 2019-07-27T01:21:26 (3646 msec) +#=#=#=# Syncrun started 2019-07-27T03:21:53 until 2019-07-27T03:21:56 (3653 msec) +#=#=#=# Syncrun started 2019-07-27T05:22:23 until 2019-07-27T05:22:26 (3646 msec) +#=#=#=# Syncrun started 2019-07-27T07:22:53 until 2019-07-27T07:22:56 (3563 msec) +#=#=#=# Syncrun started 2019-07-27T09:23:23 until 2019-07-27T09:23:26 (3593 msec) +#=#=#=# Syncrun started 2019-07-27T11:23:53 until 2019-07-27T11:23:56 (3580 msec) +#=#=#=# Syncrun started 2019-07-27T13:24:23 until 2019-07-27T13:24:26 (3554 msec) +#=#=#=# Syncrun started 2019-07-27T15:24:53 until 2019-07-27T15:24:56 (3611 msec) +#=#=#=# Syncrun started 2019-07-27T17:25:23 until 2019-07-27T17:25:26 (3612 msec) +#=#=#=# Syncrun started 2019-07-27T19:25:53 until 2019-07-27T19:25:56 (3566 msec) +#=#=#=# Syncrun started 2019-07-27T21:26:23 until 2019-07-27T21:26:26 (3590 msec) +#=#=#=# Syncrun started 2019-07-27T23:26:53 until 2019-07-27T23:26:56 (3687 msec) +#=#=#=# Syncrun started 2019-07-28T01:27:23 until 2019-07-28T01:27:26 (3597 msec) +#=#=#=# Syncrun started 2019-07-28T03:27:53 until 2019-07-28T03:27:56 (3625 msec) +#=#=#=# Syncrun started 2019-07-28T05:28:23 until 2019-07-28T05:28:26 (3660 msec) +#=#=#=# Syncrun started 2019-07-28T07:28:53 until 2019-07-28T07:28:56 (3562 msec) +#=#=#=# Syncrun started 2019-07-28T09:29:23 until 2019-07-28T09:29:26 (3597 msec) +#=#=#=# Syncrun started 2019-07-28T11:29:53 until 2019-07-28T11:29:56 (3614 msec) +#=#=#=# Syncrun started 2019-07-28T13:30:23 until 2019-07-28T13:30:26 (3647 msec) +#=#=#=# Syncrun started 2019-07-28T15:30:53 until 2019-07-28T15:30:56 (3620 msec) +#=#=#=# Syncrun started 2019-07-28T17:31:23 until 2019-07-28T17:31:26 (3562 msec) +#=#=#=# Syncrun started 2019-07-28T19:31:53 until 2019-07-28T19:31:56 (3646 msec) +#=#=#=# Syncrun started 2019-07-28T21:32:23 until 2019-07-28T21:32:26 (3560 msec) +#=#=#=# Syncrun started 2019-07-28T23:32:53 until 2019-07-28T23:32:56 (3635 msec) +#=#=#=# Syncrun started 2019-07-29T01:33:23 until 2019-07-29T01:33:26 (3743 msec) +#=#=#=# Syncrun started 2019-07-29T03:33:53 until 2019-07-29T03:33:56 (3643 msec) +#=#=#=# Syncrun started 2019-07-29T05:34:23 until 2019-07-29T05:34:26 (3617 msec) +#=#=#=# Syncrun started 2019-07-29T07:34:53 until 2019-07-29T07:34:56 (3619 msec) +#=#=#=# Syncrun started 2019-07-29T09:35:23 until 2019-07-29T09:35:26 (3648 msec) +#=#=#=# Syncrun started 2019-07-29T11:35:53 until 2019-07-29T11:35:56 (3569 msec) +#=#=#=# Syncrun started 2019-07-29T13:36:23 until 2019-07-29T13:36:26 (3579 msec) +#=#=#=# Syncrun started 2019-07-29T15:36:53 until 2019-07-29T15:36:56 (3652 msec) +#=#=#=# Syncrun started 2019-07-29T17:37:23 until 2019-07-29T17:37:26 (3568 msec) +#=#=#=# Syncrun started 2019-07-29T19:37:53 until 2019-07-29T19:37:56 (3558 msec) +#=#=#=# Syncrun started 2019-07-29T21:38:23 until 2019-07-29T21:38:26 (3613 msec) +#=#=#=# Syncrun started 2019-07-29T23:38:53 until 2019-07-29T23:38:56 (3539 msec) +#=#=#=# Syncrun started 2019-07-30T01:39:23 until 2019-07-30T01:39:26 (3616 msec) +#=#=#=# Syncrun started 2019-07-30T03:39:53 until 2019-07-30T03:39:56 (3599 msec) +#=#=#=# Syncrun started 2019-07-30T05:40:23 until 2019-07-30T05:40:26 (3585 msec) +#=#=#=# Syncrun started 2019-07-30T07:40:53 until 2019-07-30T07:40:56 (3561 msec) +#=#=#=# Syncrun started 2019-07-30T09:41:23 until 2019-07-30T09:41:26 (3637 msec) +#=#=#=# Syncrun started 2019-07-30T11:41:53 until 2019-07-30T11:41:56 (3650 msec) +#=#=#=# Syncrun started 2019-07-30T13:42:23 until 2019-07-30T13:42:26 (3574 msec) +#=#=#=# Syncrun started 2019-07-30T15:42:53 until 2019-07-30T15:42:56 (3636 msec) +#=#=#=# Syncrun started 2019-07-30T17:43:23 until 2019-07-30T17:43:26 (3597 msec) +#=#=#=# Syncrun started 2019-07-30T19:43:53 until 2019-07-30T19:43:56 (3608 msec) +#=#=#=# Syncrun started 2019-07-30T21:44:23 until 2019-07-30T21:44:26 (3654 msec) +#=#=#=# Syncrun started 2019-07-30T22:46:01 until 2019-07-30T22:46:05 (3713 msec) +#=#=#=# Syncrun started 2019-07-31T00:46:23 until 2019-07-31T00:46:26 (3617 msec) +#=#=#=# Syncrun started 2019-07-31T02:46:53 until 2019-07-31T02:46:56 (3644 msec) +#=#=#=# Syncrun started 2019-07-31T04:47:23 until 2019-07-31T04:47:26 (3653 msec) +#=#=#=# Syncrun started 2019-07-31T06:47:53 until 2019-07-31T06:47:56 (3567 msec) +#=#=#=# Syncrun started 2019-07-31T08:48:23 until 2019-07-31T08:48:26 (3615 msec) +#=#=#=# Syncrun started 2019-07-31T10:48:53 until 2019-07-31T10:48:56 (3640 msec) +#=#=#=# Syncrun started 2019-07-31T12:49:23 until 2019-07-31T12:49:26 (3699 msec) +#=#=#=# Syncrun started 2019-07-31T14:49:53 until 2019-07-31T14:49:56 (3669 msec) +#=#=#=# Syncrun started 2019-07-31T16:50:23 until 2019-07-31T16:50:26 (3638 msec) +#=#=#=# Syncrun started 2019-07-31T18:50:53 until 2019-07-31T18:50:56 (3704 msec) +#=#=#=# Syncrun started 2019-07-31T20:51:23 until 2019-07-31T20:51:26 (3653 msec) +#=#=#=# Syncrun started 2019-07-31T22:51:53 until 2019-07-31T22:51:56 (3668 msec) +#=#=#=# Syncrun started 2019-08-01T00:52:23 until 2019-08-01T00:52:26 (3559 msec) +#=#=#=# Syncrun started 2019-08-01T02:52:53 until 2019-08-01T02:52:56 (3624 msec) +#=#=#=# Syncrun started 2019-08-01T04:53:23 until 2019-08-01T04:53:26 (3581 msec) +#=#=#=# Syncrun started 2019-08-01T06:53:53 until 2019-08-01T06:53:56 (3591 msec) +#=#=#=# Syncrun started 2019-08-01T08:54:23 until 2019-08-01T08:54:26 (3604 msec) +#=#=#=# Syncrun started 2019-08-01T10:54:53 until 2019-08-01T10:54:56 (3607 msec) +#=#=#=# Syncrun started 2019-08-01T12:55:23 until 2019-08-01T12:55:26 (3610 msec) +#=#=#=# Syncrun started 2019-08-01T14:55:53 until 2019-08-01T14:55:56 (3649 msec) +#=#=#=# Syncrun started 2019-08-01T16:49:46 until 2019-08-01T16:49:50 (3548 msec) +#=#=#=# Syncrun started 2019-08-01T18:49:53 until 2019-08-01T18:49:56 (3634 msec) +#=#=#=# Syncrun started 2019-08-01T20:50:23 until 2019-08-01T20:50:26 (3576 msec) +#=#=#=# Syncrun started 2019-08-01T22:50:53 until 2019-08-01T22:50:56 (3638 msec) +#=#=#=# Syncrun started 2019-08-02T00:51:23 until 2019-08-02T00:51:26 (3607 msec) +#=#=#=# Syncrun started 2019-08-02T02:51:53 until 2019-08-02T02:51:56 (3641 msec) +#=#=#=# Syncrun started 2019-08-02T04:52:23 until 2019-08-02T04:52:26 (3625 msec) +#=#=#=# Syncrun started 2019-08-02T06:52:53 until 2019-08-02T06:52:56 (3668 msec) +#=#=#=# Syncrun started 2019-08-02T08:53:23 until 2019-08-02T08:53:26 (3652 msec) +#=#=#=# Syncrun started 2019-08-02T10:53:53 until 2019-08-02T10:53:56 (3631 msec) +#=#=#=# Syncrun started 2019-08-02T12:54:23 until 2019-08-02T12:54:26 (3657 msec) +#=#=#=# Syncrun started 2019-08-02T14:54:53 until 2019-08-02T14:54:56 (3685 msec) +#=#=#=# Syncrun started 2019-08-21T23:45:44 until 2019-08-21T23:45:49 (4780 msec) +#=#=#=# Syncrun started 2019-08-22T01:46:07 until 2019-08-22T01:46:11 (3812 msec) +#=#=#=# Syncrun started 2019-08-22T03:46:37 until 2019-08-22T03:46:41 (3852 msec) +#=#=#=# Syncrun started 2019-08-22T05:47:07 until 2019-08-22T05:47:11 (3866 msec) +#=#=#=# Syncrun started 2019-08-22T07:47:37 until 2019-08-22T07:47:41 (3821 msec) +#=#=#=# Syncrun started 2019-08-22T09:48:07 until 2019-08-22T09:48:11 (3813 msec) +#=#=#=# Syncrun started 2019-08-22T11:48:37 until 2019-08-22T11:48:41 (3640 msec) +#=#=#=# Syncrun started 2019-08-22T13:49:07 until 2019-08-22T13:49:11 (3773 msec) diff --git a/HXbot/HX.py b/HXbot/HX.py new file mode 100755 index 0000000..bb4a72c --- /dev/null +++ b/HXbot/HX.py @@ -0,0 +1,366 @@ +# -*- coding: utf-8 -*- + +######################################## +# HXbot utility module # +# EoF 2016 EoF@itphx.ru # +######################################## + +# I2C bus +I2C_BUS_NUMBER = 2 +EXT_COM = 0xAA +XOR_SEQ = 0xFF + +# VAR +REFLEX_ADDRESS = 0x04 +REFLEX_RESPONSE_DELAY = 0.1 # Delay to get response after send command, sec +REFLEX_ERROR_LIMIT = 5 +REFLEX_MOVE_TIMEOUT = 60 + +# COMMANDS +# Util +COM_PING = 0x01 +COM_GET_TEMP = 0x02 +COM_GET_DISTANCE = 0x03 + +# Stop +STOP = 0x0F +# Move +MOVE_FLAG = 0x04 +MOVE_FLOAT = 0x10 +MOVE_FWD1 = 0x11 +MOVE_FWD2 = 0x12 +MOVE_FWD3 = 0x13 +MOVE_FWD4 = 0x14 +MOVE_FWD5 = 0x15 +MOVE_FWD6 = 0x16 +MOVE_FWD7 = 0x17 +MOVE_BREAK = 0x18 +MOVE_REV7 = 0x19 +MOVE_REV6 = 0x1A +MOVE_REV5 = 0x1B +MOVE_REV4 = 0x1C +MOVE_REV3 = 0x1D +MOVE_REV2 = 0x1E +MOVE_REV1 = 0x1F + +# Steering +STEER_FLAG = 0x05 +STEER_CENTER = 0x20 +STEER_LEFT1 = 0x21 +STEER_LEFT2 = 0x22 +STEER_LEFT3 = 0x23 +STEER_LEFT4 = 0x24 +STEER_LEFT5 = 0x25 +STEER_LEFT6 = 0x26 +STEER_LEFT7 = 0x27 +STEER_FIX_CENTER = 0x28 +STEER_RIGHT7 = 0x29 +STEER_RIGHT6 = 0x2A +STEER_RIGHT5 = 0x2B +STEER_RIGHT4 = 0x2C +STEER_RIGHT3 = 0x2D +STEER_RIGHT2 = 0x2E +STEER_RIGHT1 = 0x2F + +# Head +HEAD_H_FLAG = 0x30 +HEAD_V_FLAG = 0x31 +HEAD_H_R_RANGE = 83 +HEAD_H_L_RANGE = 94 +HEAD_V_UP_RANGE = 90 +HEAD_V_DOWN_RANGE = 25 +HEAD_H_CENTER = 83 +HEAD_V_CENTER = 150 + +# CONTROL SOURCE +CONTROL_SRC_NONE = 0x00 +CONTROL_SRC_JOYSTICK = 0x01 +CONTROL_SRC_IRREMOTE = 0x02 +CONTROL_SRC_SERVER = 0x03 +CONTROL_SRC_DB = 0x04 +CONTROL_SRC_SUB1 = 0x11 +CONTROL_SRC_SUB2 = 0x12 +CONTROL_SRC_SUB3 = 0x13 +CONTROL_SRC_SUB4 = 0x14 +CONTROL_SRC_SUB5 = 0x15 + +CONTROL_SRC_DEFAULT = CONTROL_SRC_JOYSTICK + +# MOVE STATES +MOVE_STATE_STOP = 0x00 +MOVE_STATE_MOVE = 0x01 + +# STATUS +STATUS_INIT = 0x00 +STATUS_READY = 0x01 +STATUS_RUNNING = 0x02 +STATUS_STOP = 0x03 +STATUS_EXIT = 0x04 + +# STATUS STATES +#STATUS_STATE_OK = 0x00 +#STATUS_STATE_WARNING = 0x01 +#STATUS_STATE_ERROR = 0x02 +#STATUS_STATE_LOWBAT1 = 0x03 +#STATUS_STATE_LOWBAT2 = 0x04 + +# JOYSTICK +JOYSTICK_PATH = '/dev/input/js0' +JOYSTICK_READY_TIMEOUT = 60 + +# These constants were borrowed from linux/input.h +JOYSTICK_AXIS_NAMES = { + 0x00: 'x', + 0x01: 'y', + 0x02: 'z', + 0x03: 'rx', + 0x04: 'ry', + 0x05: 'rz', + 0x06: 'trottle', + 0x07: 'rudder', + 0x08: 'wheel', + 0x09: 'gas', + 0x0a: 'brake', + 0x10: 'hat0x', + 0x11: 'hat0y', + 0x12: 'hat1x', + 0x13: 'hat1y', + 0x14: 'hat2x', + 0x15: 'hat2y', + 0x16: 'hat3x', + 0x17: 'hat3y', + 0x18: 'pressure', + 0x19: 'distance', + 0x1a: 'tilt_x', + 0x1b: 'tilt_y', + 0x1c: 'tool_width', + 0x20: 'volume', + 0x28: 'misc', +} + +JOYSTICK_BUTTON_NAMES = { + 0x120: 'trigger', + 0x121: 'thumb', + 0x122: 'thumb2', + 0x123: 'top', + 0x124: 'top2', + 0x125: 'pinkie', + 0x126: 'base', + 0x127: 'base2', + 0x128: 'base3', + 0x129: 'base4', + 0x12a: 'base5', + 0x12b: 'base6', + 0x12f: 'dead', + 0x130: 'a', + 0x131: 'b', + 0x132: 'c', + 0x133: 'x', + 0x134: 'y', + 0x135: 'z', + 0x136: 'tl', + 0x137: 'tr', + 0x138: 'tl2', + 0x139: 'tr2', + 0x13a: 'select', + 0x13b: 'start', + 0x13c: 'mode', + 0x13d: 'thumbl', + 0x13e: 'thumbr', + + 0x220: 'dpad_up', + 0x221: 'dpad_down', + 0x222: 'dpad_left', + 0x223: 'dpad_right', + + # XBox 360 controller uses these codes. + 0x2c0: 'dpad_left', + 0x2c1: 'dpad_right', + 0x2c2: 'dpad_up', + 0x2c3: 'dpad_down', +} + +# JOYSTICK BINDS +JOYSTICK_MOVE_AXIS = 'y' +JOYSTICK_STEER_AXIS = 'x' +JOYSTICK_HEAD_V_AXIS = 'rz' +JOYSTICK_HEAD_H_AXIS = 'z' +JOYSTICK_START_BTN_1 = 'tl2' +JOYSTICK_START_BTN_2 = 'tr2' + +# HXpower +POWER_ADDRESS = 0x05 +POWER_RESPONSE_DELAY = 0.05 # Delay to get response after send command, sec +POWER_DELAY = 0.3 +POWER_ERROR_LIMIT = 3 +POWER_MV_TIMEOUT = 60 + +# Commands +# VOLTMETERS +COM_GET_VIN = 0x01 +COM_GET_VDC = 0x02 +COM_GET_VBT = 0x03 +COM_GET_VBA = 0x04 +COM_GET_VPF = 0x05 +COM_GET_VZU = 0x06 +COM_GET_VCC = 0x07 + +# AMPERMETERS +COM_GET_ABT = 0x21 +COM_GET_ABA = 0x22 +COM_GET_AIN = 0x23 +COM_GET_AHX = 0x24 + +# STATUS +COM_GET_STAT1 = 0x08 +# 0x01 - vcc_ok +# 0x02 - vin_ok +# 0x04 - vdc_ok +# 0x08 - vbt_ok +# 0x10 - vba_ok +# 0x20 - bt_enabled +# 0x40 - ba_enabled +# 0x80 - in_plugged + +COM_GET_STAT2 = 0x09 +# 0x01 - bt_blocked +# 0x02 - ba_blocked +# 0x04 - bt_full +# 0x08 - ba_full +# 0x10 - vpf_ok +# 0x20 - vzu_ok +# 0x40 - mv_enabled +# 0x80 - us_enabled + +COM_GET_STAT3 = 0x20 +# 0x01 - abt_ok +# 0x02 - aba_ok +# 0x04 - ain_ok +# 0x08 - ahx_ok + +# TEMP +COM_GET_POWER_TEMP = 0x10 + +VIN_MIN = 10.0 +VIN_MAX = 14.0 +VIN_LOW = 11.0 +VIN_HIGH = 13.0 + +VDC_MIN = 5.0 +VDC_MAX = 5.7 +VDC_LOW = 5.1 +VDC_HIGH = 5.5 + +VBT_MIN = 3.65 +VBT_MAX = 4.25 +VBT_LOW = 3.68 +VBT_FULL = 4.1 + +VBA_MIN = 9.0 +VBA_MAX = 12.8 +VBA_LOW = 10.0 +VBA_FULL = 12.4 + +VPF_MIN = 7.2 +VPF_MAX = 10.0 +VPF_LOW = 8.0 +VPF_HIGH = 9.6 + +VZU_MIN = 5.0 +VZU_MAX = 6.3 +VZU_LOW = 5.2 +VZU_HIGH = 6.2 + +VCC_MIN = 4.5 +VCC_MAX = 5.3 +VCC_LOW = 4.7 +VCC_HIGH = 5.1 + +ABT_MIN = 0.3 +ABT_MAX = 2.0 +ABT_LOW = 0.4 +ABT_HIGH = 1.2 + +ABA_MIN = 0.05 +ABA_MAX = 2.0 +ABA_LOW = 0.5 +ABA_HIGH = 1.5 + +AIN_MIN = 0.05 +AIN_MAX = 2.0 +AIN_LOW = 0.1 +AIN_HIGH = 1.5 + +AHX_MIN = 0.05 +AHX_MAX = 3.0 +AHX_LOW = 0.1 +AHX_HIGH = 1.5 + +# RELAYS +COM_ENABLE_BA = 0x11 # 17 +COM_ENABLE_MV = 0x12 # 18 +COM_ENABLE_BT = 0x13 # 19 +COM_ENABLE_US = 0x14 # 20 + +COM_DISABLE_BA = 0x15 # 21 +COM_DISABLE_MV = 0x16 # 22 +COM_DISABLE_BT = 0x17 # 23 +COM_DISABLE_US = 0x18 # 24 + +COM_RUN = 0x1B # 27 +COM_STOP = 0x1C # 28 +COM_RESET_US = 0x1D # 29 + +# HXserver +SRV_PORT = 50306 +SRV_HOST = '' +SRV_CMD_GET_ALL = 0x01 +SRV_TIMEOUT = 1 +SRV_MAX_ERR_COUNT = 3 + +# RETURN CODES +# Universal return codes +OK_RSP = 0x00 +NO_RSP = 0xFF +ERR_RSP = 0x01 +BLK_RSP = 0x02 +CSE_RSP = 0x03 +IOE_RSP = 0x04 +TMO_RSP = 0x05 + +# HXbot modul flags +I2C_BUS_ERR = 0x0001 +HXPOWER_ERR = 0x0002 +REFLEX_ERR = 0x0004 +SERVER_ERR = 0x0008 + +JOYSTICK_WRN = 0x0010 +HXCAMERA_WRN = 0x0020 +HXLCD_WRN = 0x0040 +HXDB_WRN = 0x0080 +HXLIGHT_WRN = 0x0100 +HXSOUND_WRN = 0x0200 +HXLOG_WRN = 0x0400 + +# HXlcd +LCD_ADDRESS = 0x06 +LCD_ERROR_LIMIT = 5 +LCD_DELAY = 1 +LCD_RESPONSE_DELAY = 0.05 + +# HXcam +CAM_MAX_WRN_COUNT = 3 +CAM_DELAY = 1.0 + +CAM_STATE_STP = 0 +CAM_STATE_RUN = 1 +CAM_STATE_WRN = 2 +CAM_STATE_ERR = 3 + +# HXdb +DB_DELAY = 10.0 + +DB_HOST = 'localhost' +DB_NAME = 'hxdb' +DB_USER = 'hxdb' +DB_PASS = 'hxdbP@S$' \ No newline at end of file diff --git a/HXbot/HXbot.py b/HXbot/HXbot.py new file mode 100755 index 0000000..4fb8e52 --- /dev/null +++ b/HXbot/HXbot.py @@ -0,0 +1,711 @@ +#!/usr/bin/python3 +# -*- coding: utf-8 -*- + +######################################## +# HXbot main program # +# EoF 2016 EoF@itphx.ru # +######################################## + +import HX +import REflex +import HXjoystick +import HXpower +import HXserver +import HXcam +import HXlcd +import HXdb +import time +import smbus +import sys +import threading +import RPi.GPIO as GPIO + + +# MAIN CLASS +class HXbotClass(): + + def __init__(self): + super(HXbotClass, self).__init__() + + self.i2c_bus = None + self.hxpower = None + self.reflex = None + self.server = None + + self.joystick = None + self.hxcam = None + self.hxlcd = None + self.hxdb = None + self.light = None + self.sound = None + self.log = None + + self.status = HX.STATUS_INIT + + self.hxpower_lock = threading.Lock() + self.reflex_lock = threading.Lock() + self.hxlcd_lock = threading.Lock() + self.hxdb_lock = threading.Lock() + + def get_ready(self): + result = HX.OK_RSP + + # Init I2C bus + try: + self.i2c_bus = smbus.SMBus(HX.I2C_BUS_NUMBER) + except IOError: + self.stop() + return result | HX.I2C_BUS_ERR + + # Init hxpower + try: + self.hxpower = HXpower.HXpowerClass(self.i2c_bus, self.hxpower_lock) + except IOError: + self.stop() + return result | HX.HXPOWER_ERR + + # Init reflex + try: + self.reflex = REflex.REflexClass(self) + except IOError: + self.stop() + return result | HX.REFLEX_ERR + + # Init server + try: + self.server = HXserver.HXserverClass(self) + except OSError: + self.stop() + return result | HX.SERVER_ERR + + # Init joystick + try: + self.joystick = HXjoystick.HXjoystickClass() + except OSError: + #self.joystick.stop() + #self.joystick = None + result |= HX.JOYSTICK_WRN + + # Init hxcam + try: + self.hxcam = HXcam.HXcamClass() + except OSError: + self.hxcam.stop() + self.hxcam = None + result |= HX.HXCAMERA_WRN + + # Init hxlcd + try: + self.hxlcd = HXlcd.HXlcdClass(self.i2c_bus, self.hxlcd_lock) + except OSError: + self.hxlcd.stop() + self.hxlcd = None + result |= HX.HXLCD_WRN + + # Init hxdb + try: + self.hxdb = HXdb.HXdbClass(self) + except Exception: + #self.hxdb.stop() + self.hxdb = None + result |= HX.HXDB_WRN + + # Init GPIO + GPIO.setmode(GPIO.BOARD) + #GPIO.setup(25, GPIO.OUT) + + # Set status + self.status = True + + return result + + def start(self): + if self.status != HX.STATUS_READY: + return HX.BLK_RSP + + # Start hxpower + self.hxpower.start() + + # Start reflex + self.reflex.start() + + # Start server + self.server.start() + + # Start joystick + if self.joystick is not None: + self.joystick.start() + + # Start camera + if self.hxcam is not None: + self.hxcam.start() + + # Start lcd + if self.hxlcd is not None: + self.hxlcd.start() + + # Start db + if self.hxdb is not None: + self.hxdb.start() + + self.status = HX.STATUS_RUNNING + + return HX.OK_RSP + + def stop(self): + # Disable MV + self.hxpower.disable_mv() + + # Disable camera + if self.hxcam: + # Stop process + if self.hxcam.is_running: + self.hxcam.stop() + # Clear property + self.hxcam = None + + # Stop reflex + if self.reflex: + # Stop process + if self.reflex.is_running: + self.reflex.stop() + # Clear property + self.reflex = None + + # Stop joystick + if self.joystick: + # Stop process + if self.joystick.is_running: + self.joystick.stop() + # Clear property + self.joystick = None + + # Stop server + if self.server: + # Stop process + if self.server.is_running: + self.server.stop() + # Clear property + self.server = None + + # Stop hxpower + if self.hxpower: + # Stop process + if self.hxpower.is_running: + self.hxpower.stop() + # Clear property + self.hxpower = None + + # Stop hxlcd + if self.hxlcd: + # Stop process + if self.hxlcd.is_running: + self.hxlcd.stop() + # Clear property + self.hxlcd = None + + # Stop hxdb + if self.hxdb: + # Stop process + if self.hxdb.is_running: + self.hxdb.stop() + # Clear property + self.hxdb = None + + # Close I2C bus + if self.i2c_bus: + self.i2c_bus.close() + # Clear property + self.i2c_bus = None + + # Set status + self.status = HX.STATUS_STOP + + GPIO.cleanup() + + return HX.OK_RSP + + def get_temp(self): + try: + F = open("/sys/class/thermal/thermal_zone0/temp", "r") + T = float(F.read()) + except IOError: + return -999 + finally: + F.close() + + return T / 1000 + + +# MAIN PROGRAM +def main(): + # INIT + print("Hi! I'am HXbot. Let's fun!'") + print("Type command or \"help\"") + + # Create HXbot instance + hxbot = HXbotClass() + + # Run + start(hxbot) + + # MAIN LOOP + while True: + # Set command line view + if hxbot.status == HX.STATUS_INIT: + command_view = "INIT>" + elif hxbot.status == HX.STATUS_READY: + command_view = "READY>" + elif hxbot.status == HX.STATUS_RUNNING: + command_view = "RUNNING>" + elif hxbot.status == HX.STATUS_STOP: + command_view = "STOP>" + elif hxbot.status == HX.STATUS_EXIT: + command_view = "EXIT>" + + command = input(command_view) + + # COMMANDS + # Help + if command.lower() == "help": + print_help() + + # Exit / Quit + elif command.lower() == "exit" or \ + command.lower() == "quit": + stop(hxbot) + hxbot.status = HX.STATUS_EXIT + print("Exit...") + sys.exit() + + # Status + elif command.lower() == "status": + print_status(hxbot) + # REflex control + elif command.lower() == "reflex": + reflex_control(hxbot) + # HXpower control + elif command.lower() == "hxpower": + hxpower_control(hxbot) + # HXcam control + elif command.lower() == "hxcam": + hxcam_control(hxbot) + + # Get ready + elif command.lower() == "ready": + ready(hxbot) + # Start + elif command.lower() == "start": + start(hxbot) + # Stop + elif command.lower() == "stop": + stop(hxbot) + # Restart + elif command.lower() == "restart": + restart(hxbot) + + # Test + elif command.lower() == "t": + t1 = time.clock() + print("t1:", t1) + time.sleep(5) + t2 = time.clock() + print("t2:", t2) + dt = t2 - t1 + print("dt:", dt) + + # WAT? + else: + print("WRONG COMMAND") + print("Try again or type \"help\"") + + # EXIT + sys.exit() + + +# FUNCTIONS +def ready(hxbot): + if hxbot.status != HX.STATUS_READY: + print("Get ready...") + result = hxbot.get_ready() + print_result(result) + else: + print("HXbot already ready") + + +def start(hxbot): + if hxbot.status != HX.STATUS_RUNNING: + if hxbot.status != HX.STATUS_READY: + ready(hxbot) + + print("Start...") + result = hxbot.start() + print_result(result) + else: + print("HXbot already running") + + +def stop(hxbot): + if hxbot.status != HX.STATUS_STOP: + print("Stop...") + result = hxbot.stop() + print_result(result) + else: + print("HXbot already stopped") + + +def restart(hxbot): + stop(hxbot) + ready(hxbot) + start(hxbot) + + +def print_help(): + print("This is HXbot main program. You can type this commands:") + print("help - this help") + print("exit |") + print("quit - stop HXbot and exit") + print("status - get status") + print("start - start HXbot") + print("stop - stop HXbot") + print("restart - stop HXbot") + print("reflex - control REflex") + print("hxpower - control HXpower") + + +def hxpower_help(): + print("This is HXpower control program. You can type this commands:") + print("help - this help") + print("exit - main menu") + print("bt - switch BT") + print("ba - switch BA") + print("mv - enable/disable moving") + print("us - enable/disable USB") + print("0-255 - send raw command") + + +def hxcam_help(): + print("This is HXcam control program. You can type this commands:") + print("help - this help") + print("exit - main menu") + print("start - start HXcam") + print("stop - stop HXcam") + print("restart - restart HXcam") + + +def reflex_help(): + print("This is REflex control program. You can type this commands:") + print("help - this help") + print("exit - main menu") + print("0-255 - send raw command") + + +def print_result(result): + # Universal return codes + if result == HX.OK_RSP: + print("OK") + elif result == HX.NO_RSP: + print("WARNING: No response") + elif result == HX.ERR_RSP: + print("ERROR") + elif result == HX.BLK_RSP: + print("ERROR: Blocked") + elif result == HX.CSE_RSP: + print("ERROR: Wrong control sum") + elif result == HX.BLK_RSP: + print("ERROR: ") + elif result == HX.IOE_RSP: + print("ERROR: Input/output error") + elif result == HX.TMO_RSP: + print("ERROR: Timeout") + + # HXbot extended return codes + elif result == HX.I2C_BUS_ERR: + print("ERROR: I2C bus not ready") + elif result == HX.HXPOWER_ERR: + print("ERROR: HXpower not ready") + elif result == HX.JOYSTICK_WRN: + print("WARNING: Joystick not found") + elif result == HX.REFLEX_ERR: + print("ERROR: REflex not ready") + elif result == HX.SERVER_ERR: + print("ERROR: Server not ready") + elif result == HX.HXCAMERA_WRN: + print("WARNING: Camera not ready") + elif result == HX.HXLCD_WRN: + print("WARNING: LCD module not ready") + elif result == HX.HXDB_WRN: + print("WARNING: DB module not ready") + + # Unknown return code + else: + print("WARNING: Unknown return code received") + + +def print_status(hxbot): + if (hxbot.status != HX.STATUS_READY and + hxbot.status != HX.STATUS_RUNNING): + print("HXbot is not in ready or running state!") + return + + # Print voltages + print("Vcc =", hxbot.hxpower.vcc) + print("Vin =", hxbot.hxpower.vin) + print("Vdc =", hxbot.hxpower.vdc) + print("Vbt =", hxbot.hxpower.vbt) + print("Vba =", hxbot.hxpower.vba) + print("Vpf =", hxbot.hxpower.vpf) + print("Vzu =", hxbot.hxpower.vzu) + + # Print currents + print("Abt =", hxbot.hxpower.abt) + print("Aba =", hxbot.hxpower.aba) + print("Ain =", hxbot.hxpower.ain) + print("Ahx =", hxbot.hxpower.ahx) + + # Print temperature + print("CPU Temp:", hxbot.get_temp()) + print("REflex Temp:", hxbot.reflex.get_temp()) + #print("HXPower Temp:", ) + + # Print status + if hxbot.hxpower.vcc_ok: + print("Vcc - OK") + else: + print("Vcc - FAIL") + if hxbot.hxpower.vin_ok: + print("Vin - OK") + else: + print("Vin - FAIL") + if hxbot.hxpower.vdc_ok: + print("Vdc - OK") + else: + print("Vdc - FAIL") + if hxbot.hxpower.vbt_ok: + print("Vbt - OK") + else: + print("Vbt - FAIL") + if hxbot.hxpower.vba_ok: + print("Vba - OK") + else: + print("Vba - FAIL") + if hxbot.hxpower.vpf_ok: + print("Vpf - OK") + else: + print("Vpf - FAIL") + if hxbot.hxpower.vzu_ok: + print("Vzu - OK") + else: + print("Vzu - FAIL") + + if hxbot.hxpower.abt_ok: + print("Abt - OK") + else: + print("Abt - FAIL") + if hxbot.hxpower.aba_ok: + print("Aba - OK") + else: + print("Aba - FAIL") + if hxbot.hxpower.ain_ok: + print("Ain - OK") + else: + print("Ain - FAIL") + if hxbot.hxpower.ahx_ok: + print("Ahx - OK") + else: + print("Ahx - FAIL") + + if hxbot.hxpower.bt_enabled: + print("BT enabled") + else: + print("BT disabled") + if hxbot.hxpower.ba_enabled: + print("BA enabled") + else: + print("BA disabled") + if hxbot.hxpower.mv_enabled: + print("mv enabled") + else: + print("PF disabled") + if hxbot.hxpower.us_enabled: + print("USB power enabled") + else: + print("USB power disabled") + if hxbot.hxpower.bt_blocked: + print("BT blocked") + else: + print("BT unblocked") + if hxbot.hxpower.ba_blocked: + print("BA blocked") + else: + print("BA unblocked") + + if hxbot.hxpower.in_plugged: + print("IN plugged") + else: + print("IN unplugged") + + if hxbot.hxpower.bt_full: + print("BT charge complete") + if hxbot.hxpower.ba_full: + print("BA charge complete") + + print() + + +def reflex_control(hxbot): + if (hxbot.status != HX.STATUS_READY and + hxbot.status != HX.STATUS_RUNNING): + print("HXbot is not in ready or running state!") + return + + rawCommand = 0x00 + rawResponse = 0x00 + + print("Reflex control program. Type command or \"help\"") + print("Type \"exit\" to previous menu") + command_view = "REflex control>" + + while True: + command = input(command_view) + if command.lower() == "exit": + break + elif command.lower() == "help": + reflex_help() + else: + # Try to send RAW command to REflex + try: + rawCommand = int(command) + except: + rawCommand = 0x00 + + if not rawCommand: + continue + + with hxbot.reflex_lock: + hxbot.i2c_bus.write_byte(HX.REFLEX_ADDRESS, rawCommand) + print("Sent: ", rawCommand) + time.sleep(HX.REFLEX_RESPONSE_DELAY) + rawResponse = hxbot.i2c_bus.read_byte(HX.REFLEX_ADDRESS) + print("Received: ", rawResponse) + + +def hxpower_control(hxbot): + if (hxbot.status != HX.STATUS_READY and + hxbot.status != HX.STATUS_RUNNING): + print("HXbot is not in ready or running state!") + return + + rawCommand = 0x00 + rawResponse = 0x00 + + print("HXpower control program. Type command or \"help\"") + print("Type \"exit\" to previous menu") + command_view = "HXpower control>" + + while True: + command = input(command_view) + if command.lower() == "exit": + break + elif command.lower() == "help": + hxpower_help() + elif command.lower() == "bt": + if hxbot.hxpower.bt_enabled: + print("Disable BT...") + result = hxbot.hxpower.disable_bt() + else: + print("Enable BT...") + result = hxbot.hxpower.enable_bt() + print_result(result) + elif command.lower() == "ba": + if hxbot.hxpower.ba_enabled: + print("Disable BA...") + result = hxbot.hxpower.disable_ba() + else: + print("Enable BA...") + result = hxbot.hxpower.enable_ba() + print_result(result) + elif command.lower() == "mv": + if hxbot.hxpower.mv_enabled: + print("Disable MV...") + result = hxbot.hxpower.disable_mv() + else: + print("Enable MV...") + result = hxbot.hxpower.enable_mv() + print_result(result) + elif command.lower() == "us": + if hxbot.hxpower.us_enabled: + print("Disable USB power...") + result = hxbot.hxpower.disable_us() + else: + print("Enable USB power...") + result = hxbot.hxpower.enable_us() + print_result(result) + elif command.lower() == "reset": + GPIO.output(25, 0) + time.sleep(5) + GPIO.output(25, 1) + else: + # Try to send RAW command to HXpower + try: + rawCommand = int(command) + except: + rawCommand = 0x00 + print("Wrong command!") + + if not rawCommand: + continue + + rawCommand = (rawCommand << 8) | (rawCommand ^ HX.XOR_SEQ) + try: + with hxbot.hxpower_lock: + hxbot.i2c_bus.write_word_data(HX.POWER_ADDRESS, + HX.EXT_COM, rawCommand) + print("Sent:", rawCommand, "(", rawCommand, ")") + time.sleep(HX.POWER_RESPONSE_DELAY) + rawResponse = hxbot.i2c_bus.read_byte(HX.POWER_ADDRESS) + print("Received:", rawResponse) + except IOError as E: + print(E) + + +def hxcam_control(hxbot): + if (hxbot.status != HX.STATUS_READY and + hxbot.status != HX.STATUS_RUNNING): + print("HXbot is not in ready or running state!") + return + + print("HXcam control program. Type command or \"help\"") + print("Type \"exit\" to previous menu") + command_view = "HXcam control>" + + while True: + command = input(command_view) + if command.lower() == "exit": + break + elif command.lower() == "help": + hxcam_help() + elif command.lower() == "start": + print("Start HXcam") + if hxbot.hxcam.is_running: + print("Allready running") + else: + hxbot.hxcam.start() + elif command.lower() == "stop": + print("Stop HXcam") + if not hxbot.hxcam.is_running: + print("Not running") + else: + hxbot.hxcam.stop() + elif command.lower() == "restart": + print("Restart HXcam") + if hxbot.hxcam.is_running: + print("Stop...") + hxbot.hxcam.stop() + if not hxbot.hxcam.is_running: + print("Start...") + hxbot.hxcam.start() + +# MAIN PROGRAM +if __name__ == "__main__": + main() diff --git a/HXbot/HXcam.py b/HXbot/HXcam.py new file mode 100755 index 0000000..1f93473 --- /dev/null +++ b/HXbot/HXcam.py @@ -0,0 +1,257 @@ +# -*- coding: utf-8 -*- + +######################################## +# HXbot camera control module # +# EoF 2016 EoF@itphx.ru # +######################################## + +import subprocess +import threading +#import select +import time +import sys +import os.path as path +import HX + + +class HXcamClass(): + + def __init__(self): + super(HXcamClass, self).__init__() + + self.__e = None + self.__t = None + + self.mcam = None + self.rcam = None + self.mmic = None + self.rvid = None + + self.is_running = False + + # Subprocess states + # 0 - Not running + # 1 - Running + # 2 - Error + # 3 - Device not found + self.mcam_state = HX.CAM_STATE_STP + self.rvid_state = HX.CAM_STATE_STP + self.rcam_state = HX.CAM_STATE_STP + self.mmic_state = HX.CAM_STATE_STP + + self.mcam_wrn_count = 0 + self.rcam_wrn_count = 0 + self.mmic_wrn_count = 0 + + def start(self): + self.__e = threading.Event() + self.__t = threading.Thread(target=self.__process, args=(self.__e, )) + + self.mcam_start() + #self.rcam_start() + self.mmic_start() + + self.__t.start() + + self.is_running = True + + def stop(self): + self.__e.set() + self.__t.join() + self.__e = None + self.__t = None + + self.mcam_stop() + #self.rcam_stop() + self.mmic_stop() + + self.is_running = False + + def restart(self): + if self.is_running: + self.__stop() + self.__start() + + def test(self): + #import time + #import sys + #import shlex + #string = "" + #args = shlex.split(string) + #print(args) + #sys.exit() + pass + + def mcam_start(self): + # cvlc 'v4l2:///dev/video0:chroma=H264:width=1280:height=720:fps=15' + # --sout '#rtp{sdp=rtsp://:8554/video}' -v --live-caching 50 + if path.exists('/dev/video0'): + arg = 'v4l2:///dev/video0:chroma=H264:width=1280:height=720:fps=15' + elif path.exists('/dev/video1'): + arg = 'v4l2:///dev/video1:chroma=H264:width=1280:height=720:fps=15' + else: + self.mcam_state = HX.CAM_STATE_ERR + return + + self.mcam = subprocess.Popen( + args=['/usr/bin/cvlc', + arg, + '--sout', '#rtp{sdp=rtsp://:8554/video}', + '--live-caching', '50', 'vlc://quit'], + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL) + + self.mcam_state = HX.CAM_STATE_RUN + + def mcam_stop(self): + if self.mcam_state != HX.CAM_STATE_ERR: + self.mcam.terminate() + self.mcam_state = HX.CAM_STATE_STP + + def rcam_start(self): + # raspivid -t 0 -n -w 1280 -h 720 -fps 15 -o - | + # cvlc -v stream:///dev/stdin + # --sout '#rtp{sdp=rtsp://:8555/video}' :demux=h264 + self.rvid = subprocess.Popen( + args=['raspivid', '-t', '0', '-n', '-w', '1280', '-h', '720', + '-fps', '15', '-o', '-'], + stdout=subprocess.PIPE, + stderr=subprocess.DEVNULL) + + self.rcam = subprocess.Popen( + args=['cvlc', 'stream:///dev/stdin', '--sout', + '#rtp{sdp=rtsp://:8555/video}', ':demux=h264', + '--live-caching', '50', 'vlc://quit'], + stdin=self.rvid.stdout, + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL) + + self.rcam_state = HX.CAM_STATE_RUN + + def rcam_stop(self): + if self.rcam_state != HX.CAM_STATE_ERR: + self.rvid.terminate() + self.rcam.terminate() + self.rcam_state = HX.CAM_STATE_STP + + def mmic_start(self): + # cvlc -v 'alsa://hw:1,0' + # --sout '#transcode{acodec=mpga,ab=128,channels=2,samplerate=44100} + # :rtp{sdp=rtsp://:8556/audio}' + self.mmic = subprocess.Popen( + args=['cvlc', 'alsa://hw:0,0', '--sout', + '#transcode{acodec=mpga,ab=128,channels=2,samplerate=44100}' + + ':rtp{sdp=rtsp://:8556/audio}', + '--live-caching', '500', 'vlc://quit'], + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL) + + self.mmic_state = HX.CAM_STATE_RUN + + def mmic_stop(self): + if self.mmic_state != HX.CAM_STATE_ERR: + self.mmic.terminate() + self.mmic_state = HX.CAM_STATE_STP + + def __process(self, stopRequest): + # Process loop + while not stopRequest.is_set(): + # Main Camera + if self.mcam_state != HX.CAM_STATE_ERR: + if self.mcam.poll() is not None: + self.mcam_start() + + if self.mcam_state != HX.CAM_STATE_WRN: + self.mcam_wrn_count += 1 + + if self.mcam_wrn_count >= HX.CAM_MAX_WRN_COUNT: + self.mcam_state = HX.CAM_STATE_WRN + + # Rear Camera + #if self.rcam_state != HX.CAM_STATE_ERR: + #if self.rcam.poll() is not None: + #self.rcam_start() + + #if self.rcam_state != HX.CAM_STATE_WRN: + #self.rcam_wrn_count += 1 + + #if self.rcam_wrn_count >= HX.CAM_MAX_WRN_COUNT: + #self.rcam_state = HX.CAM_STATE_WRN + + # Main Microphone + if self.mmic_state != HX.CAM_STATE_ERR: + if self.mmic.poll() is not None: + self.mmic_start() + + if self.mmic_state != HX.CAM_STATE_WRN: + self.mmic_wrn_count += 1 + + if self.mmic_wrn_count >= HX.CAM_MAX_WRN_COUNT: + self.mmic_state = HX.CAM_STATE_WRN + + time.sleep(HX.CAM_DELAY) + + #if self.mcam_state == 1: + ## VLC-1 + #r, w, e = select.select([self.mcam.stderr], [], [], 0.5) + #if self.mcam.stderr in r: + #print("VLC-1 ERROR:") + #print(self.mcam.stderr.readline()) + + #r, w, e = select.select([self.mcam.stdout], [], [], 0.5) + #if self.mcam.stdout in r: + #print("VLC-1 OUT:") + #print(self.mcam.stdout.readline()) + + #if self.rvid_state == 1: + ## VLC-2 + #r, w, e = select.select([self.rvid.stderr], [], [], 0.5) + #if self.rvid.stderr in r: + #print("RVID ERROR:") + #print(self.rvid.stderr.readline()) + + #r, w, e = select.select([self.rcam.stderr], [], [], 0.5) + #if self.rcam.stderr in r: + #print("VLC-2 ERROR:") + #print(self.rcam.stderr.readline()) + + #r, w, e = select.select([self.rcam.stdout], [], [], 0.5) + #if self.rcam.stdout in r: + #print("VLC-2 OUT:") + #print(self.rcam.stdout.readline()) + + #if self.mmic_state == 1: + ## VLC-3 + #r, w, e = select.select([self.mmic.stderr], [], [], 0) + #if self.mmic.stderr in r: + #print("MMIC ERROR:") + #print(self.mmic.stderr.readline()) + + #r, w, e = select.select([self.mmic.stdout], [], [], 0.5) + #if self.mmic.stdout in r: + #print("MMIC OUT:") + #print(self.mmic.stdout.readline()) + + +def main(): + HXcam = HXcamClass() + HXcam.start() + + print("Execution started") + + command_view = '"Return" or CTRL+C to exit>' + try: + while True: + command = input(command_view) + + if command == "": + HXcam.stop() + sys.exit() + + except KeyboardInterrupt: + print("Terminate...") + HXcam.stop() + + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/HXbot/HXdb.py b/HXbot/HXdb.py new file mode 100755 index 0000000..1d34a77 --- /dev/null +++ b/HXbot/HXdb.py @@ -0,0 +1,132 @@ +# -*- coding: utf-8 -*- + +######################################## +# HXbot database module # +# EoF 2016 EoF@itphx.ru # +######################################## + +import HX +import threading +import time +import mysql.connector +from mysql.connector import errorcode + + +class HXdbClass(): + + def __init__(self, hxbot): + super(HXdbClass, self).__init__() + + self.hxbot = hxbot + + self.hxpower = None + self.reflex = None + self.joystick = None + self.hxlcd = None + self.hxcam = None + + self.__e = None + self.__t = None + + self.is_running = False + + try: + self.cnx = mysql.connector.connect(user=HX.DB_USER, + password=HX.DB_PASS, + host=HX.DB_HOST, + database=HX.DB_NAME) + except mysql.connector.Error as err: + if err.errno == errorcode.ER_ACCESS_DENIED_ERROR: + print("Something is wrong with your user name or password") + elif err.errno == errorcode.ER_BAD_DB_ERROR: + print("Database does not exist") + else: + print(err) + self.cnx = None + + raise + + def start(self): + self.hxpower = self.hxbot.hxpower + self.reflex = self.hxbot.reflex + self.joystick = self.hxbot.joystick + self.hxlcd = self.hxbot.hxlcd + self.hxcam = self.hxbot.hxcam + + self.__e = threading.Event() + self.__t = threading.Thread(target=self.__process, args=(self.__e, )) + + self.__t.start() + self.is_running = True + + def stop(self): + self.__e.set() + self.__t.join() + self.is_running = False + + if self.cnx is not None: + self.cnx.close() + + self.hxpower = None + self.reflex = None + self.joystick = None + self.hxlcd = None + self.hxcam = None + + self.__e = None + self.__t = None + + def __process(self, stopRequest): + cursor = self.cnx.cursor() + pw = self.hxpower + + insert_state = ("INSERT INTO states " + "(vcc, vin, vdc, vbt, vba, vis, vzu, " + "ahx, aba, ain, adc, " + "vcc_ok, vin_ok, vdc_ok, vbt_ok, vba_ok, " + "vis_ok, vzu_ok, " + "ahx_ok, aba_ok, ain_ok, adc_ok, " + "lr_enabled, ba_enabled, ba_blocked, " + "vcc_low, vcc_high, vin_low, vin_high, " + "vdc_low, vdc_high, vbt_low, vbt_full, " + "vba_low, vba_full, vis_low, vis_high, " + "vzu_low, vzu_high, " + "ahx_low, ahx_high, aba_low, aba_high, " + "ain_low, ain_high, adc_low, adc_high, " + "pf_enabled, bl_enabled, bl_powered, " + "bl_error, ba_full, ba_charge) " + "VALUES (" + "%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, " + "%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, " + "%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, " + "%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, " + "%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, " + "%s, %s, %s)") + + while not stopRequest.is_set(): + # Get Data + state = (pw.vcc, pw.vin, pw.vdc, pw.vbt, pw.vba, pw.vis, + pw.vzu, pw.ahx, pw.aba, pw.ain, pw.adc, pw.vcc_ok, + pw.vin_ok, pw.vdc_ok, pw.vbt_ok, pw.vba_ok, + pw.vis_ok, pw.vzu_ok, + pw.ahx_ok, pw.aba_ok, pw.ain_ok, pw.adc_ok, + pw.lr_enabled, pw.ba_enabled, pw.ba_blocked, + pw.vcc_low, pw.vcc_high, pw.vin_low, pw.vin_high, + pw.vdc_low, pw.vdc_high, pw.vbt_low, pw.vbt_full, + pw.vba_low, pw.vba_full, pw.vis_low, pw.vis_high, + pw.vzu_low, pw.vzu_high, pw.ahx_low, pw.ahx_high, + pw.aba_low, pw.aba_high, pw.ain_low, pw.ain_high, + pw.adc_low, pw.adc_high, + pw.pf_enabled, pw.bl_enabled, + pw.bl_powered, pw.bl_error, + pw.ba_full, pw.ba_charge) + + # Insert Data + if pw.online: + cursor.execute(insert_state, state) + self.cnx.commit() + + # Delay + time.sleep(HX.DB_DELAY) + + cursor.close() diff --git a/HXbot/HXjoystick.py b/HXbot/HXjoystick.py new file mode 100755 index 0000000..4167b7b --- /dev/null +++ b/HXbot/HXjoystick.py @@ -0,0 +1,234 @@ +# -*- coding: utf-8 -*- + +######################################## +# HXbot controller module # +# EoF 2016 EoF@itphx.ru # +######################################## + +import HX +import threading +import array +import struct +import select +import time +from fcntl import ioctl + + +class HXjoystickClass(): + + def __init__(self): + super(HXjoystickClass, self).__init__() + + self.__e = None + self.__t = None + self.ready = False + + self.device = open(HX.JOYSTICK_PATH, 'rb') + + self.name = "" + self.axis_states = {} + self.button_states = {} + self.axis_map = [] + self.button_map = [] + self.axis_names = HX.JOYSTICK_AXIS_NAMES + self.button_names = HX.JOYSTICK_BUTTON_NAMES + + self.online = False + self.is_running = False + self.last_command_time = 0.0 + + # Get the device name. + buf = array.array('B', [0] * 64) + # JSIOCGNAME(len) + ioctl(self.device, 0x80006a13 + (0x10000 * len(buf)), buf) + self.name = buf.tostring() + #print('Device name: %s' % js_name) + + # Get number of axes and buttons. + buf = array.array('B', [0]) + ioctl(self.device, 0x80016a11, buf) # JSIOCGAXES + num_axes = buf[0] + + buf = array.array('B', [0]) + ioctl(self.device, 0x80016a12, buf) # JSIOCGBUTTONS + num_buttons = buf[0] + + # Get the axis map. + buf = array.array('B', [0] * 0x40) + ioctl(self.device, 0x80406a32, buf) # JSIOCGAXMAP + + for axis in buf[:num_axes]: + axis_name = self.axis_names.get(axis, 'unknown(0x%02x)' % axis) + self.axis_map.append(axis_name) + self.axis_states[axis_name] = 0.0 + + # Get the button map. + buf = array.array('H', [0] * 200) + ioctl(self.device, 0x80406a34, buf) # JSIOCGBTNMAP + + for btn in buf[:num_buttons]: + btn_name = self.button_names.get(btn, 'unknown(0x%03x)' % btn) + self.button_map.append(btn_name) + self.button_states[btn_name] = 0 + + #print('%d axes found: %s' % (num_axes, ', '.join(self.axis_map))) + #print('%d btns found: %s' % (num_buttons, ', '.join(self.button_map))) + + def start(self): + self.__e = threading.Event() + self.__t = threading.Thread(target=self.__process, args=(self.__e, )) + + self.__t.start() + self.is_running = True + + def stop(self): + self.__e.set() + self.__t.join() + self.is_running = False + + self.__e = None + self.__t = None + + def __process(self, stopRequest): + while not stopRequest.is_set(): + r, w, e = select.select([self.device], [], [], 0.8) + if self.device in r: + try: + evbuf = self.device.read(8) + self.online = True + except OSError: + self.online = False + self.ready = False + continue + + if evbuf: + time_, value, type, number = struct.unpack('IhBB', evbuf) + + # Save last command time + self.last_command_time = time.clock() + + #if type & 0x80: + #print("(initial)") + + if type & 0x01: + button = self.button_map[number] + if button: + self.button_states[button] = value + #if value: + #print("%s pressed" % (button)) + #else: + #print("%s released" % (button)) + + if type & 0x02: + axis = self.axis_map[number] + if axis: + fvalue = value / 32767.0 + self.axis_states[axis] = fvalue + #print("%s: %.3f" % (axis, fvalue)) + + # Switch ready property + if (self.button_states[HX.JOYSTICK_START_BTN_1] and + self.button_states[HX.JOYSTICK_START_BTN_2]): + if self.ready: + self.ready = False + else: + self.ready = True + + # Timeout? Relax... + elif time.clock() - self.last_command_time >= \ + HX.JOYSTICK_READY_TIMEOUT / 100: + self.ready = False + + def get_m(self): + axis_move = self.axis_states[HX.JOYSTICK_MOVE_AXIS] + axis_steer = self.axis_states[HX.JOYSTICK_STEER_AXIS] + + axis_head_v = self.axis_states[HX.JOYSTICK_HEAD_V_AXIS] + axis_head_h = self.axis_states[HX.JOYSTICK_HEAD_H_AXIS] + + # STOP (FLOAT) + if (axis_move >= -1 / 8) and (axis_move <= 1 / 8): + move = HX.MOVE_FLOAT + + # MOVE FORWARD + elif (axis_move >= -2 / 8) and (axis_move < -1 / 8): + move = HX.MOVE_FWD1 + elif (axis_move >= -3 / 8) and (axis_move < -2 / 8): + move = HX.MOVE_FWD2 + elif (axis_move >= -4 / 8) and (axis_move < -3 / 8): + move = HX.MOVE_FWD3 + elif (axis_move >= -5 / 8) and (axis_move < -4 / 8): + move = HX.MOVE_FWD4 + elif (axis_move >= -6 / 8) and (axis_move < -5 / 8): + move = HX.MOVE_FWD5 + elif (axis_move >= -7 / 8) and (axis_move < -6 / 8): + move = HX.MOVE_FWD6 + elif (axis_move >= -1) and (axis_move < -7 / 8): + move = HX.MOVE_FWD7 + + # MOVE BACKWARD + elif (axis_move > 1 / 8) and (axis_move <= 2 / 8): + move = HX.MOVE_REV1 + elif (axis_move > 2 / 8) and (axis_move <= 3 / 8): + move = HX.MOVE_REV2 + elif (axis_move > 3 / 8) and (axis_move <= 4 / 8): + move = HX.MOVE_REV3 + elif (axis_move > 4 / 8) and (axis_move <= 5 / 8): + move = HX.MOVE_REV4 + elif (axis_move > 5 / 8) and (axis_move <= 6 / 8): + move = HX.MOVE_REV5 + elif (axis_move > 6 / 8) and (axis_move <= 7 / 8): + move = HX.MOVE_REV6 + elif (axis_move > 7 / 8) and (axis_move <= 1): + move = HX.MOVE_REV7 + + # CENTER (FLOAT) + if (axis_steer >= -1 / 8) and (axis_steer <= 1 / 8): + steer = HX.STEER_CENTER + + # STEER LEFT + elif (axis_steer >= -2 / 8) and (axis_steer < -1 / 8): + steer = HX.STEER_LEFT1 + elif (axis_steer >= -3 / 8) and (axis_steer < -2 / 8): + steer = HX.STEER_LEFT2 + elif (axis_steer >= -4 / 8) and (axis_steer < -3 / 8): + steer = HX.STEER_LEFT3 + elif (axis_steer >= -5 / 8) and (axis_steer < -4 / 8): + steer = HX.STEER_LEFT4 + elif (axis_steer >= -6 / 8) and (axis_steer < -5 / 8): + steer = HX.STEER_LEFT5 + elif (axis_steer >= -7 / 8) and (axis_steer < -6 / 8): + steer = HX.STEER_LEFT6 + elif (axis_steer >= -1) and (axis_steer < -7 / 8): + steer = HX.STEER_LEFT7 + + # STEER RIGHT + elif (axis_steer > 1 / 8) and (axis_steer <= 2 / 8): + steer = HX.STEER_RIGHT1 + elif (axis_steer > 2 / 8) and (axis_steer <= 3 / 8): + steer = HX.STEER_RIGHT2 + elif (axis_steer > 3 / 8) and (axis_steer <= 4 / 8): + steer = HX.STEER_RIGHT3 + elif (axis_steer > 4 / 8) and (axis_steer <= 5 / 8): + steer = HX.STEER_RIGHT4 + elif (axis_steer > 5 / 8) and (axis_steer <= 6 / 8): + steer = HX.STEER_RIGHT5 + elif (axis_steer > 6 / 8) and (axis_steer <= 7 / 8): + steer = HX.STEER_RIGHT6 + elif (axis_steer > 7 / 8) and (axis_steer <= 1): + steer = HX.STEER_RIGHT7 + + # Head V + if axis_head_v > 0: + head_v = int(HX.HEAD_V_CENTER - HX.HEAD_V_UP_RANGE * axis_head_v) + else: + head_v = int(HX.HEAD_V_CENTER - HX.HEAD_V_DOWN_RANGE * axis_head_v) + + # Head H + if axis_head_h > 0: + head_h = int(HX.HEAD_H_CENTER - HX.HEAD_H_R_RANGE * axis_head_h) + else: + head_h = int(HX.HEAD_H_CENTER - HX.HEAD_H_L_RANGE * axis_head_h) + + # Return + return (True, move, steer, head_v, head_h) \ No newline at end of file diff --git a/HXbot/HXlcd.py b/HXbot/HXlcd.py new file mode 100755 index 0000000..eacc5c3 --- /dev/null +++ b/HXbot/HXlcd.py @@ -0,0 +1,149 @@ +# -*- coding: utf-8 -*- + +######################################## +# HXbot LCD module # +# EoF 2016 EoF@itphx.ru # +######################################## + +import HX +import threading +import time +import array +import struct + + +class HXlcdClass(): + + def __init__(self, i2c_bus, lock): + super(HXlcdClass, self).__init__() + + self.i2c_bus = i2c_bus + self.__e = None + self.__t = None + + self.lock = lock + self.online = False + self.is_running = False + self.error_count = 0 + + def start(self): + self.__e = threading.Event() + self.__t = threading.Thread(target=self.__process, args=(self.__e, )) + + self.__t.start() + self.is_running = True + + def stop(self): + self.__e.set() + self.__t.join() + self.is_running = False + + self.__e = None + self.__t = None + + def __process(self, stopRequest): + while not stopRequest.is_set(): + try: + self.__send_command(HX.COM_PING) + + self.online = True + + except IOError: + if self.online: + self.error_count += 1 + + # Too many errors + if self.error_count >= HX.LCD_ERROR_LIMIT: + self.online = False + + # Delay + time.sleep(HX.LCD_DELAY) + + def __sum_check(self, val, sum_): + tmp = 0x00 + for b in val: + tmp ^= b + tmp ^= HX.XOR_SEQ + if tmp == sum_: + return True + else: + return False + + def __read_float(self, cmd): + # Byte array + data = array.array('B', [0, 0, 0, 0]) + with self.lock: + # Send command + self.__write_byte(cmd) + time.sleep(HX.LCD_RESPONSE_DELAY) + + # Get bytes + data[0] = self.i2c_bus.read_byte(HX.LCD_ADDRESS) + data[1] = self.i2c_bus.read_byte(HX.LCD_ADDRESS) + data[2] = self.i2c_bus.read_byte(HX.LCD_ADDRESS) + data[3] = self.i2c_bus.read_byte(HX.LCD_ADDRESS) + + # Get check sum + sum_ = self.i2c_bus.read_byte(HX.LCD_ADDRESS) + + # Check and return value + if self.__sum_check(data, sum_): + return struct.unpack('f', data)[0] + else: + return None + + def __read_byte(self, cmd): + with self.lock: + # Send command + self.__write_byte(cmd) + time.sleep(HX.LCD_RESPONSE_DELAY) + + # Get byte + data = self.i2c_bus.read_byte(HX.LCD_ADDRESS) + + # Get check sum + sum_ = self.i2c_bus.read_byte(HX.LCD_ADDRESS) + + # Check and return value + if data ^ HX.XOR_SEQ == sum_: + return data + else: + return None + + def __write_byte(self, cmd): + cmd = (cmd << 8) | (cmd ^ HX.XOR_SEQ) + self.i2c_bus.write_word_data(HX.LCD_ADDRESS, HX.EXT_COM, cmd) + + def send_cmd(self, cmd): + try: + with self.lock: + # Send command + self.__write_byte(cmd) + time.sleep(HX.LCD_RESPONSE_DELAY) + + # Get response + response = self.i2c_bus.read_byte(HX.LCD_ADDRESS) + + # Return + return response + except IOError: + return HX.IOE_RSP + + def __send_command(self, command): + try: + with self.lock: + self.i2c_bus.write_word_data(HX.LCD_ADDRESS, command, 0) + time.sleep(HX.LCD_RESPONSE_DELAY) + response = self.i2c_bus.read_byte(HX.LCD_ADDRESS) + except IOError: + if self.online: + self.error_count += 1 + if self.error_count >= HX.LCD_ERROR_LIMIT: + self.online = False + return HX.IOE_RSP + else: + self.error_count = 0 + self.online = True + return response + + return HX.NO_RSP \ No newline at end of file diff --git a/HXbot/HXlight.py b/HXbot/HXlight.py new file mode 100755 index 0000000..40a96af --- /dev/null +++ b/HXbot/HXlight.py @@ -0,0 +1 @@ +# -*- coding: utf-8 -*- diff --git a/HXbot/HXlog.py b/HXbot/HXlog.py new file mode 100755 index 0000000..40a96af --- /dev/null +++ b/HXbot/HXlog.py @@ -0,0 +1 @@ +# -*- coding: utf-8 -*- diff --git a/HXbot/HXpower.py b/HXbot/HXpower.py new file mode 100755 index 0000000..178e011 --- /dev/null +++ b/HXbot/HXpower.py @@ -0,0 +1,587 @@ +# -*- coding: utf-8 -*- + +######################################## +# HXbot power control module # +# EoF 2016 EoF@itphx.ru # +######################################## + +import HX +import threading +import time +import array +import struct + + +class HXpowerClass(): + + def __init__(self, i2c_bus, lock): + super(HXpowerClass, self).__init__() + + self.i2c_bus = i2c_bus + self.__e = None + self.__t = None + self.lock = lock + + # MV + self.__mv_enable_time = 0.0 + self.mv_blocked = True + + # HXpower data + self.online = False + self.is_running = False + self.error_count = 0 + + self.status = 0x000000 + self.vcc = 0.0 + self.vin = 0.0 + self.vdc = 0.0 + self.vbt = 0.0 + self.vba = 0.0 + self.vpf = 0.0 + self.vzu = 0.0 + self.abt = 0.0 + self.aba = 0.0 + self.ain = 0.0 + self.ahx = 0.0 + self.vcc_ok = False + self.vin_ok = False + self.vdc_ok = False + self.vbt_ok = False + self.vba_ok = False + self.vpf_ok = False + self.vzu_ok = False + self.abt_ok = False + self.aba_ok = False + self.ain_ok = False + self.ahx_ok = False + self.bt_enabled = False + self.ba_enabled = False + self.bt_blocked = False + self.ba_blocked = False + self.vcc_low = False + self.vcc_high = False + self.vin_low = False + self.vin_high = False + self.vdc_low = False + self.vdc_high = False + self.vbt_low = False + self.vbt_full = False + self.vba_low = False + self.vba_full = False + self.vpf_low = False + self.vpf_high = False + self.vzu_low = False + self.vzu_high = False + self.abt_low = False + self.abt_high = False + self.aba_low = False + self.aba_high = False + self.ain_low = False + self.ain_high = False + self.ahx_low = False + self.ahx_high = False + + self.mv_enabled = False + self.us_enabled = False + + self.in_plugged = False + self.ba_full = False + self.bt_full = False + + def start(self): + self.__e = threading.Event() + self.__t = threading.Thread(target=self.__process, args=(self.__e, )) + + self.__t.start() + self.is_running = True + + def stop(self): + self.__e.set() + self.__t.join() + self.is_running = False + + self.__e = None + self.__t = None + + def __process(self, stopRequest): + stat1 = 0x00 + stat2 = 0x00 + stat3 = 0x00 + + # Process loop + while not stopRequest.is_set(): + try: + self.status = 0x0000 + + # Get status 1 + tmp = self.__read_byte(HX.COM_GET_STAT1) + if tmp is not None: + stat1 = tmp << 8 + else: + if self.online: + self.error_count += 1 + + # Get status 2 + tmp = self.__read_byte(HX.COM_GET_STAT2) + if tmp is not None: + stat2 = tmp + else: + if self.online: + self.error_count += 1 + + # Get status 3 + tmp = self.__read_byte(HX.COM_GET_STAT3) + if tmp is not None: + stat3 = tmp << 16 + else: + if self.online: + self.error_count += 1 + + self.status |= stat1 + self.status |= stat2 + self.status |= stat3 + + # Get Voltages + tmp = self.__read_float(HX.COM_GET_VCC) + if tmp is not None: + self.vcc = tmp + + tmp = self.__read_float(HX.COM_GET_VIN) + if tmp is not None: + self.vin = tmp + + tmp = self.__read_float(HX.COM_GET_VDC) + if tmp is not None: + self.vdc = tmp + + tmp = self.__read_float(HX.COM_GET_VBT) + if tmp is not None: + self.vbt = tmp + + tmp = self.__read_float(HX.COM_GET_VBA) + if tmp is not None: + self.vba = tmp + + tmp = self.__read_float(HX.COM_GET_VPF) + if tmp is not None: + self.vpf = tmp + + tmp = self.__read_float(HX.COM_GET_VZU) + if tmp is not None: + self.vzu = tmp + + tmp = self.__read_float(HX.COM_GET_ABT) + if tmp is not None: + self.abt = tmp + + tmp = self.__read_float(HX.COM_GET_ABA) + if tmp is not None: + self.aba = tmp + + tmp = self.__read_float(HX.COM_GET_AIN) + if tmp is not None: + self.ain = tmp + + tmp = self.__read_float(HX.COM_GET_AHX) + if tmp is not None: + self.ahx = tmp + + self.online = True + self.error_count = 0 + except IOError: + if self.online: + self.error_count += 1 + + # Decode Status + if self.status & 0x0100: + self.vcc_ok = True + else: + self.vcc_ok = False + + if self.status & 0x0200: + self.vin_ok = True + else: + self.vin_ok = False + + if self.status & 0x0400: + self.vdc_ok = True + else: + self.vdc_ok = False + + if self.status & 0x0800: + self.vbt_ok = True + else: + self.vbt_ok = False + + if self.status & 0x1000: + self.vba_ok = True + else: + self.vba_ok = False + + if self.status & 0x0010: + self.vpf_ok = True + else: + self.vpf_ok = False + + if self.status & 0x0020: + self.vzu_ok = True + else: + self.vzu_ok = False + + if self.status & 0x2000: + self.bt_enabled = True + else: + self.bt_enabled = False + + if self.status & 0x4000: + self.ba_enabled = True + else: + self.ba_enabled = False + + if self.status & 0x0040: + self.mv_enabled = True + else: + self.mv_enabled = False + + if self.status & 0x0080: + self.us_enabled = True + else: + self.us_enabled = False + + if self.status & 0x8000: + self.in_plugged = True + else: + self.in_plugged = False + + if self.status & 0x0001: + self.bt_blocked = True + else: + self.bt_blocked = False + + if self.status & 0x0002: + self.ba_blocked = True + else: + self.ba_blocked = False + + if self.status & 0x0004: + self.bt_full = True + else: + self.bt_full = False + + if self.status & 0x0008: + self.ba_full = True + else: + self.ba_full = False + + if self.status & 0x010000: + self.abt_ok = True + else: + self.abt_ok = False + + if self.status & 0x020000: + self.aba_ok = True + else: + self.aba_ok = False + + if self.status & 0x040000: + self.ain_ok = True + else: + self.ain_ok = False + + if self.status & 0x080000: + self.ahx_ok = True + else: + self.ahx_ok = False + + # LOW | HIGH + if self.vcc < HX.VCC_LOW: + self.vcc_low = True + else: + self.vcc_low = False + + if self.vcc > HX.VCC_HIGH: + self.vcc_high = True + else: + self.vcc_high = False + + if self.vin < HX.VIN_LOW: + self.vin_low = True + else: + self.vin_low = False + + if self.vin > HX.VIN_HIGH: + self.vin_high = True + else: + self.vin_high = False + + if self.vdc < HX.VDC_LOW: + self.vdc_low = True + else: + self.vdc_low = False + + if self.vdc > HX.VDC_HIGH: + self.vdc_high = True + else: + self.vdc_high = False + + if self.vbt < HX.VBT_LOW: + self.vbt_low = True + else: + self.vbt_low = False + + if self.vbt > HX.VBT_FULL: + self.vbt_full = True + else: + self.vbt_full = False + + if self.vba < HX.VBA_LOW: + self.vba_low = True + else: + self.vba_low = False + + if self.vba > HX.VBA_FULL: + self.vba_full = True + else: + self.vba_full = False + + if self.vpf < HX.VPF_LOW: + self.vpf_low = True + else: + self.vpf_low = False + + if self.vpf > HX.VPF_HIGH: + self.vpf_high = True + else: + self.vpf_high = False + + if self.vzu < HX.VZU_LOW: + self.vzu_low = True + else: + self.vzu_low = False + + if self.vzu > HX.VZU_HIGH: + self.vzu_high = True + else: + self.vzu_high = False + + if self.abt < HX.ABT_LOW: + self.abt_low = True + else: + self.abt_low = False + + if self.abt > HX.ABT_HIGH: + self.abt_high = True + else: + self.abt_high = False + + if self.aba < HX.ABA_LOW: + self.aba_low = True + else: + self.aba_low = False + + if self.aba > HX.ABA_HIGH: + self.aba_high = True + else: + self.aba_high = False + + if self.ain < HX.AIN_LOW: + self.ain_low = True + else: + self.ain_low = False + + if self.ain > HX.AIN_HIGH: + self.ain_high = True + else: + self.ain_high = False + + if self.ahx < HX.AHX_LOW: + self.ahx_low = True + else: + self.ahx_low = False + + if self.ahx > HX.AHX_HIGH: + self.ahx_high = True + else: + self.ahx_high = False + + # Too many errors + if self.error_count >= HX.POWER_ERROR_LIMIT: + self.online = False + + # Unblock PF + if (self.mv_enabled and time.clock() - self.__mv_enable_time >= + HX.POWER_MV_TIMEOUT / 100): + self.mv_blocked = False + + # Delay + time.sleep(HX.POWER_DELAY) + + def __sum_check(self, val, sum_): + tmp = 0x00 + for b in val: + tmp ^= b + tmp ^= HX.XOR_SEQ + if tmp == sum_: + return True + else: + return False + + def __read_float(self, cmd): + # Byte array + data = array.array('B', [0, 0, 0, 0]) + with self.lock: + # Send command + self.__write_byte(cmd) + time.sleep(HX.POWER_RESPONSE_DELAY) + + # Get bytes + data[0] = self.i2c_bus.read_byte(HX.POWER_ADDRESS) + data[1] = self.i2c_bus.read_byte(HX.POWER_ADDRESS) + data[2] = self.i2c_bus.read_byte(HX.POWER_ADDRESS) + data[3] = self.i2c_bus.read_byte(HX.POWER_ADDRESS) + + # Get check sum + sum_ = self.i2c_bus.read_byte(HX.POWER_ADDRESS) + + # Check and return value + if self.__sum_check(data, sum_): + return struct.unpack('f', data)[0] + else: + return None + + def __read_byte(self, cmd): + with self.lock: + # Send command + self.__write_byte(cmd) + time.sleep(HX.POWER_RESPONSE_DELAY) + + # Get byte + data = self.i2c_bus.read_byte(HX.POWER_ADDRESS) + + # Get check sum + sum_ = self.i2c_bus.read_byte(HX.POWER_ADDRESS) + + # Check and return value + if data ^ HX.XOR_SEQ == sum_: + return data + else: + return None + + def __write_byte(self, cmd): + cmd = (cmd << 8) | (cmd ^ HX.XOR_SEQ) + self.i2c_bus.write_word_data(HX.POWER_ADDRESS, HX.EXT_COM, cmd) + + def send_cmd(self, cmd): + try: + with self.lock: + # Send command + self.__write_byte(cmd) + time.sleep(HX.POWER_RESPONSE_DELAY) + + # Get response + response = self.i2c_bus.read_byte(HX.POWER_ADDRESS) + + # Return + return response + except IOError: + return HX.IOE_RSP + + def enable_bt(self): + # Enable power from BT + if not self.bt_enabled: + # Run command + result = self.send_cmd(HX.COM_ENABLE_BT) + + # Return + return result + else: + # Already enabled? OK! + return HX.OK_RSP + + def disable_bt(self): + # Disable power from BT + if self.bt_enabled: + # Run command + result = self.send_cmd(HX.COM_DISABLE_BT) + + # Return + return result + else: + # Already disabled? OK! + return HX.OK_RSP + + def enable_us(self): + # Enable USB power + if not self.us_enabled: + # Run command + result = self.send_cmd(HX.COM_ENABLE_US) + + # Return + return result + else: + # Already enabled? OK! + return HX.OK_RSP + + def disable_us(self): + # Disable USB power + if self.us_enabled: + # Run command + result = self.send_cmd(HX.COM_DISABLE_US) + + # Return + return result + else: + # Already disabled? OK! + return HX.OK_RSP + + def enable_mv(self): + # Enable PowerFunctions and servos + if not self.mv_enabled: + # Save MV enable time + self.__mv_enable_time = time.clock() + self.mv_blocked = True + + # Run command + result = self.send_cmd(HX.COM_ENABLE_MV) + + # Return + return result + else: + # Already enabled? OK! + return HX.OK_RSP + + def disable_mv(self): + # Disable PowerFunctions and servos + if self.mv_enabled: + # Run command + result = self.send_cmd(HX.COM_DISABLE_MV) + + # Return + return result + else: + # Already disabled? OK! + return HX.OK_RSP + + def enable_ba(self): + # Enable BA + if not self.ba_enabled: + # Run command + result = self.send_cmd(HX.COM_ENABLE_BA) + + # Return + return result + else: + # Already enabled? OK! + return HX.OK_RSP + + def disable_ba(self): + # Disable BA + if self.ba_enabled: + # Run command + result = self.send_cmd(HX.COM_DISABLE_BA) + + # Return + return result + else: + # Already disabled? OK! + return HX.OK_RSP \ No newline at end of file diff --git a/HXbot/HXserver.py b/HXbot/HXserver.py new file mode 100755 index 0000000..bc78d0c --- /dev/null +++ b/HXbot/HXserver.py @@ -0,0 +1,171 @@ +# -*- coding: utf-8 -*- + +######################################## +# HXbot server module # +# EoF 2016 EoF@itphx.ru # +######################################## + +import HX +import threading +import socket +import sys +import struct + + +class HXserverClass(): + + def __init__(self, hxbot): + super(HXserverClass, self).__init__() + + try: + self.s = socket.socket(family=socket.AF_INET, + type=socket.SOCK_DGRAM) + self.s.bind((HX.SRV_HOST, HX.SRV_PORT)) + self.s.settimeout(HX.SRV_TIMEOUT) + except OSError as E: + print(E) + sys.exit() + + self.hxbot = hxbot + + self.hxpower = None + self.reflex = None + self.joystick = None + self.hxlcd = None + self.hxcam = None + + self.__e = None + self.__t = None + + self.is_running = False + + def start(self): + self.hxpower = self.hxbot.hxpower + self.reflex = self.hxbot.reflex + self.joystick = self.hxbot.joystick + self.hxlcd = self.hxbot.hxlcd + self.hxcam = self.hxbot.hxcam + + self.__e = threading.Event() + self.__t = threading.Thread(target=self.__process, args=(self.__e, )) + + self.__t.start() + self.is_running = True + + def stop(self): + self.__e.set() + self.__t.join() + self.is_running = False + + self.hxpower = None + self.reflex = None + self.joystick = None + self.hxlcd = None + self.hxcam = None + + self.__e = None + self.__t = None + + def __process(self, stopRequest): + while not stopRequest.is_set(): + try: + data = self.s.recvfrom(1024) + except socket.timeout: + continue + + cmd = data[0][0] + client = data[1] + + if cmd == HX.SRV_CMD_GET_ALL: + self.s.sendto(self.__pack_all(), client) + else: + pass + + self.s.close() + + def __pack_all(self): + # INIT + pw = self.hxpower + rf = self.reflex + lc = self.hxlcd + + ca = self.hxcam + if ca is not None: + ca_mcam_state = ca.mcam_state + ca_rcam_state = ca.rcam_state + ca_mmic_state = ca.mmic_state + else: + ca_mcam_state = 2 + ca_rcam_state = 2 + ca_mmic_state = 2 + + js = self.joystick + if js is not None: + js_online = js.online + else: + js_online = False + + result = struct.pack( + 'fffffffffff??????????????????????????????????????????????BBB', + pw.vcc, + pw.vin, + pw.vdc, + pw.vbt, + pw.vba, + pw.vpf, + pw.vzu, + pw.abt, + pw.aba, + pw.ain, + pw.ahx, + pw.online, + pw.vcc_ok, + pw.vin_ok, + pw.vdc_ok, + pw.vbt_ok, + pw.vba_ok, + pw.vpf_ok, + pw.vzu_ok, + pw.abt_ok, + pw.aba_ok, + pw.ain_ok, + pw.ahx_ok, + pw.bt_enabled, + pw.ba_enabled, + pw.bt_blocked, + pw.ba_blocked, + pw.vcc_low, + pw.vcc_high, + pw.vin_low, + pw.vin_high, + pw.vdc_low, + pw.vdc_high, + pw.vbt_low, + pw.vbt_full, + pw.vba_low, + pw.vba_full, + pw.vpf_low, + pw.vpf_high, + pw.vzu_low, + pw.vzu_high, + pw.abt_low, + pw.abt_high, + pw.aba_low, + pw.aba_high, + pw.ain_low, + pw.ain_high, + pw.ahx_low, + pw.ahx_high, + pw.mv_enabled, + pw.us_enabled, + pw.in_plugged, + pw.ba_full, + pw.bt_full, + rf.online, + js_online, + lc.online, + ca_mcam_state, + ca_rcam_state, + ca_mmic_state) + + return result diff --git a/HXbot/HXsound.py b/HXbot/HXsound.py new file mode 100755 index 0000000..40a96af --- /dev/null +++ b/HXbot/HXsound.py @@ -0,0 +1 @@ +# -*- coding: utf-8 -*- diff --git a/HXbot/REflex.py b/HXbot/REflex.py new file mode 100755 index 0000000..31b700f --- /dev/null +++ b/HXbot/REflex.py @@ -0,0 +1,224 @@ +# -*- coding: utf-8 -*- + +######################################## +# REflex communication module # +# EoF 2016 EoF@itphx.ru # +######################################## + +import threading +import time +import HX + + +class REflexClass(): + + def __init__(self, hxbot): + self.i2c_bus = hxbot.i2c_bus + self.hxbot = hxbot + + self.__e = None + self.__t = None + self.lock = hxbot.reflex_lock + + self.joystick = None + self.hxpower = None + self.control = HX.CONTROL_SRC_DEFAULT + + self.error_count = 0 + self.online = False + self.is_running = False + + self.ready_to_move = False + self.last_command_time = 0.0 + + self.__move_float = 0 + self.__steer_center = 0 + + # Tuple of commands for execute + self.m = ( + False, # Check + HX.MOVE_FLOAT, # Move + HX.STEER_CENTER, # Steer + HX.HEAD_V_CENTER, # Head vertical orientation + HX.HEAD_H_CENTER # Head horizontal orientation + ) + + # Tuple with results of executions + self.s = ( + HX.NO_RSP, + 0, + 0, + 0, + 0 + ) + + def start(self): + self.joystick = self.hxbot.joystick + self.hxpower = self.hxbot.hxpower + + self.__e = threading.Event() + self.__t = threading.Thread(target=self.__process, args=(self.__e, )) + + self.__t.start() + self.is_running = True + + def stop(self): + self.__e.set() + self.__t.join() + self.is_running = False + + self.__e = None + self.__t = None + + self.joystick = None + self.hxpower = None + + def start_move(self): + result = HX.OK_RSP + + # Enable moving + if not self.hxpower.mv_enabled: + result = self.hxpower.enable_mv() + + if result != HX.OK_RSP: + return + + self.ready_to_move = True + + def stop_move(self, non_block=False): + result = HX.OK_RSP + + # Disable moving + if self.hxpower.mv_blocked and not non_block: + return + + if self.hxpower.mv_enabled: + result = self.hxpower.disable_mv() + + if result != HX.OK_RSP: + return + + self.ready_to_move = False + + def get_temp(self): + return self.__send_command(HX.COM_GET_TEMP) + + def __send_command(self, command): + try: + with self.lock: + self.i2c_bus.write_word_data(HX.REFLEX_ADDRESS, command, 0) + time.sleep(HX.REFLEX_RESPONSE_DELAY) + response = self.i2c_bus.read_byte(HX.REFLEX_ADDRESS) + except IOError: + if self.online: + self.error_count += 1 + if self.error_count >= HX.REFLEX_ERROR_LIMIT: + self.online = False + return HX.IOE_RSP + else: + self.error_count = 0 + self.online = True + return response + + return HX.NO_RSP + + def __send_ex_command(self, flag, command): + try: + with self.lock: + self.i2c_bus.write_word_data(HX.REFLEX_ADDRESS, HX.EXT_COM, + flag << 8 | command) + time.sleep(HX.REFLEX_RESPONSE_DELAY) + response = self.i2c_bus.read_byte(HX.REFLEX_ADDRESS) + except IOError: + if self.online: + self.error_count += 1 + if self.error_count >= HX.REFLEX_ERROR_LIMIT: + self.online = False + return HX.IOE_RSP + else: + self.error_count = 0 + self.online = True + return response + + return HX.NO_RSP + + def __get_byte(self): + try: + with self.lock: + response = self.i2c_bus.read_byte(HX.REFLEX_ADDRESS) + except IOError: + if self.online: + self.error_count += 1 + if self.error_count >= HX.REFLEX_ERROR_LIMIT: + self.online = False + return HX.IOE_RSP + else: + self.error_count = 0 + self.online = True + return response + + def __process(self, stopRequest): + # Process loop + while not stopRequest.is_set(): + # Init cycle + have_commands = False + + # Ping REflex + self.__send_command(HX.COM_PING) + + # Joystick + if self.control == HX.CONTROL_SRC_JOYSTICK and self.joystick: + if self.joystick.ready: + # Joystick ready! Let's go! + if not self.ready_to_move: + self.start_move() + + # Get m + self.m = self.joystick.get_m() + have_commands = self.m[0] + else: + if self.ready_to_move: + self.stop_move(True) + time.sleep(0.5) + + # Execute received commands + if have_commands: + self.s = self.execute(self.m) + + # No commands? Stop move... + elif (time.clock() - self.last_command_time >= + HX.REFLEX_MOVE_TIMEOUT / 100): + self.stop_move() + + def execute(self, m): + # Move + if m[1] != HX.MOVE_FLOAT: + move_rsp = self.__send_ex_command(HX.MOVE_FLAG, m[1]) + self.__move_float = 0 + elif self.__move_float < 3: + move_rsp = self.__send_ex_command(HX.MOVE_FLAG, m[1]) + self.__move_float += 1 + else: + move_rsp = HX.OK_RSP + + # Steer + if m[2] != HX.STEER_CENTER: + steer_rsp = self.__send_ex_command(HX.STEER_FLAG, m[2]) + self.__steer_center = 0 + elif self.__steer_center < 3: + steer_rsp = self.__send_ex_command(HX.STEER_FLAG, m[2]) + self.__steer_center += 1 + else: + steer_rsp = HX.OK_RSP + + # Head vertiacal orientation + head_v_rsp = self.__send_ex_command(HX.HEAD_V_FLAG, m[3]) + + # Head horizontal orientation + head_h_rsp = self.__send_ex_command(HX.HEAD_H_FLAG, m[4]) + + # Set last command time + self.last_command_time = time.clock() + + # Return execution status + return (HX.OK_RSP, move_rsp, steer_rsp, head_v_rsp, head_h_rsp) \ No newline at end of file diff --git a/HXbot/__pycache__/HX.cpython-34.pyc b/HXbot/__pycache__/HX.cpython-34.pyc new file mode 100755 index 0000000..7273c6b Binary files /dev/null and b/HXbot/__pycache__/HX.cpython-34.pyc differ diff --git a/HXbot/__pycache__/HX.cpython-35.pyc b/HXbot/__pycache__/HX.cpython-35.pyc new file mode 100644 index 0000000..45efb0d Binary files /dev/null and b/HXbot/__pycache__/HX.cpython-35.pyc differ diff --git a/HXbot/__pycache__/HXcam.cpython-35.pyc b/HXbot/__pycache__/HXcam.cpython-35.pyc new file mode 100644 index 0000000..cff1f36 Binary files /dev/null and b/HXbot/__pycache__/HXcam.cpython-35.pyc differ diff --git a/HXbot/__pycache__/HXcontrol.cpython-34.pyc b/HXbot/__pycache__/HXcontrol.cpython-34.pyc new file mode 100755 index 0000000..fb6a3f5 Binary files /dev/null and b/HXbot/__pycache__/HXcontrol.cpython-34.pyc differ diff --git a/HXbot/__pycache__/HXdb.cpython-35.pyc b/HXbot/__pycache__/HXdb.cpython-35.pyc new file mode 100644 index 0000000..ef3a986 Binary files /dev/null and b/HXbot/__pycache__/HXdb.cpython-35.pyc differ diff --git a/HXbot/__pycache__/HXjoystick.cpython-34.pyc b/HXbot/__pycache__/HXjoystick.cpython-34.pyc new file mode 100755 index 0000000..ee4b08e Binary files /dev/null and b/HXbot/__pycache__/HXjoystick.cpython-34.pyc differ diff --git a/HXbot/__pycache__/HXjoystick.cpython-35.pyc b/HXbot/__pycache__/HXjoystick.cpython-35.pyc new file mode 100755 index 0000000..af09ace Binary files /dev/null and b/HXbot/__pycache__/HXjoystick.cpython-35.pyc differ diff --git a/HXbot/__pycache__/HXlcd.cpython-35.pyc b/HXbot/__pycache__/HXlcd.cpython-35.pyc new file mode 100644 index 0000000..6c84cc8 Binary files /dev/null and b/HXbot/__pycache__/HXlcd.cpython-35.pyc differ diff --git a/HXbot/__pycache__/HXpower.cpython-34.pyc b/HXbot/__pycache__/HXpower.cpython-34.pyc new file mode 100755 index 0000000..01c3046 Binary files /dev/null and b/HXbot/__pycache__/HXpower.cpython-34.pyc differ diff --git a/HXbot/__pycache__/HXpower.cpython-35.pyc b/HXbot/__pycache__/HXpower.cpython-35.pyc new file mode 100644 index 0000000..2a969f6 Binary files /dev/null and b/HXbot/__pycache__/HXpower.cpython-35.pyc differ diff --git a/HXbot/__pycache__/HXserver.cpython-34.pyc b/HXbot/__pycache__/HXserver.cpython-34.pyc new file mode 100755 index 0000000..276b4e1 Binary files /dev/null and b/HXbot/__pycache__/HXserver.cpython-34.pyc differ diff --git a/HXbot/__pycache__/HXserver.cpython-35.pyc b/HXbot/__pycache__/HXserver.cpython-35.pyc new file mode 100644 index 0000000..0a0f4ef Binary files /dev/null and b/HXbot/__pycache__/HXserver.cpython-35.pyc differ diff --git a/HXbot/__pycache__/HXu.cpython-34.pyc b/HXbot/__pycache__/HXu.cpython-34.pyc new file mode 100755 index 0000000..fa481ae Binary files /dev/null and b/HXbot/__pycache__/HXu.cpython-34.pyc differ diff --git a/HXbot/__pycache__/HXwatchdog.cpython-34.pyc b/HXbot/__pycache__/HXwatchdog.cpython-34.pyc new file mode 100755 index 0000000..f21bfee Binary files /dev/null and b/HXbot/__pycache__/HXwatchdog.cpython-34.pyc differ diff --git a/HXbot/__pycache__/REflex.cpython-34.pyc b/HXbot/__pycache__/REflex.cpython-34.pyc new file mode 100755 index 0000000..3e44704 Binary files /dev/null and b/HXbot/__pycache__/REflex.cpython-34.pyc differ diff --git a/HXbot/__pycache__/REflex.cpython-35.pyc b/HXbot/__pycache__/REflex.cpython-35.pyc new file mode 100644 index 0000000..c69bb6e Binary files /dev/null and b/HXbot/__pycache__/REflex.cpython-35.pyc differ diff --git a/HXbot/hxbot.nja b/HXbot/hxbot.nja new file mode 100755 index 0000000..113dfa8 --- /dev/null +++ b/HXbot/hxbot.nja @@ -0,0 +1,29 @@ +{ + "mainFile": "HXbot.py", + "use-tabs": false, + "venv": "", + "relatedProjects": [], + "name": "HXbot", + "license": "GNU General Public License v3", + "url": "", + "pythonPath": "/usr/bin/python3", + "preExecScript": "", + "additional_builtins": [], + "programParams": "", + "indentation": 4, + "PYTHONPATH": "", + "supported-extensions": [ + ".py", + ".html", + ".jpg", + ".png", + ".ui", + ".css", + ".json", + ".js", + ".ini" + ], + "project-type": "Import from sources", + "postExecScript": "", + "description": "Main program of HXbot" +} \ No newline at end of file diff --git a/HXcam/audio b/HXcam/audio new file mode 100755 index 0000000..e6edf0c --- /dev/null +++ b/HXcam/audio @@ -0,0 +1,4 @@ +#!/bin/bash +# Logitec C920 mic +# RTSP +cvlc -v 'alsa://hw:0,0' --sout '#transcode{acodec=mpga,ab=128,channels=2,samplerate=44100}:rtp{sdp=rtsp://:8556/audio}' diff --git a/HXcam/mainCam b/HXcam/mainCam new file mode 100755 index 0000000..e46a2dd --- /dev/null +++ b/HXcam/mainCam @@ -0,0 +1,19 @@ +#!/bin/bash +# Logitec C920 +# 1280x800:30 + +# RTSP +cvlc 'v4l2:///dev/video0:chroma=H264:width=1280:height=720:fps=15' --sout '#rtp{sdp=rtsp://:8554/video}' -v --live-caching 50 + +# MP4 +#cvlc 'v4l2:///dev/video0:chroma=H264:width=1280:height=720:fps=15' --sout '#http{mux=ts,dst=:8080/main.mp4}' -v --live-caching 50 + +# OGG +#cvlc 'v4l2:///dev/video0:chroma=H264:width=1280:height=720:fps=15' --sout '#transcode{vcodec=theora}:http{mux=ogg,dst=:8080/main.ogg}' -v --live-caching 50 + +# ASF +#cvlc 'v4l2:///dev/video0:chroma=H264:width=1280:height=720:fps=15' --sout '#http{mux=asf,dst=:8080/}' -v --live-caching 50 + +#v4l2-ctl --device=/dev/video1 --set-fmt-video=width=1280,height=720,pixelformat=1 + +#ffmpeg -r 15 -use_wallclock_as_timestamps 1 -copytb 0 -f v4l2 -vcodec h264 -i /dev/video1 -vcodec copy -f rtsp rtsp://:8554/video diff --git a/HXcam/rearCam b/HXcam/rearCam new file mode 100755 index 0000000..57d97c2 --- /dev/null +++ b/HXcam/rearCam @@ -0,0 +1,5 @@ +#!/bin/bash +# RPI Camera +# 1280x800:30 +# RTSP +raspivid -t 0 -n -w 1280 -h 720 -fps 15 -o - | cvlc -v stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8555/video}' :demux=h264 diff --git a/HXgui/HX.py b/HXgui/HX.py new file mode 100755 index 0000000..c414401 --- /dev/null +++ b/HXgui/HX.py @@ -0,0 +1,368 @@ +# -*- coding: utf-8 -*- + +######################################## +# HXbot utility module # +# EoF 2016 EoF@itphx.ru # +######################################## + +# I2C bus +I2C_BUS_NUMBER = 1 +EXT_COM = 0xAA +XOR_SEQ = 0xFF + +# VAR +REFLEX_ADDRESS = 0x04 +REFLEX_RESPONSE_DELAY = 0.1 # Delay to get response after send command, sec +REFLEX_ERROR_LIMIT = 5 +REFLEX_MOVE_TIMEOUT = 60 + +# COMMANDS +# Util +COM_PING = 0x01 +COM_GET_TEMP = 0x02 +COM_GET_DISTANCE = 0x03 + +# Stop +STOP = 0x0F +# Move +MOVE_FLAG = 0x04 +MOVE_FLOAT = 0x10 +MOVE_FWD1 = 0x11 +MOVE_FWD2 = 0x12 +MOVE_FWD3 = 0x13 +MOVE_FWD4 = 0x14 +MOVE_FWD5 = 0x15 +MOVE_FWD6 = 0x16 +MOVE_FWD7 = 0x17 +MOVE_BREAK = 0x18 +MOVE_REV7 = 0x19 +MOVE_REV6 = 0x1A +MOVE_REV5 = 0x1B +MOVE_REV4 = 0x1C +MOVE_REV3 = 0x1D +MOVE_REV2 = 0x1E +MOVE_REV1 = 0x1F + +# Steering +STEER_FLAG = 0x05 +STEER_CENTER = 0x20 +STEER_LEFT1 = 0x21 +STEER_LEFT2 = 0x22 +STEER_LEFT3 = 0x23 +STEER_LEFT4 = 0x24 +STEER_LEFT5 = 0x25 +STEER_LEFT6 = 0x26 +STEER_LEFT7 = 0x27 +STEER_FIX_CENTER = 0x28 +STEER_RIGHT7 = 0x29 +STEER_RIGHT6 = 0x2A +STEER_RIGHT5 = 0x2B +STEER_RIGHT4 = 0x2C +STEER_RIGHT3 = 0x2D +STEER_RIGHT2 = 0x2E +STEER_RIGHT1 = 0x2F + +# Head +HEAD_H_FLAG = 0x30 +HEAD_V_FLAG = 0x31 +HEAD_H_R_RANGE = 83 +HEAD_H_L_RANGE = 94 +HEAD_V_UP_RANGE = 90 +HEAD_V_DOWN_RANGE = 25 +HEAD_H_CENTER = 83 +HEAD_V_CENTER = 150 + +# CONTROL SOURCE +CONTROL_SRC_NONE = 0x00 +CONTROL_SRC_JOYSTICK = 0x01 +CONTROL_SRC_IRREMOTE = 0x02 +CONTROL_SRC_SERVER = 0x03 +CONTROL_SRC_DB = 0x04 +CONTROL_SRC_SUB1 = 0x11 +CONTROL_SRC_SUB2 = 0x12 +CONTROL_SRC_SUB3 = 0x13 +CONTROL_SRC_SUB4 = 0x14 +CONTROL_SRC_SUB5 = 0x15 + +CONTROL_SRC_DEFAULT = CONTROL_SRC_JOYSTICK + +# MOVE STATES +MOVE_STATE_STOP = 0x00 +MOVE_STATE_MOVE = 0x01 + +# STATUS +STATUS_INIT = 0x00 +STATUS_READY = 0x01 +STATUS_RUNNING = 0x02 +STATUS_STOP = 0x03 +STATUS_EXIT = 0x04 + +# STATUS STATES +#STATUS_STATE_OK = 0x00 +#STATUS_STATE_WARNING = 0x01 +#STATUS_STATE_ERROR = 0x02 +#STATUS_STATE_LOWBAT1 = 0x03 +#STATUS_STATE_LOWBAT2 = 0x04 + +# JOYSTICK +JOYSTICK_PATH = '/dev/input/js0' +JOYSTICK_READY_TIMEOUT = 60 + +# These constants were borrowed from linux/input.h +JOYSTICK_AXIS_NAMES = { + 0x00: 'x', + 0x01: 'y', + 0x02: 'z', + 0x03: 'rx', + 0x04: 'ry', + 0x05: 'rz', + 0x06: 'trottle', + 0x07: 'rudder', + 0x08: 'wheel', + 0x09: 'gas', + 0x0a: 'brake', + 0x10: 'hat0x', + 0x11: 'hat0y', + 0x12: 'hat1x', + 0x13: 'hat1y', + 0x14: 'hat2x', + 0x15: 'hat2y', + 0x16: 'hat3x', + 0x17: 'hat3y', + 0x18: 'pressure', + 0x19: 'distance', + 0x1a: 'tilt_x', + 0x1b: 'tilt_y', + 0x1c: 'tool_width', + 0x20: 'volume', + 0x28: 'misc', +} + +JOYSTICK_BUTTON_NAMES = { + 0x120: 'trigger', + 0x121: 'thumb', + 0x122: 'thumb2', + 0x123: 'top', + 0x124: 'top2', + 0x125: 'pinkie', + 0x126: 'base', + 0x127: 'base2', + 0x128: 'base3', + 0x129: 'base4', + 0x12a: 'base5', + 0x12b: 'base6', + 0x12f: 'dead', + 0x130: 'a', + 0x131: 'b', + 0x132: 'c', + 0x133: 'x', + 0x134: 'y', + 0x135: 'z', + 0x136: 'tl', + 0x137: 'tr', + 0x138: 'tl2', + 0x139: 'tr2', + 0x13a: 'select', + 0x13b: 'start', + 0x13c: 'mode', + 0x13d: 'thumbl', + 0x13e: 'thumbr', + + 0x220: 'dpad_up', + 0x221: 'dpad_down', + 0x222: 'dpad_left', + 0x223: 'dpad_right', + + # XBox 360 controller uses these codes. + 0x2c0: 'dpad_left', + 0x2c1: 'dpad_right', + 0x2c2: 'dpad_up', + 0x2c3: 'dpad_down', +} + +# JOYSTICK BINDS +JOYSTICK_MOVE_AXIS = 'y' +JOYSTICK_STEER_AXIS = 'x' +JOYSTICK_HEAD_V_AXIS = 'rz' +JOYSTICK_HEAD_H_AXIS = 'z' +JOYSTICK_START_BTN_1 = 'tl2' +JOYSTICK_START_BTN_2 = 'tr2' + +# HXpower +POWER_ADDRESS = 0x05 +POWER_RESPONSE_DELAY = 0.05 # Delay to get response after send command, sec +POWER_DELAY = 0.3 +POWER_ERROR_LIMIT = 3 +POWER_PF_TIMEOUT = 60 + +# Commands +# VOLTMETERS +COM_GET_VIN = 0x01 +COM_GET_VDC = 0x02 +COM_GET_VBT = 0x03 +COM_GET_VBA = 0x04 +COM_GET_VIS = 0x05 +COM_GET_VZU = 0x06 +COM_GET_VCC = 0x07 + +# AMPERMETERS +COM_GET_AHX = 0x21 +COM_GET_ABA = 0x22 +COM_GET_AIN = 0x23 +COM_GET_ADC = 0x24 + +# STATUS +COM_GET_STAT1 = 0x08 +# 0x01 - vcc_ok +# 0x02 - vin_ok +# 0x04 - vdc_ok +# 0x08 - vbt_ok +# 0x10 - vba_ok +# 0x20 - lr_enabled +# 0x40 - ba_enabled +# 0x80 - ba_blocked + +COM_GET_STAT2 = 0x09 +# 0x01 - bl_powered +# 0x02 - bl_error +# 0x04 - pf_complete +# 0x08 - pf_charge +# 0x10 - vis_ok +# 0x20 - vzu_ok +# 0x40 - pf_enabled +# 0x80 - bl_enabled + +COM_GET_STAT3 = 0x20 +# 0x01 - ahx_ok +# 0x02 - aba_ok +# 0x04 - ain_ok +# 0x08 - adc_ok + +# TEMP +COM_GET_POWER_TEMP = 0x10 + +VIN_MIN = 10.0 +VIN_MAX = 14.0 +VIN_LOW = 11.0 +VIN_HIGH = 13.0 + +VDC_MIN = 5.0 +VDC_MAX = 5.7 +VDC_LOW = 5.1 +VDC_HIGH = 5.5 + +VBT_MIN = 3.65 +VBT_MAX = 4.25 +VBT_LOW = 3.68 +VBT_FULL = 4.1 + +VBA_MIN = 9.0 +VBA_MAX = 12.8 +VBA_LOW = 10.0 +VBA_FULL = 12.4 + +VIS_MIN = 4.5 +VIS_MAX = 5.3 +VIS_LOW = 4.7 +VIS_HIGH = 5.2 + +VZU_MIN = 5.0 +VZU_MAX = 6.3 +VZU_LOW = 5.2 +VZU_HIGH = 6.2 + +VCC_MIN = 4.5 +VCC_MAX = 5.3 +VCC_LOW = 4.7 +VCC_HIGH = 5.1 + +AHX_MIN = 0.3 +AHX_MAX = 2.0 +AHX_LOW = 0.4 +AHX_HIGH = 1.2 + +ABA_MIN = 0.05 +ABA_MAX = 2.0 +ABA_LOW = 0.5 +ABA_HIGH = 1.5 + +AIN_MIN = 0.05 +AIN_MAX = 2.0 +AIN_LOW = 0.1 +AIN_HIGH = 1.5 + +ADC_MIN = 0.05 +ADC_MAX = 3.0 +ADC_LOW = 0.1 +ADC_HIGH = 1.5 + +# RELAYS +COM_POWER_ON_BL = 0x11 # 17 +COM_POWER_ON_PF = 0x12 # 18 +COM_SWITCH_TO_IS = 0x13 # 19 +COM_SWITCH_TO_IN = 0x14 # 20 + +COM_SHUTDOWN_BL = 0x15 # 21 +COM_SHUTDOWN_PF = 0x16 # 22 +COM_SWITCH_TO_LR = 0x17 # 23 +COM_SWITCH_TO_BA = 0x18 # 24 + +COM_ENABLE_PF = 0x1B # 27 +COM_DISABLE_PF = 0x1C # 28 + +COM_ENABLE_BL = 0x1D # 29 +COM_DISABLE_BL = 0x1E # 30 + +# HXserver +SRV_PORT = 50306 +SRV_HOST = '' +SRV_CMD_GET_ALL = 0x01 +SRV_TIMEOUT = 1 +SRV_MAX_ERR_COUNT = 3 + +# RETURN CODES +# Universal return codes +OK_RSP = 0x00 +NO_RSP = 0xFF +ERR_RSP = 0x01 +BLK_RSP = 0x02 +CSE_RSP = 0x03 +IOE_RSP = 0x04 +TMO_RSP = 0x05 + +# HXbot modul flags +I2C_BUS_ERR = 0x0001 +HXPOWER_ERR = 0x0002 +REFLEX_ERR = 0x0004 +SERVER_ERR = 0x0008 + +JOYSTICK_WRN = 0x0010 +HXCAMERA_WRN = 0x0020 +HXLCD_WRN = 0x0040 +HXDB_WRN = 0x0080 +HXLIGHT_WRN = 0x0100 +HXSOUND_WRN = 0x0200 +HXLOG_WRN = 0x0400 + +# HXlcd +LCD_ADDRESS = 0x06 +LCD_ERROR_LIMIT = 5 +LCD_DELAY = 1 +LCD_RESPONSE_DELAY = 0.05 + +# HXcam +CAM_MAX_WRN_COUNT = 3 +CAM_DELAY = 1.0 + +CAM_STATE_STP = 0 +CAM_STATE_RUN = 1 +CAM_STATE_WRN = 2 +CAM_STATE_ERR = 3 + +# HXdb +DB_DELAY = 1.0 + +DB_HOST = 'localhost' +DB_NAME = 'hxdb' +DB_USER = 'hxdb' +DB_PASS = 'hxdbP@S$' \ No newline at end of file diff --git a/HXgui/HX.pyc b/HXgui/HX.pyc new file mode 100644 index 0000000..b367e10 Binary files /dev/null and b/HXgui/HX.pyc differ diff --git a/HXgui/HXgui.py b/HXgui/HXgui.py new file mode 100755 index 0000000..3310725 --- /dev/null +++ b/HXgui/HXgui.py @@ -0,0 +1,724 @@ +#!/usr/bin/python3 +# -*- coding: utf-8 -*- + +######################################## +# HXbot GUI # +# EoF 2016 EoF@itphx.ru # +######################################## + +import socket +import sys +import struct +import curses +import time +import HX +import select +from curses import wrapper + + +class HXguiClass(): + + def __init__(self, stdscr): + super(HXguiClass, self).__init__() + + # UDP Socket + self.s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + self.s.settimeout(HX.SRV_TIMEOUT) + + # Init color pairs + self.RED_ON_BLACK = 1 + self.GREEN_ON_BLACK = 2 + self.YELLOW_ON_BLACK = 3 + self.BLUE_ON_BLACK = 4 + self.BLACK_ON_RED = 5 + curses.init_pair(self.RED_ON_BLACK, curses.COLOR_RED, + curses.COLOR_BLACK) + curses.init_pair(self.GREEN_ON_BLACK, curses.COLOR_GREEN, + curses.COLOR_BLACK) + curses.init_pair(self.YELLOW_ON_BLACK, curses.COLOR_YELLOW, + curses.COLOR_BLACK) + curses.init_pair(self.BLUE_ON_BLACK, curses.COLOR_BLUE, + curses.COLOR_BLACK) + curses.init_pair(self.BLACK_ON_RED, curses.COLOR_BLACK, + curses.COLOR_RED) + + # Params + self.power_online = False + + self.vcc = 0.0 + self.vin = 0.0 + self.vdc = 0.0 + self.vbt = 0.0 + self.vba = 0.0 + self.vpf = 0.0 + self.vzu = 0.0 + self.abt = 0.0 + self.aba = 0.0 + self.ain = 0.0 + self.ahx = 0.0 + + self.vcc_ok = False + self.vcc_low = False + self.vcc_high = False + self.vin_ok = False + self.vin_low = False + self.vin_high = False + self.vdc_ok = False + self.vdc_low = False + self.vdc_high = False + self.vbt_ok = False + self.vbt_low = False + self.vbt_full = False + self.vba_ok = False + self.vba_low = False + self.vba_full = False + self.vpf_ok = False + self.vpf_low = False + self.vpf_high = False + self.vzu_ok = False + self.vzu_low = False + self.vzu_high = False + + self.abt_ok = False + self.abt_low = False + self.abt_high = False + self.aba_ok = False + self.aba_low = False + self.aba_high = False + self.ain_ok = False + self.ain_low = False + self.ain_high = False + self.adc_ok = False + self.adc_low = False + self.adc_high = False + + self.bt_enabled = False + self.ba_enabled = False + self.mv_enabled = False + self.us_enabled = False + + self.in_plugged = False + self.bt_blocked = False + self.ba_blocked = False + self.bt_full = False + self.ba_full = False + + self.reflex_online = False + self.joystick_online = False + self.lcd_online = False + self.main_cam_state = 0 + self.rear_cam_state = 0 + self.main_mic_state = 0 + + self.error_count = 0 + self.connected = False + + # Init screen + stdscr.clear() + stdscr.refresh() + + def draw_interface(self): + self.header_text = "-= HXbot console v0.4 =-" + self.footer_text = "-= EoF 2016 =-" + + self.header = curses.newwin(1, curses.COLS, 0, 0) + self.header.bkgd(' ', curses.A_REVERSE) + self.header.addstr(0, (curses.COLS - len(self.header_text)) // 2, + self.header_text, curses.A_REVERSE) + + self.footer = curses.newwin(1, curses.COLS, curses.LINES - 1, 0) + self.footer.bkgd(' ', curses.A_REVERSE) + self.footer.addstr(0, (curses.COLS - len(self.footer_text)) // 2, + self.footer_text, curses.A_REVERSE) + + self.comline = curses.newwin(1, curses.COLS, curses.LINES - 2, 0) + self.comline.bkgd(' ', curses.A_NORMAL) + self.comline.addstr(0, 0, "COMMAND: ", curses.A_BOLD) + + self.mainwin = curses.newwin(curses.LINES - 3, curses.COLS, 1, 0) + self.mainwin.border() + + # Draw tables + self.mainwin.addstr(2, 3, "| Vcc | Vin | Vdc | Vbt | Vba " + + "| Vpf | Vzu |", curses.A_REVERSE) + self.mainwin.addstr(3, 3, "| | | | | " + + "| | |", curses.A_NORMAL) + self.mainwin.addstr(4, 3, "| | | | | " + + "| | |", curses.A_NORMAL) + + self.mainwin.addstr(6, 3, "| Abt || Aba || Ain || Ahx |", + curses.A_REVERSE) + self.mainwin.addstr(7, 3, "| || || || |", + curses.A_NORMAL) + self.mainwin.addstr(8, 3, "| || || || |", + curses.A_NORMAL) + + self.mainwin.addstr(10, 3, "| MAIN POWER || MOVE POWER |", + curses.A_REVERSE) + self.mainwin.addstr(11, 3, "| || |", + curses.A_NORMAL) + self.mainwin.addstr(12, 3, "| || |", + curses.A_NORMAL) + + #self.mainwin.addstr(11, 41, "| OK |", + #curses.A_REVERSE) + #self.mainwin.addstr(12, 41, "| |", + #curses.A_NORMAL) + + self.mainwin.addstr(2, 55, "| STATUS |", + curses.A_REVERSE) + self.mainwin.addstr(3, 55, "| |", + curses.A_NORMAL) + self.mainwin.addstr(4, 55, "| |", + curses.A_NORMAL) + self.mainwin.addstr(5, 55, "| |", + curses.A_NORMAL) + self.mainwin.addstr(6, 55, "| |", + curses.A_NORMAL) + self.mainwin.addstr(7, 55, "| |", + curses.A_NORMAL) + self.mainwin.addstr(8, 55, "| |", + curses.A_NORMAL) + self.mainwin.addstr(9, 55, "| |", + curses.A_NORMAL) + + self.mainwin.addstr(6, 41, "| BT & BA |", + curses.A_REVERSE) + self.mainwin.addstr(7, 41, "| |", + curses.A_NORMAL) + self.mainwin.addstr(8, 41, "| |", + curses.A_NORMAL) + self.mainwin.addstr(9, 41, "| |", + curses.A_NORMAL) + self.mainwin.addstr(10, 41, "| |", + curses.A_NORMAL) + self.mainwin.addstr(11, 41, "| |", + curses.A_NORMAL) + + # Add text windows + # Voltage states + self.vcc_st_win = curses.newwin(1, 5, 4, 5) + self.vin_st_win = curses.newwin(1, 5, 4, 12) + self.vdc_st_win = curses.newwin(1, 5, 4, 19) + self.vbt_st_win = curses.newwin(1, 5, 4, 26) + self.vba_st_win = curses.newwin(1, 5, 4, 33) + self.vpf_st_win = curses.newwin(1, 5, 4, 40) + self.vzu_st_win = curses.newwin(1, 5, 4, 47) + + # Voltage values + self.vcc_win = curses.newwin(1, 5, 5, 5) + self.vin_win = curses.newwin(1, 5, 5, 12) + self.vdc_win = curses.newwin(1, 5, 5, 19) + self.vbt_win = curses.newwin(1, 5, 5, 26) + self.vba_win = curses.newwin(1, 5, 5, 33) + self.vpf_win = curses.newwin(1, 5, 5, 40) + self.vzu_win = curses.newwin(1, 5, 5, 47) + + # Current states + self.abt_st_win = curses.newwin(1, 6, 8, 5) + self.aba_st_win = curses.newwin(1, 6, 8, 14) + self.ain_st_win = curses.newwin(1, 6, 8, 23) + self.ahx_st_win = curses.newwin(1, 6, 8, 32) + + # Current values + self.abt_win = curses.newwin(1, 6, 9, 5) + self.aba_win = curses.newwin(1, 6, 9, 14) + self.ain_win = curses.newwin(1, 6, 9, 23) + self.ahx_win = curses.newwin(1, 6, 9, 32) + + # Status + self.bt_st_win = curses.newwin(1, 14, 12, 5) + self.ba_st_win = curses.newwin(1, 14, 13, 5) + self.mv_st_win = curses.newwin(1, 14, 12, 23) + self.us_st_win = curses.newwin(1, 14, 13, 23) + + # Online Status + self.pw_online_win = curses.newwin(1, 19, 4, 57) + self.rf_online_win = curses.newwin(1, 19, 5, 57) + self.js_online_win = curses.newwin(1, 19, 6, 57) + self.lc_online_win = curses.newwin(1, 19, 7, 57) + self.mc_online_win = curses.newwin(1, 19, 8, 57) + self.rc_online_win = curses.newwin(1, 19, 9, 57) + self.mm_online_win = curses.newwin(1, 19, 10, 57) + + # BL & BA status + self.bt_blocked_win = curses.newwin(1, 9, 8, 43) + self.ba_blocked_win = curses.newwin(1, 9, 9, 43) + self.in_status_win = curses.newwin(1, 9, 10, 43) + self.bt_status_win = curses.newwin(1, 9, 11, 43) + self.ba_status_win = curses.newwin(1, 9, 12, 43) + + # Error pad + clr = curses.color_pair(self.RED_ON_BLACK) + self.error_pad = curses.newpad(3, 20) + self.error_pad.border() + self.error_pad.addstr(1, 2, "Connection lost!", clr) + + self.header.refresh() + self.footer.refresh() + self.mainwin.refresh() + + def draw_data(self): + # Set voltage states + if self.vcc_ok: + tst = " OK " + clr = curses.color_pair(self.GREEN_ON_BLACK) + if self.vcc_low: + tst = "LOW " + clr = curses.color_pair(self.YELLOW_ON_BLACK) + elif self.vcc_high: + tst = "HIGH" + clr = curses.color_pair(self.YELLOW_ON_BLACK) + else: + tst = "FAIL" + clr = curses.color_pair(self.RED_ON_BLACK) + self.vcc_st_win.addstr(0, 0, tst, clr) + self.vcc_st_win.refresh() + + if self.vin_ok: + tst = " OK " + clr = curses.color_pair(self.GREEN_ON_BLACK) + if self.vin_low: + tst = "LOW " + clr = curses.color_pair(self.YELLOW_ON_BLACK) + elif self.vin_high: + tst = "HIGH" + clr = curses.color_pair(self.YELLOW_ON_BLACK) + else: + tst = "FAIL" + clr = curses.color_pair(self.RED_ON_BLACK) + self.vin_st_win.addstr(0, 0, tst, clr) + self.vin_st_win.refresh() + + if self.vdc_ok: + tst = " OK " + clr = curses.color_pair(self.GREEN_ON_BLACK) + if self.vdc_low: + tst = "LOW " + clr = curses.color_pair(self.YELLOW_ON_BLACK) + elif self.vdc_high: + tst = "HIGH" + clr = curses.color_pair(self.YELLOW_ON_BLACK) + else: + tst = "FAIL" + clr = curses.color_pair(self.RED_ON_BLACK) + self.vdc_st_win.addstr(0, 0, tst, clr) + self.vdc_st_win.refresh() + + if self.vbt_ok: + tst = " OK " + clr = curses.color_pair(self.GREEN_ON_BLACK) + if self.vbt_low: + tst = "LOW " + clr = curses.color_pair(self.YELLOW_ON_BLACK) + elif self.vbt_full: + tst = "FULL" + clr = curses.color_pair(self.GREEN_ON_BLACK) + else: + tst = "FAIL" + clr = curses.color_pair(self.RED_ON_BLACK) + self.vbt_st_win.addstr(0, 0, tst, clr) + self.vbt_st_win.refresh() + + if self.mv_enabled: + if self.vpf_ok: + tst = " OK " + clr = curses.color_pair(self.GREEN_ON_BLACK) + if self.vpf_low: + tst = "LOW " + clr = curses.color_pair(self.YELLOW_ON_BLACK) + elif self.vpf_high: + tst = "HIGH" + clr = curses.color_pair(self.GREEN_ON_BLACK) + else: + tst = "FAIL" + clr = curses.color_pair(self.RED_ON_BLACK) + else: + tst = "OFF " + clr = curses.color_pair(self.BLUE_ON_BLACK) + self.vpf_st_win.addstr(0, 0, tst, clr) + self.vpf_st_win.refresh() + + if self.vba_ok: + tst = " OK " + clr = curses.color_pair(self.GREEN_ON_BLACK) + if self.vba_low: + tst = "LOW " + clr = curses.color_pair(self.YELLOW_ON_BLACK) + elif self.vba_full: + tst = "FULL" + clr = curses.color_pair(self.GREEN_ON_BLACK) + else: + tst = "FAIL" + clr = curses.color_pair(self.RED_ON_BLACK) + self.vba_st_win.addstr(0, 0, tst, clr) + self.vba_st_win.refresh() + + if self.mv_enabled: + if self.vzu_ok: + tst = " OK " + clr = curses.color_pair(self.GREEN_ON_BLACK) + if self.vzu_low: + tst = "LOW " + clr = curses.color_pair(self.YELLOW_ON_BLACK) + elif self.vzu_high: + tst = "HIGH" + clr = curses.color_pair(self.GREEN_ON_BLACK) + else: + tst = "FAIL" + clr = curses.color_pair(self.RED_ON_BLACK) + else: + tst = "OFF " + clr = curses.color_pair(self.BLUE_ON_BLACK) + self.vzu_st_win.addstr(0, 0, tst, clr) + self.vzu_st_win.refresh() + + if self.abt_ok: + tst = " OK " + clr = curses.color_pair(self.GREEN_ON_BLACK) + if self.abt_low: + tst = "LOW " + clr = curses.color_pair(self.YELLOW_ON_BLACK) + elif self.abt_high: + tst = "HIGH" + clr = curses.color_pair(self.YELLOW_ON_BLACK) + else: + tst = "FAIL" + clr = curses.color_pair(self.RED_ON_BLACK) + self.abt_st_win.addstr(0, 0, tst, clr) + self.abt_st_win.refresh() + + if self.aba_ok: + tst = " OK " + clr = curses.color_pair(self.GREEN_ON_BLACK) + if self.aba_low: + tst = "LOW " + clr = curses.color_pair(self.YELLOW_ON_BLACK) + elif self.aba_high: + tst = "HIGH" + clr = curses.color_pair(self.YELLOW_ON_BLACK) + else: + tst = "FAIL" + clr = curses.color_pair(self.RED_ON_BLACK) + self.aba_st_win.addstr(0, 0, tst, clr) + self.aba_st_win.refresh() + + if self.ain_ok: + tst = " OK " + clr = curses.color_pair(self.GREEN_ON_BLACK) + if self.ain_low: + tst = "LOW " + clr = curses.color_pair(self.YELLOW_ON_BLACK) + elif self.ain_high: + tst = "HIGH" + clr = curses.color_pair(self.YELLOW_ON_BLACK) + else: + tst = "FAIL" + clr = curses.color_pair(self.RED_ON_BLACK) + self.ain_st_win.addstr(0, 0, tst, clr) + self.ain_st_win.refresh() + + if self.ahx_ok: + tst = " OK " + clr = curses.color_pair(self.GREEN_ON_BLACK) + if self.ahx_low: + tst = "LOW " + clr = curses.color_pair(self.YELLOW_ON_BLACK) + elif self.ahx_high: + tst = "HIGH" + clr = curses.color_pair(self.YELLOW_ON_BLACK) + else: + tst = "FAIL" + clr = curses.color_pair(self.RED_ON_BLACK) + self.ahx_st_win.addstr(0, 0, tst, clr) + self.ahx_st_win.refresh() + + # Set voltage values + try: + self.vcc_win.addstr(0, 0, '{:1.2f}'.format(self.vcc), + curses.A_NORMAL) + self.vcc_win.refresh() + self.vin_win.addstr(0, 0, '{:2.1f}'.format(self.vin), + curses.A_NORMAL) + self.vin_win.refresh() + self.vdc_win.addstr(0, 0, '{:1.2f}'.format(self.vdc), + curses.A_NORMAL) + self.vdc_win.refresh() + self.vbt_win.addstr(0, 0, '{:1.2f}'.format(self.vbt), + curses.A_NORMAL) + self.vbt_win.refresh() + self.vba_win.addstr(0, 0, '{:2.1f}'.format(self.vba), + curses.A_NORMAL) + self.vba_win.refresh() + self.vpf_win.addstr(0, 0, '{:1.2f}'.format(self.vpf), + curses.A_NORMAL) + self.vpf_win.refresh() + self.vzu_win.addstr(0, 0, '{:1.2f}'.format(self.vzu), + curses.A_NORMAL) + self.vzu_win.refresh() + + self.abt_win.addstr(0, 0, '{:2.2f}'.format(self.abt), + curses.A_NORMAL) + self.abt_win.refresh() + self.aba_win.addstr(0, 0, '{:2.2f}'.format(self.aba), + curses.A_NORMAL) + self.aba_win.refresh() + self.ain_win.addstr(0, 0, '{:2.2f}'.format(self.ain), + curses.A_NORMAL) + self.ain_win.refresh() + self.ahx_win.addstr(0, 0, '{:2.2f}'.format(self.ahx), + curses.A_NORMAL) + self.ahx_win.refresh() + except curses.error: + #comline.addstr(0, 0, str(vba), curses.A_NORMAL) + #comline.refresh() + pass + + # Set status + if self.bt_enabled: + tst = "BT Enabled " + clr = curses.color_pair(self.GREEN_ON_BLACK) + else: + tst = "BT Disabled" + clr = curses.color_pair(self.YELLOW_ON_BLACK) + self.bt_st_win.addstr(0, 0, tst, clr) + self.bt_st_win.refresh() + + if self.ba_enabled: + tst = "BA Enabled " + clr = curses.color_pair(self.GREEN_ON_BLACK) + else: + tst = "BA Disabled" + clr = curses.color_pair(self.YELLOW_ON_BLACK) + self.ba_st_win.addstr(0, 0, tst, clr) + self.ba_st_win.refresh() + + if self.mv_enabled: + tst = "MV Enabled " + clr = curses.color_pair(self.GREEN_ON_BLACK) + else: + tst = "MV Disabled" + clr = curses.color_pair(self.RED_ON_BLACK) + self.mv_st_win.addstr(0, 0, tst, clr) + self.mv_st_win.refresh() + + if self.us_enabled: + tst = "US Enabled " + clr = curses.color_pair(self.GREEN_ON_BLACK) + else: + tst = "US Disabled" + clr = curses.color_pair(self.RED_ON_BLACK) + self.us_st_win.addstr(0, 0, tst, clr) + self.us_st_win.refresh() + + # Set online status + tst = "HXpower" + if self.power_online: + clr = curses.color_pair(self.GREEN_ON_BLACK) + else: + clr = curses.color_pair(self.RED_ON_BLACK) + self.pw_online_win.addstr(0, 0, tst, clr) + self.pw_online_win.refresh() + + tst = "REflex" + if self.reflex_online: + clr = curses.color_pair(self.GREEN_ON_BLACK) + else: + clr = curses.color_pair(self.RED_ON_BLACK) + self.rf_online_win.addstr(0, 0, tst, clr) + self.rf_online_win.refresh() + + tst = "Joystick" + if self.joystick_online: + clr = curses.color_pair(self.GREEN_ON_BLACK) + else: + clr = curses.color_pair(self.BLUE_ON_BLACK) + self.js_online_win.addstr(0, 0, tst, clr) + self.js_online_win.refresh() + + tst = "Display" + if self.lcd_online: + clr = curses.color_pair(self.GREEN_ON_BLACK) + else: + clr = curses.color_pair(self.BLUE_ON_BLACK) + self.lc_online_win.addstr(0, 0, tst, clr) + self.lc_online_win.refresh() + + tst = "Main camera" + if self.main_cam_state == HX.CAM_STATE_RUN: + clr = curses.color_pair(self.GREEN_ON_BLACK) + elif self.main_cam_state == HX.CAM_STATE_STP: + clr = curses.color_pair(self.BLUE_ON_BLACK) + elif self.main_cam_state == HX.CAM_STATE_WRN: + clr = curses.color_pair(self.YELLOW_ON_BLACK) + else: + clr = curses.color_pair(self.RED_ON_BLACK) + self.mc_online_win.addstr(0, 0, tst, clr) + self.mc_online_win.refresh() + + tst = "Rear camera" + if self.rear_cam_state == HX.CAM_STATE_RUN: + clr = curses.color_pair(self.GREEN_ON_BLACK) + elif self.rear_cam_state == HX.CAM_STATE_STP: + clr = curses.color_pair(self.BLUE_ON_BLACK) + elif self.rear_cam_state == HX.CAM_STATE_WRN: + clr = curses.color_pair(self.YELLOW_ON_BLACK) + else: + clr = curses.color_pair(self.RED_ON_BLACK) + self.rc_online_win.addstr(0, 0, tst, clr) + self.rc_online_win.refresh() + + tst = "Main mic" + if self.main_mic_state == HX.CAM_STATE_RUN: + clr = curses.color_pair(self.GREEN_ON_BLACK) + elif self.main_mic_state == HX.CAM_STATE_STP: + clr = curses.color_pair(self.BLUE_ON_BLACK) + elif self.main_mic_state == HX.CAM_STATE_WRN: + clr = curses.color_pair(self.YELLOW_ON_BLACK) + else: + clr = curses.color_pair(self.RED_ON_BLACK) + self.mm_online_win.addstr(0, 0, tst, clr) + self.mm_online_win.refresh() + + # Set EX & BA status + tst = "BT block" + if self.bt_blocked: + clr = curses.color_pair(self.GREEN_ON_BLACK) + else: + clr = curses.color_pair(self.BLUE_ON_BLACK) + self.bt_blocked_win.addstr(0, 0, tst, clr) + self.bt_blocked_win.refresh() + + tst = "BA block" + if self.ba_blocked: + clr = curses.color_pair(self.GREEN_ON_BLACK) + else: + clr = curses.color_pair(self.BLUE_ON_BLACK) + self.ba_blocked_win.addstr(0, 0, tst, clr) + self.ba_blocked_win.refresh() + + tst = "IN plugg" + if self.in_plugged: + clr = curses.color_pair(self.GREEN_ON_BLACK) + else: + clr = curses.color_pair(self.BLUE_ON_BLACK) + self.in_status_win.addstr(0, 0, tst, clr) + self.in_status_win.refresh() + + #if self.bt_charge: + #tst = "BT chrg" + #clr = curses.color_pair(self.YELLOW_ON_BLACK) + if self.bt_full: + tst = "BT full" + clr = curses.color_pair(self.GREEN_ON_BLACK) + else: + tst = "BT chrg" + clr = curses.color_pair(self.BLUE_ON_BLACK) + self.bt_status_win.addstr(0, 0, tst, clr) + self.bt_status_win.refresh() + + #if self.ba_charge: + #tst = "BA chrg" + #clr = curses.color_pair(self.YELLOW_ON_BLACK) + if self.ba_full: + tst = "BA full" + clr = curses.color_pair(self.GREEN_ON_BLACK) + else: + tst = "BA chrg" + clr = curses.color_pair(self.BLUE_ON_BLACK) + self.ba_status_win.addstr(0, 0, tst, clr) + self.ba_status_win.refresh() + + + def get_data(self): + # Get values + HOST, PORT = "localhost", HX.SRV_PORT + + self.s.sendto(struct.pack('B', HX.SRV_CMD_GET_ALL), (HOST, PORT)) + + try: + data = self.s.recv(1024) + except socket.timeout: + if self.error_count < HX.SRV_MAX_ERR_COUNT: + self.error_count += 1 + else: + self.connected = False + return + + self.error_count = 0 + self.connected = True + + self.vcc, self.vin, self.vdc, self.vbt, self.vba, self.vpf, self.vzu, \ + self.abt, self.aba, self.ain, self.ahx, \ + self.power_online, \ + self.vcc_ok, self.vin_ok, self.vdc_ok, self.vbt_ok, self.vba_ok, \ + self.vpf_ok, self.vzu_ok, \ + self.abt_ok, self.aba_ok, self.ain_ok, self.ahx_ok, \ + self.bt_enabled, self.ba_enabled, self.bt_blocked, self.ba_blocked, \ + self.vcc_low, self.vcc_high, self.vin_low, self.vin_high, \ + self.vdc_low, self.vdc_high, self.vbt_low, self.vbt_full, \ + self.vba_low, self.vba_full, self.vpf_low, self.vpf_high, \ + self.vzu_low, self.vzu_high, \ + self.abt_low, self.abt_high, self.aba_low, self.aba_high, \ + self.ain_low, self.ain_high, self.ahx_low, self.ahx_high, \ + self.mv_enabled, self.us_enabled, self.in_plugged, \ + self.ba_full, self.bt_full, self.reflex_online, \ + self.joystick_online, self.lcd_online, \ + self.main_cam_state, self.rear_cam_state, self.main_mic_state = \ + struct.unpack( + 'fffffffffff??????????????????????????????????????????????BBB', + data) + + def execute(self): + self.draw_interface() + redrawed = False + + while True: + # Get values + self.get_data() + + self.draw_data() + + if not self.connected: + self.error_pad.refresh(0, 0, 10, 30, 13, 50) + redrawed = False + else: + if not redrawed: + self.mainwin.redrawwin() + self.mainwin.refresh() + redrawed = True + + self.comline.refresh() + if sys.stdin in select.select([sys.stdin], [], [], 0)[0]: + key = self.comline.getkey() + if key.upper() == 'Q': + break + + time.sleep(0.2) + + +def main(stdscr): + HXgui = HXguiClass(stdscr) + HXgui.execute() + sys.exit() + + +# GENERAL PROGRAM +if __name__ == "__main__": + # Setup + stdscr = curses.initscr() + curses.start_color() + + curses.noecho() + curses.cbreak() + stdscr.keypad(True) + + # Start main function + wrapper(main) + + # Cleanup + curses.nocbreak() + stdscr.keypad(False) + curses.echo() + + curses.endwin() \ No newline at end of file diff --git a/HXgui/__pycache__/HX.cpython-34.pyc b/HXgui/__pycache__/HX.cpython-34.pyc new file mode 100755 index 0000000..8498730 Binary files /dev/null and b/HXgui/__pycache__/HX.cpython-34.pyc differ diff --git a/HXgui/__pycache__/HX.cpython-35.pyc b/HXgui/__pycache__/HX.cpython-35.pyc new file mode 100644 index 0000000..3bab12f Binary files /dev/null and b/HXgui/__pycache__/HX.cpython-35.pyc differ diff --git a/HXgui/hxgui.nja b/HXgui/hxgui.nja new file mode 100755 index 0000000..4821ec0 --- /dev/null +++ b/HXgui/hxgui.nja @@ -0,0 +1,7 @@ +{ + "venv": "", + "project-type": "Import from sources", + "name": "HXgui", + "license": "GNU General Public License v3", + "description": "HXbot GUI" +} \ No newline at end of file diff --git a/HXlcd/HXlcd.ino b/HXlcd/HXlcd.ino new file mode 100644 index 0000000..079cc38 --- /dev/null +++ b/HXlcd/HXlcd.ino @@ -0,0 +1,339 @@ +///////////////////////////////////////// +// HXbot HXlcd firmware / +// EoF 2016 EoF@itphx.ru / +///////////////////////////////////////// + +#include +#include +#include + +// DEBUG +#define DEBUG 1 + +// DEFINE +#define SLAVE_ADDRESS 0x06 +#define XOR_SEQ 0xFF +#define EXT_COM 0xAA + +#define R_LED 10 +#define G_LED 9 +#define B_LED 11 +#define L_BTN A3 +#define C_BTN A2 +#define R_BTN A1 +#define RED_PIN 10 +#define GRN_PIN 9 +#define LCD_BL 3 + +// Sensors +#define LIGHT A6 +#define LOUD A7 +#define TEMP A0 +#define BUZZ 13 +#define FREE 12 + +#define LED_PIN 13 + +#define DELAY1 2000 +#define DELAY2 500 + +// COMMANDS +// Util +#define COM_PING 0x01 +#define COM_GET_TEMP 0x02 + +// Response +#define OK_RSP 0x00 +#define NO_RSP 0xFF +#define ERR_RSP 0x01 +#define BLK_RSP 0x02 +#define CSE_RSP 0x03 +#define IOE_RSP 0x04 +#define TMO_RSP 0x05 + +// VAR +LiquidCrystal lcd(2, 4, 5, 6, 7, 8); +DHT11 dht(TEMP); + +// эту константу (typVbg) необходимо откалибровать индивидуально +const float typVbg = 1.08; // 1.0 -- 1.2 + +byte autoresponse = 0; +byte cmd = 0; +byte flg = 0; +byte ext = 0; + +int temp, hum; + +void setup() { + + if (DEBUG) { + Serial.println("GO!"); + Serial.begin(9600); + } + + // Initialize i2c as slave + Wire.begin(SLAVE_ADDRESS); + + // Define callbacks for i2c communication + Wire.onReceive(receiveData); + Wire.onRequest(answer); + + // put your setup code here, to run once: + pinMode(LED_PIN, OUTPUT); + pinMode(RED_PIN, OUTPUT); + //digitalWrite(RED_PIN, LOW); + pinMode(GRN_PIN, OUTPUT); + //digitalWrite(GRN_PIN, LOW); + + pinMode(R_LED, OUTPUT); + pinMode(G_LED, OUTPUT); + pinMode(B_LED, OUTPUT); + + pinMode(LCD_BL, OUTPUT); + + pinMode(L_BTN,INPUT_PULLUP); + pinMode(C_BTN,INPUT_PULLUP); + pinMode(R_BTN,INPUT_PULLUP); + + pinMode(LIGHT, INPUT); + pinMode(LOUD, INPUT); + pinMode(FREE, INPUT); + pinMode(BUZZ, OUTPUT); + + randomSeed(millis()); + analogReference(DEFAULT); + + lcd.begin(16, 2); + analogWrite(LCD_BL, 255); + lcd.print("Hello world!"); + + dht.begin(); + + delay(2000); + lcd.clear(); +} + +void loop() { + if (digitalRead(FREE) == HIGH) { + analogWrite(GRN_PIN, 128); + } + else { + analogWrite(GRN_PIN, 0); + } + + displayALL(); + + if (DEBUG) { + Serial.print("Vcc: "); + Serial.println(readvcc()); + } + + delay(500); +} + +void rgb_control() { + //int tmp1; + //tmp1 = Read(L_BTN); + if (digitalRead(L_BTN) == LOW) { + analogWrite(R_LED, 255); + //Serial.println(analogRead(L_BTN)); + } + else { + analogWrite(R_LED,0); + } + + if (digitalRead(C_BTN) == LOW) { + analogWrite(G_LED, 255); + } + else { + analogWrite(G_LED,0); + } + + if (digitalRead(R_BTN) == LOW) { + analogWrite(B_LED, 255); + } + else { + analogWrite(B_LED,0); + } +} + +void displayTH() { + int result; + result = dht.read(); + + lcd.clear(); + + lcd.setCursor(0, 0); + lcd.print("Temp:"); + lcd.setCursor(0, 1); + lcd.print("Hum:"); + + if (result == DHT_OK) { + lcd.setCursor(6, 0); + lcd.print(dht.getTemperatureC()); + lcd.print(" C"); + + lcd.setCursor(6, 1); + lcd.print(dht.getHumidity()); + lcd.print(" %"); + } + else { + lcd.setCursor(6, 0); + lcd.print("ERROR"); + lcd.setCursor(6, 1); + lcd.print("ERROR"); + } +} + +void displayLL() { + lcd.clear(); + + lcd.setCursor(0, 0); + lcd.print("Light:"); + lcd.setCursor(0, 1); + lcd.print("Loud:"); + + lcd.setCursor(8, 0); + lcd.print(analogRead(LIGHT)); + + lcd.setCursor(8, 1); + lcd.print(analogRead(LOUD)); +} + +void displayALL() { + int result; + result = dht.read(); + + lcd.clear(); + + lcd.setCursor(0, 0); + lcd.print("Li:"); + lcd.setCursor(0, 1); + lcd.print("Lo:"); + + lcd.setCursor(4, 0); + lcd.print(analogRead(LIGHT)); + + lcd.setCursor(4, 1); + lcd.print(analogRead(LOUD)); + + lcd.setCursor(9, 0); + lcd.print("T:"); + lcd.setCursor(9, 1); + lcd.print("H:"); + + if (result == DHT_OK) { + lcd.setCursor(11, 0); + lcd.print(dht.getTemperatureC()); + lcd.print("C"); + + lcd.setCursor(11, 1); + lcd.print(dht.getHumidity()); + lcd.print(" %"); + } + else { + lcd.setCursor(11, 0); + lcd.print("ERR"); + lcd.setCursor(11, 1); + lcd.print("ERR"); + } +} + +// Callback for received data +void receiveData(int byteCount) { + + while(Wire.available()) { + // Get command + cmd = Wire.read(); + if (cmd == EXT_COM && byteCount == 3) { + flg = 0x00; + ext = 0x00; + + if (Wire.available()) ext = Wire.read(); + if (Wire.available()) flg = Wire.read(); + } + else { + // Cleanup I2C bus + while(Wire.available()) { + ext = Wire.read(); + } + } + + switch (cmd) { + case COM_PING: + autoresponse = OK_RSP; + blink_red(); + break; + case COM_GET_TEMP: + autoresponse = getInternalTemp(); + break; + default: + autoresponse = ERR_RSP; + break; + } + } +} + +// Callback for sending data +void answer() { + Wire.write(autoresponse); +} + +void red_on() { + digitalWrite(RED_PIN, HIGH); +} + +void red_off() { + digitalWrite(RED_PIN, LOW); +} + +void blink_red() { + red_on(); + delay(100); + red_off(); +} + +// Get the internal temperature of the arduino +double getInternalTemp(void) { + unsigned int wADC; + double t; + ADMUX = (_BV(REFS1) | _BV(REFS0) | _BV(MUX3)); + ADCSRA |= _BV(ADEN); // enable the ADC + delay(20); // wait for voltages to become stable. + ADCSRA |= _BV(ADSC); // Start the ADC + while (bit_is_set(ADCSRA,ADSC)); + wADC = ADCW; + t = (wADC - 324.31 ) / 1.22; + return (t); +} + +float readvcc() { + byte i; + float tmp = 0.0; + + // Read 1.1V reference against Avcc + // set the reference to vcc and the measurement to the internal 1.1V reference + #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) + ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); + #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) + ADMUX = _BV(MUX5) | _BV(MUX0); + #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) + ADMUX = _BV(MUX3) | _BV(MUX2); + #else + // works on an Arduino 168 or 328 + ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); + #endif + + delay(3); // Wait for Vref to settle + ADCSRA |= _BV(ADSC); // Start conversion + while (bit_is_set(ADCSRA,ADSC)); // measuring + + uint8_t low = ADCL; // must read ADCL first - it then locks ADCH + uint8_t high = ADCH; // unlocks both + + tmp = (high<<8) | low; + tmp = (typVbg * 1023.0) / tmp; + + return tmp; +} diff --git a/HXlcd2/HXlcd2.h b/HXlcd2/HXlcd2.h new file mode 100644 index 0000000..b1c4e80 --- /dev/null +++ b/HXlcd2/HXlcd2.h @@ -0,0 +1,16 @@ +#define WHITE 0xFFFF +#define BLACK 0x0000 +#define GRAY 0x7BEF +#define DGRAY 0x2124 +#define BLUE 0x051C +#define LBLUE 0x96BC +#define DBLUE 0x0311 +#define YELLOW 0xFF60 +#define LYELLOW 0xFFAD +#define DYELLOW 0xBD80 + +#define SCR_MAX 5 +#define SCR1_MAX 5 + +#define BTN_TIMEOUT 500 + diff --git a/HXlcd2/HXlcd2.ino b/HXlcd2/HXlcd2.ino new file mode 100644 index 0000000..1ad8cfb --- /dev/null +++ b/HXlcd2/HXlcd2.ino @@ -0,0 +1,690 @@ +///////////////////////////////////////// +// HXbot HXlcd firmware / +// EoF 2016 EoF@itphx.ru / +///////////////////////////////////////// + +#include +#include +#include // Core graphics library +#include // Hardware-specific library +#include +#include "HXlcd2.h" + + +// DEBUG +#define DEBUG 1 + +// DEFINE +#define SLAVE_ADDRESS 0x06 +#define XOR_SEQ 0xFF +#define EXT_COM 0xAA + +#define R_LED 10 +#define G_LED 9 +#define B_LED 11 +#define L_BTN A3 +#define C_BTN A2 +#define R_BTN A1 + +//clk 4, din 5, dc 6, cs 7, rst 8 +#define TFT_BL 3 +#define TFT_SCLK 4 +#define TFT_MOSI 5 +#define TFT_DC 6 +#define TFT_CS 7 +#define TFT_RST 8 + +// Sensors +#define LIGHT A6 +#define LOUD A7 +#define TEMP A0 +#define BUZZ 13 +#define FREE 12 + +#define LED_PIN 13 + +#define DELAY1 2000 +#define DELAY2 500 + +// COMMANDS +// Util +#define COM_PING 0x01 +#define COM_GET_TEMP 0x02 + +// Response +#define OK_RSP 0x00 +#define NO_RSP 0xFF +#define ERR_RSP 0x01 +#define BLK_RSP 0x02 +#define CSE_RSP 0x03 +#define IOE_RSP 0x04 +#define TMO_RSP 0x05 + +// VAR + +DHT11 dht(TEMP); +Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST); + +// эту константу (typVbg) необходимо откалибровать индивидуально +const float typVbg = 1.08; // 1.0 -- 1.2 + +byte autoresponse = 0; +byte cmd = 0; +byte flg = 0; +byte ext = 0; + +int temp, hum; + +float p = 3.1415926; +float vcc; +bool l_pressed = false, c_pressed = false, r_pressed = false; +bool menu_drawed = false; +byte screen = 0, line = 1; + +unsigned long t; + +void setup() { + + if (DEBUG) { + Serial.begin(9600); + Serial.println("GO!"); + } + + // Initialize i2c as slave + Wire.begin(SLAVE_ADDRESS); + + // Define callbacks for i2c communication + Wire.onReceive(receiveData); + Wire.onRequest(answer); + + // put your setup code here, to run once: + pinMode(LED_PIN, OUTPUT); + + pinMode(R_LED, OUTPUT); + pinMode(G_LED, OUTPUT); + pinMode(B_LED, OUTPUT); + + pinMode(TFT_BL, OUTPUT); + + pinMode(L_BTN, INPUT_PULLUP); + pinMode(C_BTN, INPUT_PULLUP); + pinMode(R_BTN, INPUT_PULLUP); + + pinMode(LIGHT, INPUT); + pinMode(LOUD, INPUT); + pinMode(FREE, INPUT); + pinMode(BUZZ, OUTPUT); + + randomSeed(millis()); + analogReference(DEFAULT); + + // Use this initializer if you're using a 1.8" TFT + tft.initR(INITR_BLACKTAB); // initialize a ST7735S chip, black tab + tft.fillScreen(ST7735_BLACK); + + tft.drawRect(0, 0, 128, 160, ST7735_GREEN); + tft.drawRect(1, 1, 126, 158, ST7735_WHITE); + drawL(); + drawC(); + drawR(); + analogWrite(TFT_BL, 255); + + dht.begin(); +} + +void loop() { + if (digitalRead(FREE) == HIGH) { + analogWrite(G_LED, 128); + } + else { + analogWrite(G_LED, 0); + } + +// if (DEBUG) { +// Serial.println(r_pressed); +// Serial.println(c_pressed); +// Serial.println(l_pressed); +// } + + readButtons(); + drawMenu(); + //displayALL(); +} + +void drawMenu() { + + if (millis() - t < BTN_TIMEOUT) return; + + if (screen == 0) { + if (l_pressed) { + line++; + if (line > SCR1_MAX) line = 1; + drawPointer(); + t = millis(); + } + if (r_pressed) { + line--; + if (line < 1) line = SCR1_MAX; + drawPointer(); + t = millis(); + } + + if (! menu_drawed) { + tft.setTextSize(1); + tft.setCursor(52, 8); + tft.print("MAIN"); + + tft.setTextSize(1); + tft.setCursor(20, 20); + tft.print("HXbot"); + tft.setCursor(20, 30); + tft.print("REflex"); + tft.setCursor(20, 40); + tft.print("HXpower"); + tft.setCursor(20, 50); + tft.print("HXlcd"); + tft.setCursor(20, 60); + tft.print("HXcamera"); + + drawPointer(); + + menu_drawed = true; + } + + if (c_pressed) { + screen = line; + line = 0; + clearMenu(); + t = millis(); + return; + } + } + + if (screen == 1) { + if (! menu_drawed) { + tft.setTextSize(1); + tft.setCursor(49, 8); + tft.print("HXbot"); + + tft.setTextSize(1); + tft.setCursor(52, 130); + tft.print("back"); + + drawPointer(); + + menu_drawed = true; + } + + if (c_pressed) { + screen = 0; + line = 1; + clearMenu(); + t = millis(); + return; + } + } + + if (screen == 2) { + if (! menu_drawed) { + tft.setTextSize(1); + tft.setCursor(49, 8); + tft.print("REflex"); + + tft.setTextSize(1); + tft.setCursor(52, 130); + tft.print("back"); + + drawPointer(); + + menu_drawed = true; + } + + if (c_pressed) { + screen = 0; + line = 1; + clearMenu(); + t = millis(); + return; + } + } + + if (screen == 3) { + if (! menu_drawed) { + tft.setTextSize(1); + tft.setCursor(49, 8); + tft.print("HXpower"); + + tft.setTextSize(1); + tft.setCursor(52, 130); + tft.print("back"); + + drawPointer(); + + menu_drawed = true; + } + + if (c_pressed) { + screen = 0; + line = 1; + clearMenu(); + t = millis(); + return; + } + } + + if (screen == 4) { + if (! menu_drawed) { + tft.setTextSize(1); + tft.setCursor(49, 8); + tft.print("HXlcd"); + + tft.setTextSize(1); + tft.setCursor(52, 130); + tft.print("back"); + + drawPointer(); + + menu_drawed = true; + } + + if (c_pressed) { + screen = 0; + line = 1; + clearMenu(); + t = millis(); + return; + } + } + + if (screen == 5) { + if (! menu_drawed) { + tft.setTextSize(1); + tft.setCursor(49, 8); + tft.print("HXcamera"); + + tft.setTextSize(1); + tft.setCursor(52, 130); + tft.print("back"); + + drawPointer(); + + menu_drawed = true; + } + + if (c_pressed) { + screen = 0; + line = 1; + clearMenu(); + t = millis(); + return; + } + } + +} + +void clearMenu() { + tft.fillRect(2, 2, 123, 140, BLACK); + menu_drawed = false; +} + +void drawPointer() { + byte x1, y1, x2, y2, x3, y3; + + if (line != 0) { + x1 = 10; + y1 = 11 + line * 10; + x2 = 10; + y2 = 15 + line * 10; + x3 = 15; + y3 = 13 + line * 10; + } + else { + x1 = 42; + y1 = 131; + x2 = 42; + y2 = 135; + x3 = 47; + y3 = 133; + } + + tft.fillRect(10, 20, 6, 100, BLACK); + tft.fillTriangle(x1, y1, x2, y2, x3, y3, WHITE); +} + +void displayALL() { + // Vcc + vcc = readvcc(); + + tft.setCursor(10, 10); + tft.setTextColor(ST7735_WHITE, ST7735_BLACK); + tft.print("Vcc="); + if (vcc < 4.8 || vcc > 5.2) + tft.setTextColor(ST7735_RED, ST7735_BLACK); + else + tft.setTextColor(ST7735_GREEN, ST7735_BLACK); + + tft.print(vcc); + tft.setTextColor(ST7735_WHITE, ST7735_BLACK); + tft.print(" V "); + + // Light + tft.setCursor(10, 20); + tft.setTextColor(ST7735_WHITE, ST7735_BLACK); + tft.print("Lightness="); + tft.setTextColor(ST7735_YELLOW, ST7735_BLACK); + tft.print(analogRead(LIGHT)); + tft.setTextColor(ST7735_WHITE, ST7735_BLACK); + tft.print(" UE "); + + // Loud + tft.setCursor(10, 30); + tft.setTextColor(ST7735_WHITE, ST7735_BLACK); + tft.print("Loud="); + tft.setTextColor(ST7735_MAGENTA, ST7735_BLACK); + tft.print(analogRead(LOUD)); + tft.setTextColor(ST7735_WHITE, ST7735_BLACK); + tft.print(" UE "); + + // TH + int result; + result = dht.read(); + + tft.setCursor(10, 40); + tft.setTextColor(ST7735_WHITE, ST7735_BLACK); + tft.print("Temp="); + tft.setTextColor(ST7735_CYAN, ST7735_BLACK); + if (result == DHT_OK) tft.print(dht.getTemperatureC()); else tft.print("ERR"); + tft.setTextColor(ST7735_WHITE, ST7735_BLACK); + tft.print(" C "); + + tft.setCursor(10, 50); + tft.setTextColor(ST7735_WHITE, ST7735_BLACK); + tft.print("Hum="); + tft.setTextColor(ST7735_BLUE, ST7735_BLACK); + if (result == DHT_OK) tft.print(dht.getHumidity()); else tft.print("ERR"); + tft.setTextColor(ST7735_WHITE, ST7735_BLACK); + tft.print(" % "); +} + +void readButtons() { + if ((digitalRead(L_BTN) == LOW) && ! l_pressed) { + l_pressed = true; + drawL(); + } + else { + if ((digitalRead(L_BTN) == HIGH) && l_pressed) { + l_pressed = false; + drawL(); + } + } + + if ((digitalRead(C_BTN) == LOW) && ! c_pressed) { + c_pressed = true; + drawC(); + } + else { + if ((digitalRead(C_BTN) == HIGH) && c_pressed) { + c_pressed = false; + drawC(); + } + } + + if ((digitalRead(R_BTN) == LOW) && ! r_pressed) { + r_pressed = true; + drawR(); + } + else { + if ((digitalRead(R_BTN) == HIGH) && r_pressed) { + r_pressed = false; + drawR(); + } + } +} + +void drawL() { + tft.fillRoundRect(4, 145, 37, 12, 3, YELLOW); + if (! l_pressed) { + tft.drawRoundRect(4, 145, 37, 12, 3, LYELLOW); + tft.drawLine(6, 156, 38, 156, DYELLOW); + tft.drawLine(40, 147, 40, 154, DYELLOW); + tft.drawPixel(5, 155, DYELLOW); + tft.drawPixel(39, 155, DYELLOW); + tft.fillTriangle(15, 147, 29, 147, 22, 154, GRAY); + tft.drawTriangle(15, 147, 29, 147, 22, 154, DGRAY); + } + else { + tft.drawRoundRect(4, 145, 37, 12, 3, DYELLOW); + tft.drawLine(6, 156, 38, 156, LYELLOW); + tft.drawLine(40, 147, 40, 154, LYELLOW); + tft.drawPixel(5, 155, LYELLOW); + tft.drawPixel(39, 155, LYELLOW); + tft.fillTriangle(15, 147, 29, 147, 22, 154, WHITE); + tft.drawTriangle(15, 147, 29, 147, 22, 154, DGRAY); + } +} + +void drawC() { + tft.fillRoundRect(44, 144, 40, 12, 3, BLUE); + if (! c_pressed) { + tft.drawRoundRect(44, 144, 40, 12, 3, LBLUE); + tft.drawLine(46, 155, 81, 155, DBLUE); + tft.drawLine(83, 146, 83, 153, DBLUE); + tft.drawPixel(45, 154, DBLUE); + tft.drawPixel(82, 154, DBLUE); + tft.fillRoundRect(60, 146, 8, 8, 3, GRAY); + tft.drawRoundRect(60, 146, 8, 8, 3, DGRAY); + } + else { + tft.drawRoundRect(44, 144, 40, 12, 3, DBLUE); + tft.drawLine(46, 155, 81, 155, LBLUE); + tft.drawLine(83, 146, 83, 153, LBLUE); + tft.drawPixel(45, 154, LBLUE); + tft.drawPixel(82, 154, LBLUE); + tft.fillRoundRect(60, 146, 8, 8, 3, WHITE); + tft.drawRoundRect(60, 146, 8, 8, 3, DGRAY); + } +} + +void drawR() { + tft.fillRoundRect(86, 145, 37, 12, 3, YELLOW); + if (! r_pressed) { + tft.drawRoundRect(86, 145, 37, 12, 3, LYELLOW); + tft.drawLine(88, 156, 120, 156, DYELLOW); + tft.drawLine(122, 147, 122, 154, DYELLOW); + tft.drawPixel(87, 155, DYELLOW); + tft.drawPixel(121, 155, DYELLOW); + tft.fillTriangle(97, 154, 111, 154, 104, 147, GRAY); + tft.drawTriangle(97, 154, 111, 154, 104, 147, DGRAY); + } + else { + tft.drawRoundRect(86, 145, 37, 12, 3, DYELLOW); + tft.drawLine(88, 156, 120, 156, LYELLOW); + tft.drawLine(122, 147, 122, 154, LYELLOW); + tft.drawPixel(87, 155, LYELLOW); + tft.drawPixel(121, 155, LYELLOW); + tft.fillTriangle(97, 154, 111, 154, 104, 147, WHITE); + tft.drawTriangle(97, 154, 111, 154, 104, 147, DGRAY); + } +} + +void rgb_control() { + //int tmp1; + //tmp1 = Read(L_BTN); + if (digitalRead(L_BTN) == LOW) { + analogWrite(R_LED, 255); + //Serial.println(analogRead(L_BTN)); + } + else { + analogWrite(R_LED,0); + } + + if (digitalRead(C_BTN) == LOW) { + analogWrite(G_LED, 255); + } + else { + analogWrite(G_LED,0); + } + + if (digitalRead(R_BTN) == LOW) { + analogWrite(B_LED, 255); + } + else { + analogWrite(B_LED,0); + } +} + +// Callback for received data +void receiveData(int byteCount) { + + while(Wire.available()) { + // Get command + cmd = Wire.read(); + if (cmd == EXT_COM && byteCount == 3) { + flg = 0x00; + ext = 0x00; + + if (Wire.available()) ext = Wire.read(); + if (Wire.available()) flg = Wire.read(); + } + else { + // Cleanup I2C bus + while(Wire.available()) { + ext = Wire.read(); + } + } + + switch (cmd) { + case COM_PING: + autoresponse = OK_RSP; + blink_red(); + break; + case COM_GET_TEMP: + autoresponse = getInternalTemp(); + break; + default: + autoresponse = ERR_RSP; + break; + } + } +} + +// Callback for sending data +void answer() { + Wire.write(autoresponse); +} + +void blink_red() { + digitalWrite(R_LED, HIGH); + delay(100); + digitalWrite(R_LED, LOW); +} + +// Get the internal temperature of the arduino +double getInternalTemp(void) { + unsigned int wADC; + double t; + ADMUX = (_BV(REFS1) | _BV(REFS0) | _BV(MUX3)); + ADCSRA |= _BV(ADEN); // enable the ADC + delay(20); // wait for voltages to become stable. + ADCSRA |= _BV(ADSC); // Start the ADC + while (bit_is_set(ADCSRA,ADSC)); + wADC = ADCW; + t = (wADC - 324.31 ) / 1.22; + return (t); +} + +float readvcc() { + float tmp = 0.0; + + // Read 1.1V reference against Avcc + // set the reference to vcc and the measurement to the internal 1.1V reference + #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) + ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); + #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) + ADMUX = _BV(MUX5) | _BV(MUX0); + #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) + ADMUX = _BV(MUX3) | _BV(MUX2); + #else + // works on an Arduino 168 or 328 + ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); + #endif + + delay(3); // Wait for Vref to settle + ADCSRA |= _BV(ADSC); // Start conversion + while (bit_is_set(ADCSRA,ADSC)); // measuring + + uint8_t low = ADCL; // must read ADCL first - it then locks ADCH + uint8_t high = ADCH; // unlocks both + + tmp = (high<<8) | low; + tmp = (typVbg * 1023.0) / tmp; + + return tmp; +} + +void tftPrintTest() { + tft.setTextWrap(false); + tft.fillScreen(ST7735_GREEN); + tft.setCursor(0, 30); + tft.setTextColor(ST7735_RED); + tft.setTextSize(1); + tft.println("Hello World!"); + tft.setTextColor(ST7735_YELLOW); + tft.setTextSize(2); + tft.println("Hello World!"); + tft.setTextColor(ST7735_GREEN); + tft.setTextSize(3); + tft.println("Hello World!"); + tft.setTextColor(ST7735_BLUE); + tft.setTextSize(4); + tft.print(1234.567); + delay(1500); + tft.setCursor(0, 0); + tft.fillScreen(ST7735_BLACK); + tft.setTextColor(ST7735_WHITE); + tft.setTextSize(0); + tft.println("Hello World!"); + tft.setTextSize(1); + tft.setTextColor(ST7735_GREEN); + tft.print(p, 6); + tft.println(" Want pi?"); + tft.println(" "); + tft.print(8675309, HEX); // print 8,675,309 out in HEX! + tft.println(" Print HEX!"); + tft.println(" "); + tft.setTextColor(ST7735_WHITE); + tft.println("Sketch has been"); + tft.println("running for: "); + tft.setTextColor(ST7735_MAGENTA); + tft.print(millis() / 1000); + tft.setTextColor(ST7735_WHITE); + tft.print(" seconds."); +} + +void tftTest() { + // + tft.fillScreen(ST7735_BLACK); + tft.drawRect(0, 0, 128, 160, ST7735_GREEN); + tft.drawRect(1, 1, 126, 158, ST7735_WHITE); + + // Smile + tft.fillCircle(64, 80, 40, ST7735_YELLOW); + //tft.drawCircle(64, 80, 40, ST7735_BLUE); + + tft.fillRoundRect(45, 63, 10, 15, 3, ST7735_BLACK); + tft.fillRoundRect(73, 63, 10, 15, 3, ST7735_BLACK); + + tft.fillTriangle(50, 95, 78, 95, 70, 105, ST7735_BLACK); + + tft.setCursor(33, 132); + tft.setTextColor(ST7735_YELLOW); + tft.setTextSize(2); + tft.print("HELLO!"); + +// for (byte i = 1; i <= 31; i++) { +// tft.drawRect(i * 2, i * 3, 128 - i * 4, 160 - i * 5, ST7735_WHITE); +// delay(100); +// //tft.drawRect(i * 2, i * 2, 128 - i * 4, 160 - i * 4, ST7735_BLACK); +// } +} + diff --git a/HXpower/HXpower.ino b/HXpower/HXpower.ino new file mode 100755 index 0000000..96bb029 --- /dev/null +++ b/HXpower/HXpower.ino @@ -0,0 +1,824 @@ +///////////////////////////////////////// +// HXbot HXpower firmware / +// EoF 2016 EoF@itphx.ru / +///////////////////////////////////////// + +#include + +// DEBUG +#define DEBUG 0 + +// DEFINE +#define SLAVE_ADDRESS 0x05 +#define XOR_SEQ 0xFF +#define EXT_COM 0xAA + +#define VIN_PIN 0 +#define VDC_PIN 1 +#define VBT_PIN 2 +#define VBA_PIN 3 + +#define R_BL 7 +#define R_PF 6 +#define R_HX 5 +#define R_IS 4 +#define BL_RED_PIN 8 +#define BL_GRN_PIN 9 +#define BTN_PIN 2 +#define LED_PIN 3 + +#define REP_COUNT 5 + +#define TIMEOUT 5000 + +// COMMANDS +// VOLTMETERS +#define COM_GET_VIN 0x01 +#define COM_GET_VDC 0x02 +#define COM_GET_VBT 0x03 +#define COM_GET_VBA 0x04 +#define COM_GET_VCC 0x07 + +// TEMP +#define COM_GET_TEMP 0x06 + +// STATUS +#define COM_GET_STAT1 0x08 +#define COM_GET_STAT2 0x09 + +// RELAYS +#define COM_POWER_ON_BL 0x11 // 17 +#define COM_POWER_ON_PF 0x12 // 18 +#define COM_SWITCH_TO_IS 0x13 // 19 +#define COM_SWITCH_TO_IN 0x14 // 20 + +#define COM_SHUTDOWN_BL 0x15 // 21 +#define COM_SHUTDOWN_PF 0x16 // 22 +#define COM_SWITCH_TO_LR 0x17 // 23 +#define COM_SWITCH_TO_BA 0x18 // 24 + +#define COM_ENABLE_PF 0x1B // 27 +#define COM_DISABLE_PF 0x1C // 28 + +#define COM_ENABLE_BL 0x1D // 29 +#define COM_DISABLE_BL 0x1E // 30 + +#define OK_RSP 0x00 +#define NO_RSP 0xFF +#define ERR_RSP 0x01 +#define BLK_RSP 0x02 +#define CSE_RSP 0x03 +#define IOE_RSP 0x04 +#define TMO_RSP 0x05 + +// CONST +#define DELAY_TIME 900 +#define BA_TIMEOUT 3000 +#define BA_BLOCK_TIMEOUT 30000 +#define BUTTON_CYCLES 4 +#define V_CHECK_CYCLES 3 + +#define VIN_MIN 10.0 +#define VIN_MAX 14.0 + +#define VDC_MIN 4.8 +#define VDC_MAX 6.0 + +#define VBT_MIN 3.0 +#define VBT_MAX 4.25 + +#define VBA_MIN 6.0 +#define VBA_MAX 8.4 + +#define VCC_MIN 4.5 +#define VCC_MAX 5.3 + +// VAR +// резисторы делителя напряжения +const float r1_1 = 200000; // 200K +const float r1_2 = 100000; // 100K +const float r2_1 = 100000; // 100K +const float r2_2 = 100000; // 100K +const float r3_1 = 100000; // 100K +const float r3_2 = 100000; // 100K +const float r4_1 = 200000; // 200K +const float r4_2 = 100000; // 100K + +// эту константу (typVbg) необходимо откалибровать индивидуально +const float typVbg = 1.083; // 1.0 -- 1.2 + +float vcc = 0.0; +float Vmax1, Vmax2, Vmax3, Vmax4; +float kin, kdc, kbt, kba; +float vin, vdc, vbt, vba; +float tin, tdc, tbt, tba; + +//char *stime; + +byte cmd = 0x00; +byte ext = 0x00; +byte sum = 0x00; + +unsigned long lastCommandTime = 0; +byte autoResponse = 0x00; + +byte byteResponse = 0x00; +boolean needByte = false; +boolean needSumm = false; + +float floatResponse = 0.0; +boolean needFloat = false; +byte floatByte = 0; + +byte ba_count = 0; +unsigned long ba_time; +boolean ba_blocked = false; +byte button_count = 0; + +boolean vin_ok = false; +byte vin_count = 0; + +boolean vdc_ok = false; +byte vdc_count = 0; + +boolean vbt_ok = false; +byte vbt_count = 0; + +boolean vba_ok = false; +byte vba_count = 0; + +boolean vcc_ok = false; +byte vcc_count = 0; + +boolean ba_enabled = true; +boolean lr_enabled = true; +boolean pf_enabled = false; +boolean bl_enabled = false; + +boolean bl_powered = false; +boolean bl_error = false; +boolean ba_full = false; +boolean ba_charge = false; + +byte status_1 = 0x00; +byte status_2 = 0x00; + +// Loop delay +int delay_time = DELAY_TIME; + +/**************************************************************************** + * Главная программа + ****************************************************************************/ + +void setup() { + if (DEBUG) { + Serial.begin(9600); + Serial.println("---"); + delay(1000); + } + + // определение опорного напряжения + analogReference(DEFAULT); // DEFAULT INTERNAL использовать vcc как AREF + delay(100); + + kin = r1_2 / (r1_1 + r1_2); + kdc = r2_2 / (r2_1 + r2_2); + kbt = r3_2 / (r3_1 + r3_2); + kba = r4_2 / (r4_1 + r4_2); + + vcc = readvcc(); + Vmax1 = vcc / kin; + Vmax2 = vcc / kdc; + Vmax3 = vcc / kbt; + Vmax4 = vcc / kba; + + if (DEBUG) { + Serial.print("Vcc= "); + Serial.println(vcc); + Serial.print("Vmax1= "); + Serial.println(Vmax1); + Serial.print("Vmax2= "); + Serial.println(Vmax2); + Serial.print("Vmax3= "); + Serial.println(Vmax3); + Serial.print("Vmax4= "); + Serial.println(Vmax4); + Serial.println("---"); + } + + // Initialize i2c as slave + Wire.begin(SLAVE_ADDRESS); + + // Define callbacks for i2c communication + Wire.onReceive(receiveData); + Wire.onRequest(answer); + + pinMode(R_BL, OUTPUT); + pinMode(R_PF, OUTPUT); + pinMode(R_HX, OUTPUT); + pinMode(R_IS, OUTPUT); + pinMode(BTN_PIN, INPUT); + pinMode(LED_PIN, OUTPUT); + pinMode(BL_RED_PIN, INPUT); + pinMode(BL_GRN_PIN, INPUT); + + ba_time = millis(); +} + +void loop() { + // Timeout protection + if ((lastCommandTime + TIMEOUT < millis())) { + floatResponse = 0.0; + floatByte = 0; + needFloat = false; + autoResponse = TMO_RSP; + } + + //vcc = readvcc(); + + // stime = TimeToString(millis()/1000); + // считываем точное напряжение с A0, где будет находиться наш вольтметр с делителем напряжения + tin = 0.0; + tdc = 0.0; + tbt = 0.0; + tba = 0.0; + + for (byte i = 0; i < REP_COUNT; i++) { + tin = tin * readvcc() + analogRead(VIN_PIN); + tdc = tdc * readvcc() + analogRead(VDC_PIN); + tbt = tbt * readvcc() + analogRead(VBT_PIN); + tba = tba * readvcc() + analogRead(VBA_PIN); + delay(10); + } + + // tin = (tin * vcc) / 1024.0 / kin / REP_COUNT; + // tdc = (tdc * vcc) / 1024.0 / kdc / REP_COUNT; + // tbt = (tbt * vcc) / 1024.0 / kbt / REP_COUNT; + // tba = (tba * vcc) / 1024.0 / kba / REP_COUNT; + + tin = tin / 1024.0 / kin / REP_COUNT; + tdc = tdc / 1024.0 / kdc / REP_COUNT; + tbt = tbt / 1024.0 / kbt / REP_COUNT; + tba = tba / 1024.0 / kba / REP_COUNT; + + vin = tin; + vdc = tdc; + vbt = tbt; + if (ba_enabled) vba = tba; + +// if (DEBUG && count >= 5) { +// Serial.print("Vcc= "); +// Serial.println(vcc); +// Serial.print("Vin= "); +// Serial.println(vin); +// Serial.print("Vdc= "); +// Serial.println(vdc); +// Serial.print("Vbt= "); +// Serial.println(vbt); +// Serial.print("Vpf= "); +// Serial.println(vpf); +// Serial.println("---"); +// count = 0; +// } +// else count++; + + // Vin check + if (vin >= VIN_MIN && vin <= VIN_MAX) { + if (! vin_ok) vin_count++; + } + else { + vin_count = 0; + vin_ok = false; + } + + if (vin_count >= V_CHECK_CYCLES) vin_ok = true; + + // Vdc check + if (vdc >= VDC_MIN && vdc <= VDC_MAX) { + if (! vdc_ok) vdc_count++; + } + else { + vdc_count = 0; + vdc_ok = false; + } + + if (vdc_count >= V_CHECK_CYCLES) vdc_ok = true; + + // Vbt check + if (vbt >= VBT_MIN && vbt <= VBT_MAX) { + if (! vbt_ok) vbt_count++; + } + else { + vbt_count = 0; + vbt_ok = false; + } + + if (vbt_count >= V_CHECK_CYCLES) vbt_ok = true; + + // Vba check + if (ba_enabled) { + if (vba >= VBA_MIN && vba <= VBA_MAX) { + if (! vba_ok) vba_count++; + } + else { + vba_count = 0; + vba_ok = false; + } + + if (vba_count >= V_CHECK_CYCLES) vba_ok = true; + } + else { + //vba = 0.0; + vba_ok = false; + } + + // Vcc check + if (vcc >= VCC_MIN && vcc <= VCC_MAX) { + if (! vcc_ok) vcc_count++; + } + else { + vcc_count = 0; + vcc_ok = false; + } + + if (vcc_count >= V_CHECK_CYCLES) vcc_ok = true; + + // Auto switch to BA + if (! vin_ok) { + switchToBA(); + } + + // BL status + bl_powered = false; + bl_error = false; + ba_full = false; + ba_charge = false; + + if (vin_ok && bl_enabled) { + delay_time = 0; + +// if (DEBUG) { +// unsigned long tmp1, tmp2; +// +// tmp1 = millis(); +// while(digitalRead(BL_GRN_PIN) == LOW) { +// +// } +// tmp2 = millis(); +// +// Serial.print("time1: "); +// Serial.println(tmp2 - tmp1); +// +// tmp1 = millis(); +// while(digitalRead(BL_GRN_PIN) == HIGH) { +// +// } +// tmp2 = millis(); +// Serial.print("time2: "); +// Serial.println(tmp2 - tmp1); +// +// } + + switch (detectBlink(BL_GRN_PIN)) { + case 0: + ba_full = false; + ba_charge = false; + break; + case 1: + ba_full = true; + ba_charge = false; + bl_powered = true; + break; + case 2: + ba_full = false; + ba_charge = true; + bl_powered = true; + break; + } + + if (! ba_charge && ! ba_full) { + switch (detectBlink(BL_RED_PIN)) { + case 0: + bl_powered = false; + bl_error = false; + break; + case 1: + bl_powered = true; + bl_error = false; + break; + case 2: + bl_powered = false; + bl_error = true; + break; + } + } + + } else delay_time = DELAY_TIME; + + // Button reaction + if (digitalRead(BTN_PIN) == HIGH) { + if (button_count >= BUTTON_CYCLES) { + if (ba_enabled && vin_ok) { + switchToIN(); + } + else { + switchToBA(); + ba_blocked = true; + } + button_count = 0; + } + else button_count++; + } + else button_count = 0; + + // Disable BA block + if (ba_blocked && ba_time + BA_BLOCK_TIMEOUT < millis()) { + ba_blocked = false; + } + + // Auto switch to IN + if (vin_ok && ba_enabled && ! ba_blocked && ba_time + BA_TIMEOUT < millis()) { + switchToIN(); + } + + // Auto enable BL + if (! pf_enabled && ! ba_enabled && vin_ok) { + enableBL(); + } + + status_1 = 0x00; + if (vcc_ok) status_1 |= 0x01; + if (vin_ok) status_1 |= 0x02; + if (vdc_ok) status_1 |= 0x04; + if (vbt_ok) status_1 |= 0x08; + if (vba_ok) status_1 |= 0x10; + if (lr_enabled) status_1 |= 0x20; + if (ba_enabled) status_1 |= 0x40; + if (ba_blocked) status_1 |= 0x80; + + status_2 = 0x00; + if (bl_powered) status_2 |= 0x01; + if (bl_error) status_2 |= 0x02; + if (ba_full) status_2 |= 0x04; + if (ba_charge) status_2 |= 0x08; +// if (vpf_low) status_2 |= 0x10; +// if (vpf_high) status_2 |= 0x20; + if (pf_enabled) status_2 |= 0x40; + if (bl_enabled) status_2 |= 0x80; + + // Delay + delay(delay_time); +} + +/**************************************************************************** + * Функции + ****************************************************************************/ + +float readvcc() { + byte i; + float result = 0.0; + float tmp = 0.0; + + for (i = 0; i < REP_COUNT; i++) { + // Read 1.1V reference against Avcc + // set the reference to vcc and the measurement to the internal 1.1V reference + #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) + ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); + #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) + ADMUX = _BV(MUX5) | _BV(MUX0); + #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) + ADMUX = _BV(MUX3) | _BV(MUX2); + #else + // works on an Arduino 168 or 328 + ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); + #endif + + delay(3); // Wait for Vref to settle + ADCSRA |= _BV(ADSC); // Start conversion + while (bit_is_set(ADCSRA,ADSC)); // measuring + + uint8_t low = ADCL; // must read ADCL first - it then locks ADCH + uint8_t high = ADCH; // unlocks both + + tmp = (high<<8) | low; + tmp = (typVbg * 1023.0) / tmp; + result = result + tmp; + delay(5); + } + + result = result / REP_COUNT; + return result; +} + +// Callback for received data +void receiveData(int byteCount) { + + while(Wire.available()) { + // Get command + ext = Wire.read(); + if (ext == EXT_COM && byteCount == 3) { + cmd = 0x00; + sum = 0x00; + + if (Wire.available()) sum = Wire.read(); + if (Wire.available()) cmd = Wire.read(); + + if ((cmd ^ XOR_SEQ) != sum) { + autoResponse = CSE_RSP; + return; + } + } + else { + autoResponse = ERR_RSP; + while(Wire.available()) { + ext = Wire.read(); + } + return; + } + + // Process command + switch (cmd) { + case COM_GET_VIN: + sendFloat(vin); + break; + case COM_GET_VDC: + sendFloat(vdc); + break; + case COM_GET_VBT: + sendFloat(vbt); + break; + case COM_GET_VBA: + sendFloat(vba); + break; + case COM_GET_VCC: + sendFloat(vcc); + break; + case COM_GET_TEMP: + sendFloat(getInternalTemp()); + break; + case COM_GET_STAT1: + sendByte(status_1); + break; + case COM_GET_STAT2: + sendByte(status_2); + break; + + case COM_POWER_ON_BL: + digitalWrite(R_BL, HIGH); + bl_enabled = true; + commandResponse(); + break; + case COM_SHUTDOWN_BL: + digitalWrite(R_BL, LOW); + bl_enabled = false; + commandResponse(); + break; + + case COM_POWER_ON_PF: + digitalWrite(R_PF, HIGH); + pf_enabled = true; + commandResponse(); + break; + case COM_SHUTDOWN_PF: + digitalWrite(R_PF, LOW); + pf_enabled = false; + commandResponse(); + break; + + case COM_SWITCH_TO_IS: + commandResponse(switchToIS()); + break; + case COM_SWITCH_TO_LR: + commandResponse(switchToLR()); + break; + + case COM_SWITCH_TO_IN: + commandResponse(switchToIN()); + break; + case COM_SWITCH_TO_BA: + commandResponse(switchToBA()); + break; + + case COM_ENABLE_PF: + enablePF(); + commandResponse(); + break; + + case COM_DISABLE_PF: + disablePF(); + commandResponse(); + break; + + case COM_ENABLE_BL: + enableBL(); + commandResponse(); + break; + + case COM_DISABLE_BL: + disableBL(); + commandResponse(); + break; + + default: + autoResponse = ERR_RSP; + break; + } + } +} + +void commandResponse() { + lastCommandTime = millis(); + autoResponse = OK_RSP; +} + +void commandResponse(byte response) { + lastCommandTime = millis(); + autoResponse = response; +} + +void sendByte(byte value) { + lastCommandTime = millis(); + byteResponse = value; + needSumm = false; + needByte = true; +} + +void sendFloat(float value) { + lastCommandTime = millis(); + floatResponse = value; + floatByte = 0; + needFloat = true; +} + +byte cSum(byte value) { + return value ^ XOR_SEQ; +} + +byte cSum(byte *data, byte dataSize) { + byte tmp = 0x00; + for (byte i = 0; i < dataSize; i++) { + tmp = tmp ^ data[i]; + } + return tmp ^ XOR_SEQ; +} + +void answer() { + // Want float value? + if (needFloat) { + // Get access to the float as a byte-array: + byte *data = (byte *) &floatResponse; + + if (floatByte < sizeof(floatResponse)) { + // Send byte + Wire.write(data[floatByte]); + floatByte++; + } + else { + // Send control sum + Wire.write(cSum(data, sizeof(floatResponse))); + needFloat = false; + } + } + else { + // Want byte value? + if (needByte) { + if (!needSumm) { + // Send byte + Wire.write(byteResponse); + needSumm = true; + } + else { + // Send control sum + Wire.write(cSum(byteResponse)); + needSumm = false; + needByte = false; + } + } + else { + // Want something else? + Wire.write(autoResponse); + } + } + // Nothing more to send + autoResponse = NO_RSP; +} + +byte switchToLR() { + if (vbt_ok) { + digitalWrite(R_HX, LOW); + lr_enabled = true; + + return OK_RSP; + } + else return BLK_RSP; +} + +byte switchToIS() { + digitalWrite(R_HX, HIGH); + lr_enabled = false; + + return OK_RSP; +} + +byte switchToBA() { + if (! ba_enabled) { + + // Disable BL + if (bl_enabled) { + digitalWrite(R_BL, LOW); + bl_enabled = false; + //delay(500); + } + + digitalWrite(R_IS, LOW); + ba_enabled = true; + + digitalWrite(LED_PIN, LOW); + ba_time = millis(); + ba_blocked = true; + } + + return OK_RSP; +} + +byte switchToIN() { + if (vin_ok && ba_enabled) { + digitalWrite(R_IS, HIGH); + ba_enabled = false; + + digitalWrite(LED_PIN, HIGH); + + return OK_RSP; + } + else return BLK_RSP; +} + +void enablePF() { + if (bl_enabled) { + digitalWrite(R_BL, LOW); + bl_enabled = false; + //delay(500); + } + digitalWrite(R_PF, HIGH); + pf_enabled = true; +} + +void disablePF() { + digitalWrite(R_PF, LOW); + pf_enabled = false; +} + +byte enableBL() { + if (! ba_enabled && ! pf_enabled) { + digitalWrite(R_BL, HIGH); + bl_enabled = true; + + return OK_RSP; + } + else return BLK_RSP; +} + +void disableBL() { + digitalWrite(R_BL, LOW); + bl_enabled = false; +} + +// Get the internal temperature +float getInternalTemp() { + unsigned int wADC; + float t; + ADMUX = (_BV(REFS1) | _BV(REFS0) | _BV(MUX3)); + ADCSRA |= _BV(ADEN); // enable the ADC + delay(20); // wait for voltages to become stable. + ADCSRA |= _BV(ADSC); // Start the ADC + while (bit_is_set(ADCSRA,ADSC)); + wADC = ADCW; + t = (wADC - 324.31 ) / 1.22; + return(t); +} + +byte detectBlink(byte pin) { + // Return codes: + // 0 - LOW + // 1 - HIGH + // 2 - BLINK + byte low_count = 0; + byte high_count = 0; + byte i = 0; + byte pin_level; + + for (i = 0; i < 3; i++) { + pin_level = digitalRead(pin); + if (pin_level == HIGH) high_count++; + if (pin_level == LOW) low_count++; + delay(300); + } + + if (low_count > 0 && high_count == 0) + return 0; + else + if (high_count > 0 && low_count == 0) + return 1; + else + return 2; +} diff --git a/HXpower2/HXpower2.ino b/HXpower2/HXpower2.ino new file mode 100644 index 0000000..42c23e7 --- /dev/null +++ b/HXpower2/HXpower2.ino @@ -0,0 +1,1051 @@ +///////////////////////////////////////// +// HXbot HXpower firmware / +// EoF 2016 EoF@itphx.ru / +///////////////////////////////////////// + +#include + +// DEBUG +#define DEBUG 0 + +// DEFINE +#define SLAVE_ADDRESS 0x05 +#define XOR_SEQ 0xFF +#define EXT_COM 0xAA + +#define AIN_PIN A9 +#define ADC_PIN A8 +#define AHX_PIN A7 +#define ABA_PIN A6 + +#define VIN_PIN A5 +#define VDC_PIN A4 +#define VBT_PIN A3 +#define VBA_PIN A2 +#define VZU_PIN A1 +#define VIS_PIN A0 + +#define R_BL 11 +#define R_PF 5 +#define R_HX 1 +#define R_IS 7 +#define RED_PIN 10 +#define GRN_PIN 12 +#define BTN_PIN 0 +#define LED_PIN 13 + +#define REP_COUNT 5 + +#define TIMEOUT 5000 +#define BUTTON_REACTION_TIME 5000 + +// COMMANDS +// VOLTMETERS +#define COM_GET_VIN 0x01 +#define COM_GET_VDC 0x02 +#define COM_GET_VBT 0x03 +#define COM_GET_VBA 0x04 +#define COM_GET_VIS 0x05 +#define COM_GET_VZU 0x06 +#define COM_GET_VCC 0x07 + +// AMPERMETERS +#define COM_GET_AHX 0x21 +#define COM_GET_ABA 0x22 +#define COM_GET_AIN 0x23 +#define COM_GET_ADC 0x24 + +// STATUS +#define COM_GET_STAT1 0x08 +#define COM_GET_STAT2 0x09 +#define COM_GET_STAT3 0x20 + +// TEMP +#define COM_GET_TEMP 0x10 + +// RELAYS +#define COM_POWER_ON_BL 0x11 // 17 +#define COM_POWER_ON_PF 0x12 // 18 +#define COM_SWITCH_TO_IS 0x13 // 19 +#define COM_SWITCH_TO_IN 0x14 // 20 + +#define COM_SHUTDOWN_BL 0x15 // 21 +#define COM_SHUTDOWN_PF 0x16 // 22 +#define COM_SWITCH_TO_LR 0x17 // 23 +#define COM_SWITCH_TO_BA 0x18 // 24 + +#define COM_ENABLE_PF 0x1B // 27 +#define COM_DISABLE_PF 0x1C // 28 + +#define COM_ENABLE_BL 0x1D // 29 +#define COM_DISABLE_BL 0x1E // 30 + +#define OK_RSP 0x00 +#define NO_RSP 0xFF +#define ERR_RSP 0x01 +#define BLK_RSP 0x02 +#define CSE_RSP 0x03 +#define IOE_RSP 0x04 +#define TMO_RSP 0x05 + +// CONST +//#define DELAY_TIME 0 +#define BLINK_DELAY 300 + +#define BA_TIMEOUT 5000 +#define BA_BLOCK_TIMEOUT 30000 +#define BA_FULL_CHECK_CYCLES 20 +#define V_CHECK_CYCLES 10 +#define MAX_VBT_FAIL 15 +#define AREF 5 + +#define VIN_MIN 10.0 +#define VIN_MAX 14.0 + +#define VDC_MIN 4.8 +#define VDC_MAX 5.5 + +#define VBT_MIN 3.65 +#define VBT_MAX 4.25 + +#define VBA_MIN 6.0 +#define VBA_MAX 8.6 + +#define VIS_MIN 4.8 +#define VIS_MAX 5.5 + +#define VZU_MIN 5.0 +#define VZU_MAX 6.3 + +#define VCC_MIN 4.3 +#define VCC_MAX 5.3 + +#define AHX_MIN 0.1 +#define AHX_MAX 5.0 + +#define ABA_MIN 0.1 +#define ABA_MAX 5.0 + +#define AIN_MIN 0.1 +#define AIN_MAX 5.0 + +#define ADC_MIN 0.1 +#define ADC_MAX 5.0 + +// VAR +// резисторы делителя напряжения +const float r1_1 = 20000; // 20K +const float r1_2 = 10000; // 10K +const float r2_1 = 10380; // 10K +const float r2_2 = 10000; // 10K +const float r3_1 = 10000; // 10K +const float r3_2 = 10000; // 10K +const float r4_1 = 20330; // 20K +const float r4_2 = 10000; // 10K +const float r5_1 = 1060; // 1K +const float r5_2 = 1000; // 1K +const float r6_1 = 1000; // 1K +const float r6_2 = 1000; // 1K + +// эту константу (typVbg) необходимо откалибровать индивидуально +const float typVbg = 1.08; // 1.0 -- 1.2 + +float vcc = 0.0, tcc; +float kin, kdc, kbt, kba, kis, kzu; +float vin, vdc, vbt, vba, vis, vzu; +float tin, tdc, tbt, tba, tis, tzu; +float ahx, aba, ain, adc; +float uhx, uba, uin, udc; + +byte cmd = 0x00; +byte ext = 0x00; +byte sum = 0x00; + +unsigned long lastCommandTime = 0; +byte autoResponse = 0x00; + +byte byteResponse = 0x00; +boolean needByte = false; +boolean needSumm = false; + +float floatResponse = 0.0; +boolean needFloat = false; +byte floatByte = 0; + +byte ba_count = 0; +unsigned long ba_time; +boolean ba_blocked = false; +byte ba_full_count = 0; +boolean ba_charge_blocked = false; + +boolean is_requested = false; + +unsigned long button_time; +//byte button_count = 0; + +boolean vin_ok = false; +byte vin_count = 0; + +boolean vdc_ok = false; +byte vdc_count = 0; + +boolean vbt_ok = false, vbt_fail = false; +byte vbt_count = 0, vbt_fail_count = 0; + +boolean vba_ok = false; +byte vba_count = 0; + +boolean vis_ok = false; +byte vis_count = 0; + +boolean vzu_ok = false; +byte vzu_count = 0; + +boolean vcc_ok = false; +byte vcc_count = 0; + +boolean ahx_ok = false; +byte ahx_count = 0; + +boolean aba_ok = false; +byte aba_count = 0; + +boolean ain_ok = false; +byte ain_count = 0; + +boolean adc_ok = false; +byte adc_count = 0; + +boolean ba_enabled = true; +boolean lr_enabled = true; +boolean pf_enabled = false; +boolean bl_enabled = false; + +boolean bl_powered = false; +boolean bl_error = false; +boolean ba_full = false; +boolean ba_charge = false; + +byte status_1 = 0x00; +byte status_2 = 0x00; +byte status_3 = 0x00; + +// Blink detection + // 0 - LOW + // 1 - HIGH + // 2 - BLINK +byte red_state = 0, grn_state = 0; +byte red_array[3] = {0, 0, 0}, grn_array[3] = {0, 0, 0}; +byte blink_i; +unsigned long blink_time = 0; + +// Loop delay +//int delay_time = DELAY_TIME; + +/**************************************************************************** + * Главная программа + ****************************************************************************/ + +void setup() { + if (DEBUG) { + Serial.begin(9600); + Serial.println("---"); + delay(1000); + } + + // определение опорного напряжения + analogReference(DEFAULT); // DEFAULT INTERNAL использовать vcc как AREF + + kin = r1_2 / (r1_1 + r1_2); + kdc = r2_2 / (r2_1 + r2_2); + kbt = r3_2 / (r3_1 + r3_2); + kba = r4_2 / (r4_1 + r4_2); + kis = r5_2 / (r5_1 + r5_2); + kzu = r6_2 / (r6_1 + r6_2); + + if (DEBUG) { + Serial.print("Vcc= "); + Serial.println(vcc); + Serial.println("---"); + } + + // Initialize i2c as slave + Wire.begin(SLAVE_ADDRESS); + + // Define callbacks for i2c communication + Wire.onReceive(receiveData); + Wire.onRequest(answer); + + pinMode(R_BL, OUTPUT); + pinMode(R_PF, OUTPUT); + pinMode(R_HX, OUTPUT); + pinMode(R_IS, OUTPUT); + pinMode(R_IS, OUTPUT); + + pinMode(VIN_PIN, INPUT); + pinMode(VDC_PIN, INPUT); + pinMode(VBT_PIN, INPUT); + pinMode(VBA_PIN, INPUT); + pinMode(VIS_PIN, INPUT); + pinMode(VZU_PIN, INPUT); + + pinMode(AHX_PIN, INPUT); + pinMode(ABA_PIN, INPUT); + pinMode(AIN_PIN, INPUT); + pinMode(ADC_PIN, INPUT); + + pinMode(BTN_PIN, INPUT); + pinMode(LED_PIN, OUTPUT); + pinMode(RED_PIN, INPUT); + pinMode(GRN_PIN, INPUT); + + ba_time = millis(); +} + +void loop() { + // Timeout protection + if ((lastCommandTime + TIMEOUT < millis())) { + floatResponse = 0.0; + floatByte = 0; + needFloat = false; + autoResponse = TMO_RSP; + } + + // BLOCK OF MAGIC + readvcc(); + analogRead(VIN_PIN); + readvcc(); + analogRead(VIN_PIN); + readvcc(); + analogRead(VIN_PIN); + // MAGIC + + // Get voltages + tin = 0.0; + tdc = 0.0; + tbt = 0.0; + tba = 0.0; + tis = 0.0; + tzu = 0.0; + + //for (byte i = 0; i < REP_COUNT; i++) { + tin += readvcc() * analogRead(VIN_PIN); + tdc += readvcc() * analogRead(VDC_PIN); + tbt += readvcc() * analogRead(VBT_PIN); + tba += readvcc() * analogRead(VBA_PIN); + tis += readvcc() * analogRead(VIS_PIN); + tzu += readvcc() * analogRead(VZU_PIN); + //delay(10); + //} + + tcc = readvcc(); + tin = tin / 1024.0 / kin;// / REP_COUNT; + tdc = tdc / 1024.0 / kdc;// / REP_COUNT; + tbt = tbt / 1024.0 / kbt;// / REP_COUNT; + tba = tba / 1024.0 / kba;// / REP_COUNT; + tis = tis / 1024.0 / kis;// / REP_COUNT; + tzu = tzu / 1024.0 / kzu;// / REP_COUNT; + + if (tcc > VCC_MIN) vcc = tcc; + vin = tin; + vdc = tdc; + vbt = tbt; + if (ba_enabled) vba = tba; + vis = tis; + vzu = tzu; + + // Get currents + ahx = (analogRead(AHX_PIN) - 512) * 0.0264; + if (ahx < 0) ahx *= -1; + aba = (analogRead(ABA_PIN) - 512) * 0.0264; + if (aba < 0) aba *= -1; + ain = (analogRead(AIN_PIN) - 512) * 0.0264; + if (ain < 0) ain *= -1; + adc = (analogRead(ADC_PIN) - 512) * 0.0264; + if (adc < 0) adc *= -1; + + if (DEBUG) { + Serial.print("Vcc: "); + Serial.println(vcc); + Serial.print("Vin: "); + Serial.println(vin); + Serial.print("Vdc: "); + Serial.println(vdc); + Serial.print("Vbt: "); + Serial.println(vbt); + Serial.print("Vba: "); + Serial.println(vba); + Serial.print("Vis: "); + Serial.println(vis); + Serial.print("Vzu: "); + Serial.println(vzu); + Serial.println("---"); + } + + // Vin check + if (vin >= VIN_MIN && vin <= VIN_MAX) { + if (! vin_ok) vin_count++; + } + else { + vin_count = 0; + vin_ok = false; + } + + if (vin_count >= V_CHECK_CYCLES) vin_ok = true; + + // Vdc check + if (vdc >= VDC_MIN && vdc <= VDC_MAX) { + if (! vdc_ok) vdc_count++; + } + else { + vdc_count = 0; + vdc_ok = false; + } + + if (vdc_count >= V_CHECK_CYCLES) vdc_ok = true; + + // Vbt check + if (vbt >= VBT_MIN && vbt <= VBT_MAX) { + if (! vbt_ok) vbt_count++; + } + else { + vbt_count = 0; + vbt_ok = false; + } + + if (vbt_count >= V_CHECK_CYCLES) vbt_ok = true; + + // Vba check + if (ba_enabled) { + if (vba >= VBA_MIN && vba <= VBA_MAX) { + if (! vba_ok) vba_count++; + } + else { + vba_count = 0; + vba_ok = false; + } + + if (vba_count >= V_CHECK_CYCLES) vba_ok = true; + } + else { + vba_ok = false; + } + + // Vis check + if (vis >= VIS_MIN && vis <= VIS_MAX) { + if (! vis_ok) vis_count++; + } + else { + vis_count = 0; + vis_ok = false; + } + + if (vis_count >= V_CHECK_CYCLES) vis_ok = true; + + // Vzu check + if (vzu >= VZU_MIN && vzu <= VZU_MAX) { + if (! vzu_ok) vzu_count++; + } + else { + vzu_count = 0; + vzu_ok = false; + } + + if (vzu_count >= V_CHECK_CYCLES) vzu_ok = true; + + // Vcc check + if (vcc >= VCC_MIN && vcc <= VCC_MAX) { + if (! vcc_ok) vcc_count++; + } + else { + vcc_count = 0; + vcc_ok = false; + } + + if (vcc_count >= V_CHECK_CYCLES) vcc_ok = true; + + // Ahx check + if (ahx >= AHX_MIN && ahx <= AHX_MAX) { + if (! ahx_ok) ahx_count++; + } + else { + ahx_count = 0; + ahx_ok = false; + } + + if (ahx_count >= V_CHECK_CYCLES) ahx_ok = true; + + // Aba check + if (aba >= ABA_MIN && aba <= ABA_MAX) { + if (! aba_ok) aba_count++; + } + else { + aba_count = 0; + aba_ok = false; + } + + if (aba_count >= V_CHECK_CYCLES) aba_ok = true; + + // Ain check + if (ain >= AIN_MIN && ain <= AIN_MAX) { + if (! ain_ok) ain_count++; + } + else { + ain_count = 0; + ain_ok = false; + } + + if (ain_count >= V_CHECK_CYCLES) ain_ok = true; + + // Adc check + if (adc >= ADC_MIN && adc <= ADC_MAX) { + if (! adc_ok) adc_count++; + } + else { + adc_count = 0; + adc_ok = false; + } + + if (adc_count >= V_CHECK_CYCLES) adc_ok = true; + + // Auto disable IN + if (! vin_ok || ! in_connected()) { + switchToBA(); + } + + // Auto disable IS + if (! vis_ok || ((! vin_ok || ! in_connected()) && ! is_requested)) { + switchToLR(); + } + + // BL status + bl_powered = false; + bl_error = false; + if (! ba_charge_blocked) ba_full = false; + ba_charge = false; + + if (bl_enabled) { + detectBlink(); + + switch (grn_state) { + case 0: + ba_full = false; + ba_charge = false; + break; + case 1: + ba_full = true; + ba_charge = false; + break; + case 2: + ba_full = false; + ba_charge = true; + break; + } + + switch (red_state) { + case 0: + bl_powered = false; + bl_error = false; + break; + case 1: + bl_powered = true; + bl_error = false; + break; + case 2: + bl_powered = false; + bl_error = true; + break; + } + + if (ba_full) { + if (! ba_charge_blocked) ba_full_count++; + } + else { + ba_full_count = 0; + } + + if (ba_full_count >= BA_FULL_CHECK_CYCLES) ba_charge_blocked = true; + } + + // Button reaction +// if (digitalRead(BTN_PIN) == LOW) { +// button_time = millis(); +// } +// else { +// if (button_time + BUTTON_REACTION_TIME < millis()) { +// switchToBA(); +// } +// } + + // Disable BA block + if (ba_blocked && ba_time + BA_BLOCK_TIMEOUT < millis()) { + ba_blocked = false; + } + + // Auto switch to IN + if (vin_ok && in_connected() && ba_enabled && ! ba_blocked && ba_time + BA_TIMEOUT < millis()) { + switchToIN(); + } + + // Auto enable IS + if (vis_ok && ! ba_enabled && vin_ok) { + switchToIS(); + } + + // Auto enable BL + if (! pf_enabled && ! ba_enabled && vin_ok && in_connected() && ! ba_charge_blocked) { + //if (! pf_enabled && ! ba_enabled && vin_ok && ! ba_charge_blocked) { + enableBL(); + } + + // Auto disable BL + if ((bl_enabled && ba_charge_blocked) || ! in_connected()) { + disableBL(); + } + + // Auto enable IS on BT fail +// if (! vbt_ok) { +// if (! vbt_fail) vbt_fail_count++; +// } +// else { +// vbt_fail_count = 0; +// vbt_fail = false; +// } + +// if (vbt_fail_count >= MAX_VBT_FAIL && vis_ok) switchToIS(); + + // Compile status + status_1 = 0x00; + if (vcc_ok) status_1 |= 0x01; + if (vin_ok) status_1 |= 0x02; + if (vdc_ok) status_1 |= 0x04; + if (vbt_ok) status_1 |= 0x08; + if (vba_ok) status_1 |= 0x10; + if (lr_enabled) status_1 |= 0x20; + if (ba_enabled) status_1 |= 0x40; + if (ba_blocked) status_1 |= 0x80; + + status_2 = 0x00; + if (bl_powered) status_2 |= 0x01; + if (bl_error) status_2 |= 0x02; + if (ba_full) status_2 |= 0x04; + if (ba_charge) status_2 |= 0x08; + if (vis_ok) status_2 |= 0x10; + if (vzu_ok) status_2 |= 0x20; + if (pf_enabled) status_2 |= 0x40; + if (bl_enabled) status_2 |= 0x80; + + status_3 = 0x00; + if (ahx_ok) status_3 |= 0x01; + if (aba_ok) status_3 |= 0x02; + if (ain_ok) status_3 |= 0x04; + if (adc_ok) status_3 |= 0x08; +} + +/**************************************************************************** + * Функции + ****************************************************************************/ + +float readvcc() { + byte i; + float result = 0.0; + float tmp = 0.0; + + //for (i = 0; i < REP_COUNT; i++) { + // Read 1.1V reference against Avcc + // set the reference to vcc and the measurement to the internal 1.1V reference + #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) + ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); + #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) + ADMUX = _BV(MUX5) | _BV(MUX0); + #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) + ADMUX = _BV(MUX3) | _BV(MUX2); + #else + // works on an Arduino 168 or 328 + ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); + #endif + + delay(3); // Wait for Vref to settle + ADCSRA |= _BV(ADSC); // Start conversion + while (bit_is_set(ADCSRA,ADSC)); // measuring + + uint8_t low = ADCL; // must read ADCL first - it then locks ADCH + uint8_t high = ADCH; // unlocks both + + tmp = (high<<8) | low; + tmp = (typVbg * 1023.0) / tmp; + //result = result + tmp; + // delay(5); + //} + + //result = result / REP_COUNT; + return tmp;//result; +} + +// Callback for received data +void receiveData(int byteCount) { + + while(Wire.available()) { + // Get command + ext = Wire.read(); + if (ext == EXT_COM && byteCount == 3) { + cmd = 0x00; + sum = 0x00; + + if (Wire.available()) sum = Wire.read(); + if (Wire.available()) cmd = Wire.read(); + + if ((cmd ^ XOR_SEQ) != sum) { + autoResponse = CSE_RSP; + return; + } + } + else { + autoResponse = ERR_RSP; + while(Wire.available()) { + ext = Wire.read(); + } + return; + } + + // Process command + switch (cmd) { + case COM_GET_VIN: + sendFloat(vin); + break; + case COM_GET_VDC: + sendFloat(vdc); + break; + case COM_GET_VBT: + sendFloat(vbt); + break; + case COM_GET_VBA: + sendFloat(vba); + break; + case COM_GET_VIS: + sendFloat(vis); + break; + case COM_GET_VZU: + sendFloat(vzu); + break; + case COM_GET_VCC: + sendFloat(vcc); + break; + + case COM_GET_AHX: + sendFloat(ahx); + break; + case COM_GET_ABA: + sendFloat(aba); + break; + case COM_GET_AIN: + sendFloat(ain); + break; + case COM_GET_ADC: + sendFloat(adc); + break; + + case COM_GET_TEMP: + sendFloat(getInternalTemp()); + break; + case COM_GET_STAT1: + sendByte(status_1); + break; + case COM_GET_STAT2: + sendByte(status_2); + break; + case COM_GET_STAT3: + sendByte(status_3); + break; + + case COM_POWER_ON_BL: + digitalWrite(R_BL, HIGH); + bl_enabled = true; + commandResponse(); + break; + case COM_SHUTDOWN_BL: + digitalWrite(R_BL, LOW); + bl_enabled = false; + commandResponse(); + break; + + case COM_POWER_ON_PF: + digitalWrite(R_PF, HIGH); + pf_enabled = true; + commandResponse(); + break; + case COM_SHUTDOWN_PF: + digitalWrite(R_PF, LOW); + pf_enabled = false; + commandResponse(); + break; + + case COM_SWITCH_TO_IS: + is_requested = true; + commandResponse(switchToIS()); + break; + case COM_SWITCH_TO_LR: + is_requested = false; + commandResponse(switchToLR()); + break; + + case COM_SWITCH_TO_IN: + commandResponse(switchToIN()); + break; + case COM_SWITCH_TO_BA: + commandResponse(switchToBA()); + break; + + case COM_ENABLE_PF: + enablePF(); + commandResponse(); + break; + + case COM_DISABLE_PF: + disablePF(); + commandResponse(); + break; + + case COM_ENABLE_BL: + enableBL(); + commandResponse(); + break; + + case COM_DISABLE_BL: + disableBL(); + commandResponse(); + break; + + default: + autoResponse = ERR_RSP; + break; + } + } +} + +void commandResponse() { + lastCommandTime = millis(); + autoResponse = OK_RSP; +} + +void commandResponse(byte response) { + lastCommandTime = millis(); + autoResponse = response; +} + +void sendByte(byte value) { + lastCommandTime = millis(); + byteResponse = value; + needSumm = false; + needByte = true; +} + +void sendFloat(float value) { + lastCommandTime = millis(); + floatResponse = value; + floatByte = 0; + needFloat = true; +} + +byte cSum(byte value) { + return value ^ XOR_SEQ; +} + +byte cSum(byte *data, byte dataSize) { + byte tmp = 0x00; + for (byte i = 0; i < dataSize; i++) { + tmp = tmp ^ data[i]; + } + return tmp ^ XOR_SEQ; +} + +void answer() { + // Want float value? + if (needFloat) { + // Get access to the float as a byte-array: + byte *data = (byte *) &floatResponse; + + if (floatByte < sizeof(floatResponse)) { + // Send byte + Wire.write(data[floatByte]); + floatByte++; + } + else { + // Send control sum + Wire.write(cSum(data, sizeof(floatResponse))); + needFloat = false; + } + } + else { + // Want byte value? + if (needByte) { + if (!needSumm) { + // Send byte + Wire.write(byteResponse); + needSumm = true; + } + else { + // Send control sum + Wire.write(cSum(byteResponse)); + needSumm = false; + needByte = false; + } + } + else { + // Want something else? + Wire.write(autoResponse); + } + } + // Nothing more to send + autoResponse = NO_RSP; +} + +byte switchToLR() { + if (vbt_ok) { + digitalWrite(R_HX, LOW); + lr_enabled = true; + + return OK_RSP; + } + else return BLK_RSP; +} + +byte switchToIS() { + digitalWrite(R_HX, HIGH); + lr_enabled = false; + + return OK_RSP; +} + +byte switchToBA() { + if (! ba_enabled) { + + // Disable BL + if (bl_enabled) { + digitalWrite(R_BL, LOW); + bl_enabled = false; + //delay(500); + } + + digitalWrite(R_IS, LOW); + ba_enabled = true; + + digitalWrite(LED_PIN, LOW); + ba_time = millis(); + ba_blocked = true; + ba_charge_blocked = false; + } + + return OK_RSP; +} + +byte switchToIN() { + if (vin_ok && ba_enabled && in_connected()) { + digitalWrite(R_IS, HIGH); + ba_enabled = false; + + digitalWrite(LED_PIN, HIGH); + + return OK_RSP; + } + else return BLK_RSP; +} + +void enablePF() { + if (bl_enabled) { + digitalWrite(R_BL, LOW); + bl_enabled = false; + //delay(500); + } + digitalWrite(R_PF, HIGH); + pf_enabled = true; + ba_charge_blocked = false; +} + +void disablePF() { + digitalWrite(R_PF, LOW); + pf_enabled = false; +} + +byte enableBL() { + if (! ba_enabled && ! pf_enabled && in_connected()) { + digitalWrite(R_BL, HIGH); + bl_enabled = true; + + return OK_RSP; + } + else return BLK_RSP; +} + +void disableBL() { + digitalWrite(R_BL, LOW); + bl_enabled = false; +} + +// Get the internal temperature +float getInternalTemp() { + unsigned int wADC; + float t; + ADMUX = (_BV(REFS1) | _BV(REFS0) | _BV(MUX3)); + ADCSRA |= _BV(ADEN); // enable the ADC + delay(20); // wait for voltages to become stable. + ADCSRA |= _BV(ADSC); // Start the ADC + while (bit_is_set(ADCSRA,ADSC)); + wADC = ADCW; + t = (wADC - 324.31 ) / 1.22; + return(t); +} + +void detectBlink() { + // 0 - LOW + // 1 - HIGH + // 2 - BLINK + byte red_low_count = 0, grn_low_count = 0; + byte red_high_count = 0, grn_high_count = 0; + byte pin_level; + + if (millis() - blink_time < BLINK_DELAY) return; + + red_array[blink_i] = digitalRead(RED_PIN); + grn_array[blink_i] = digitalRead(GRN_PIN); + + blink_i++; + + if (blink_i == 3) { + for (byte i = 0; i < 3; i++) { + if (red_array[i] == HIGH) red_high_count++; + if (red_array[i] == LOW) red_low_count++; + if (grn_array[i] == HIGH) grn_high_count++; + if (grn_array[i] == LOW) grn_low_count++; + } + + if (red_low_count > 0 && red_high_count == 0) + red_state = 0; + else + if (red_high_count > 0 && red_low_count == 0) + red_state = 1; + else + red_state = 2; + + if (grn_low_count > 0 && grn_high_count == 0) + grn_state = 0; + else + if (grn_high_count > 0 && grn_low_count == 0) + grn_state = 1; + else + grn_state = 2; + + blink_i = 0; + } + + blink_time = millis(); +} + +bool in_connected() { + if (digitalRead(BTN_PIN) == HIGH) { + return true; + } else { + return false; + } +} + diff --git a/HXpower3/HXpower3.ino b/HXpower3/HXpower3.ino new file mode 100644 index 0000000..5c0b566 --- /dev/null +++ b/HXpower3/HXpower3.ino @@ -0,0 +1,899 @@ +///////////////////////////////////////// +// HXbot HXpower firmware / +// EoF 2016 EoF@itphx.ru / +///////////////////////////////////////// + +#include + +// DEBUG +#define DEBUG 0 + +// DEFINE +#define SLAVE_ADDRESS 0x05 +#define XOR_SEQ 0xFF +#define EXT_COM 0xAA + +#define AIN_PIN A9 +#define ADC_PIN A8 +#define AUS_PIN A7 +#define ABA_PIN A6 + +#define VIN_PIN A5 +#define VDC_PIN A4 +#define VBT_PIN A3 +#define VBA_PIN A2 +#define VZU_PIN A1 +#define VPF_PIN A0 + +#define R_BA 11 +#define R_PF 5 +#define R_DC 1 +#define R_US 7 +//#define RED_PIN 10 +//#define GRN_PIN 12 +#define INC_PIN 0 +#define LED_PIN 13 + +#define REP_COUNT 5 + +#define TIMEOUT 5000 +#define BUTTON_REACTION_TIME 5000 + +// COMMANDS +// VOLTMETERS +#define COM_GET_VIN 0x01 +#define COM_GET_VDC 0x02 +#define COM_GET_VBT 0x03 +#define COM_GET_VBA 0x04 +#define COM_GET_VPF 0x05 +#define COM_GET_VZU 0x06 +#define COM_GET_VCC 0x07 + +// AMPERMETERS +#define COM_GET_AUS 0x21 +#define COM_GET_ABA 0x22 +#define COM_GET_AIN 0x23 +#define COM_GET_ADC 0x24 + +// STATUS +#define COM_GET_STAT1 0x08 +#define COM_GET_STAT2 0x09 +#define COM_GET_STAT3 0x20 + +// TEMP +#define COM_GET_TEMP 0x10 + +// RELAYS +#define COM_ENABLE_BA 0x11 // 17 +#define COM_ENABLE_PF 0x12 // 18 +#define COM_ENABLE_EX 0x13 // 19 +#define COM_ENABLE_US 0x14 // 20 + +#define COM_DISABLE_BA 0x15 // 21 +#define COM_DISABLE_PF 0x16 // 22 +#define COM_DISABLE_EX 0x17 // 23 +#define COM_DISABLE_US 0x18 // 24 + +#define COM_RUN 0x1B // 27 +#define COM_STOP 0x1C // 28 +#define COM_RESET_US 0x1D // 29 + +#define OK_RSP 0x00 +#define NO_RSP 0xFF +#define ERR_RSP 0x01 +#define BLK_RSP 0x02 +#define CSE_RSP 0x03 +#define IOE_RSP 0x04 +#define TMO_RSP 0x05 + +// CONST +#define EX_BLOCK_TIMEOUT 30000 +#define BA_BLOCK_TIMEOUT 30000 +#define BA_FULL_CHECK_CYCLES 20 +#define V_CHECK_CYCLES 10 +//#define MAX_VBT_FAIL 15 +#define AREF 5 + +#define VIN_MIN 14.0 +#define VIN_MAX 20.0 + +#define VDC_MIN 5.0 +#define VDC_MAX 6.5 + +#define VBT_MIN 6.6 +#define VBT_MAX 8.6 + +#define VBA_MIN 9.0 +#define VBA_MAX 13.0 +#define VBA_FULL 12.0 + +#define VPF_MIN 7.2 +#define VPF_MAX 10.0 + +#define VZU_MIN 5.0 +#define VZU_MAX 6.3 + +#define VCC_MIN 4.3 +#define VCC_MAX 5.3 + +#define AUS_MIN 0.1 +#define AUS_MAX 5.0 + +#define ABA_MIN 0.1 +#define ABA_MAX 5.0 + +#define AIN_MIN 0.1 +#define AIN_MAX 5.0 + +#define ADC_MIN 0.1 +#define ADC_MAX 5.0 + +// VAR +// резисторы делителя напряжения +const float r1_1 = 20000; // 20K +const float r1_2 = 10000; // 10K +const float r2_1 = 10380; // 10K +const float r2_2 = 10000; // 10K +const float r3_1 = 10000; // 10K +const float r3_2 = 10000; // 10K +const float r4_1 = 20330; // 20K +const float r4_2 = 10000; // 10K +const float r5_1 = 1060; // 1K +const float r5_2 = 1000; // 1K +const float r6_1 = 1000; // 1K +const float r6_2 = 1000; // 1K + +// эту константу (typVbg) необходимо откалибровать индивидуально +const float typVbg = 1.08; // 1.0 -- 1.2 + +float vcc = 0.0, tcc; +float kin, kdc, kbt, kba, kpf, kzu; +float vin, vdc, vbt, vba, vpf, vzu; +float tin, tdc, tbt, tba, tpf, tzu; +float aus, aba, ain, adc; +float uus, uba, uin, udc; + +byte cmd = 0x00; +byte ext = 0x00; +byte sum = 0x00; + +unsigned long lastCommandTime = 0; +byte autoResponse = 0x00; + +byte byteResponse = 0x00; +boolean needByte = false; +boolean needSumm = false; + +float floatResponse = 0.0; +boolean needFloat = false; +byte floatByte = 0; + +unsigned long ex_time, ba_time; +boolean ex_blocked = false, ba_blocked = false; + +byte ba_full_count = 0; + +//boolean ex_requested = false; + +unsigned long inc_time; + +boolean vin_ok = false; +byte vin_count = 0; + +boolean vdc_ok = false; +byte vdc_count = 0; + +boolean vbt_ok = false, vbt_fail = false; +byte vbt_count = 0, vbt_fail_count = 0; + +boolean vba_ok = false; +byte vba_count = 0; + +boolean vpf_ok = false; +byte vpf_count = 0; + +boolean vzu_ok = false; +byte vzu_count = 0; + +boolean vcc_ok = false; +byte vcc_count = 0; + +boolean aus_ok = false; +byte aus_count = 0; + +boolean aba_ok = false; +byte aba_count = 0; + +boolean ain_ok = false; +byte ain_count = 0; + +boolean adc_ok = false; +byte adc_count = 0; + +boolean ba_enabled = false; +boolean ex_enabled = false; +boolean pf_enabled = false; +boolean us_enabled = true; + +boolean ba_full = false; +boolean ba_charge = false; + +byte status_1 = 0x00; +byte status_2 = 0x00; +byte status_3 = 0x00; + +/**************************************************************************** + * Главная программа + ****************************************************************************/ + +void setup() { + if (DEBUG) { + Serial.begin(9600); + Serial.println("---"); + delay(1000); + } + + // определение опорного напряжения + analogReference(DEFAULT); // DEFAULT INTERNAL использовать vcc как AREF + + kin = r1_2 / (r1_1 + r1_2); + kdc = r2_2 / (r2_1 + r2_2); + kbt = r3_2 / (r3_1 + r3_2); + kba = r4_2 / (r4_1 + r4_2); + kpf = r5_2 / (r5_1 + r5_2); + kzu = r6_2 / (r6_1 + r6_2); + + if (DEBUG) { + Serial.print("Vcc= "); + Serial.println(vcc); + Serial.println("---"); + } + + // Initialize i2c as slave + Wire.begin(SLAVE_ADDRESS); + + // Define callbacks for i2c communication + Wire.onReceive(receiveData); + Wire.onRequest(answer); + + pinMode(R_BA, OUTPUT); + pinMode(R_PF, OUTPUT); + pinMode(R_DC, OUTPUT); + pinMode(R_US, OUTPUT); + + pinMode(VIN_PIN, INPUT); + pinMode(VDC_PIN, INPUT); + pinMode(VBT_PIN, INPUT); + pinMode(VBA_PIN, INPUT); + pinMode(VPF_PIN, INPUT); + pinMode(VZU_PIN, INPUT); + + pinMode(AUS_PIN, INPUT); + pinMode(ABA_PIN, INPUT); + pinMode(AIN_PIN, INPUT); + pinMode(ADC_PIN, INPUT); + + pinMode(INC_PIN, INPUT); + pinMode(LED_PIN, OUTPUT); + + ex_time = millis(); +} + +void loop() { + // Timeout protection + if ((lastCommandTime + TIMEOUT < millis())) { + floatResponse = 0.0; + floatByte = 0; + needFloat = false; + autoResponse = TMO_RSP; + } + + // BLOCK OF MAGIC + readvcc(); + analogRead(VIN_PIN); + readvcc(); + analogRead(VIN_PIN); + readvcc(); + analogRead(VIN_PIN); + // MAGIC + + // Get voltages + tin = 0.0; + tdc = 0.0; + tbt = 0.0; + tba = 0.0; + tpf = 0.0; + tzu = 0.0; + + tin += readvcc() * analogRead(VIN_PIN); + tdc += readvcc() * analogRead(VDC_PIN); + tbt += readvcc() * analogRead(VBT_PIN); + tba += readvcc() * analogRead(VBA_PIN); + tpf += readvcc() * analogRead(VPF_PIN); + tzu += readvcc() * analogRead(VZU_PIN); + + tcc = readvcc(); + tin = tin / 1024.0 / kin;// / REP_COUNT; + tdc = tdc / 1024.0 / kdc;// / REP_COUNT; + tbt = tbt / 1024.0 / kbt;// / REP_COUNT; + tba = tba / 1024.0 / kba;// / REP_COUNT; + tpf = tpf / 1024.0 / kpf;// / REP_COUNT; + tzu = tzu / 1024.0 / kzu;// / REP_COUNT; + + if (tcc > VCC_MIN) vcc = tcc; + vin = tin; + vdc = tdc; + vbt = tbt; + vba = tba; + vpf = tpf; + vzu = tzu; + + // Get currents + aus = (analogRead(AUS_PIN) - 512) * 0.0264; + //if (aus < 0) aus *= -1; + aba = (analogRead(ABA_PIN) - 512) * 0.0264; + //if (aba < 0) aba *= -1; + ain = (analogRead(AIN_PIN) - 512) * 0.0264; + //if (ain < 0) ain *= -1; + adc = (analogRead(ADC_PIN) - 512) * 0.0264; + //if (adc < 0) adc *= -1; + + if (DEBUG) { + Serial.print("Vcc: "); + Serial.println(vcc); + Serial.print("Vin: "); + Serial.println(vin); + Serial.print("Vdc: "); + Serial.println(vdc); + Serial.print("Vbt: "); + Serial.println(vbt); + Serial.print("Vba: "); + Serial.println(vba); + Serial.print("Vpf: "); + Serial.println(vpf); + Serial.print("Vzu: "); + Serial.println(vzu); + Serial.println("---"); + } + + // Vin check + if (vin >= VIN_MIN && vin <= VIN_MAX) { + if (! vin_ok) vin_count++; + } + else { + vin_count = 0; + vin_ok = false; + } + + if (vin_count >= V_CHECK_CYCLES) vin_ok = true; + + // Vdc check + if (vdc >= VDC_MIN && vdc <= VDC_MAX) { + if (! vdc_ok) vdc_count++; + } + else { + vdc_count = 0; + vdc_ok = false; + } + + if (vdc_count >= V_CHECK_CYCLES) vdc_ok = true; + + // Vbt check + if (vbt >= VBT_MIN && vbt <= VBT_MAX) { + if (! vbt_ok) vbt_count++; + } + else { + vbt_count = 0; + vbt_ok = false; + } + + if (vbt_count >= V_CHECK_CYCLES) vbt_ok = true; + + // Vba check + if (vba >= VBA_MIN && vba <= VBA_MAX) { + if (! vba_ok) vba_count++; + } + else { + vba_count = 0; + vba_ok = false; + } + + if (vba_count >= V_CHECK_CYCLES) vba_ok = true; + + // Vpf check + if (vpf >= VPF_MIN && vpf <= VPF_MAX) { + if (! vpf_ok) vpf_count++; + } + else { + vpf_count = 0; + vpf_ok = false; + } + + if (vpf_count >= V_CHECK_CYCLES) vpf_ok = true; + + // Vzu check + if (vzu >= VZU_MIN && vzu <= VZU_MAX) { + if (! vzu_ok) vzu_count++; + } + else { + vzu_count = 0; + vzu_ok = false; + } + + if (vzu_count >= V_CHECK_CYCLES) vzu_ok = true; + + // Vcc check + if (vcc >= VCC_MIN && vcc <= VCC_MAX) { + if (! vcc_ok) vcc_count++; + } + else { + vcc_count = 0; + vcc_ok = false; + } + + if (vcc_count >= V_CHECK_CYCLES) vcc_ok = true; + + // Aus check + if (aus >= AUS_MIN && aus <= AUS_MAX) { + if (! aus_ok) aus_count++; + } + else { + aus_count = 0; + aus_ok = false; + } + + if (aus_count >= V_CHECK_CYCLES) aus_ok = true; + + // Aba check + if (aba >= ABA_MIN && aba <= ABA_MAX) { + if (! aba_ok) aba_count++; + } + else { + aba_count = 0; + aba_ok = false; + } + + if (aba_count >= V_CHECK_CYCLES) aba_ok = true; + + // Ain check + if (ain >= AIN_MIN && ain <= AIN_MAX) { + if (! ain_ok) ain_count++; + } + else { + ain_count = 0; + ain_ok = false; + } + + if (ain_count >= V_CHECK_CYCLES) ain_ok = true; + + // Adc check + if (adc >= ADC_MIN && adc <= ADC_MAX) { + if (! adc_ok) adc_count++; + } + else { + adc_count = 0; + adc_ok = false; + } + + if (adc_count >= V_CHECK_CYCLES) adc_ok = true; + + // BA full? + if (vba >= VBA_FULL) { + if (! ba_full && ! ba_enabled) ba_full_count++; + } + else { + ba_full_count = 0; + //ba_full = false; + } + + if (ba_full_count >= BA_FULL_CHECK_CYCLES) { + ba_full = true; + } + + if (ba_enabled && ! in_plugged()) { + ba_full = false; + } + + // Auto disable EX + if (! vdc_ok) { // || ((! vin_ok || ! in_plugged()) && ! ex_requested)) { + disableEX(); + } + + // Disable EX block + if (ex_blocked && ex_time + EX_BLOCK_TIMEOUT < millis()) { + ex_blocked = false; + } + + // Auto enable EX + if (vdc_ok && ! ex_blocked) { + enableEX(); + } + + // Auto enable BA (for charge) + if (! ba_enabled && vin_ok && in_plugged() && ! ba_full && ! ba_blocked) { + enableBA(); + } + + // Auto disable BA (if charge complete) + if (ba_enabled && ba_full && in_plugged()) { //(ba_full || ! in_plugged())) { + disableBA(); + } + + // Auto enable BA (for support) + if (! ba_enabled && ! ba_blocked && (! vin_ok || ! in_plugged())) { + enableBA(); + } + + // Auto disable BA (if discharged) + if (ba_enabled && ! in_plugged() && ! vba_ok) { + disableBA(); + } + + // Disable BA block + if (ba_blocked && ba_time + BA_BLOCK_TIMEOUT < millis()) { + ba_blocked = false; + } + + // Compile status + status_1 = 0x00; + if (vcc_ok) status_1 |= 0x01; + if (vin_ok) status_1 |= 0x02; + if (vdc_ok) status_1 |= 0x04; + if (vbt_ok) status_1 |= 0x08; + if (vba_ok) status_1 |= 0x10; + if (ex_enabled) status_1 |= 0x20; + if (ba_enabled) status_1 |= 0x40; + if (ex_blocked) status_1 |= 0x80; + + status_2 = 0x00; + if (in_plugged()) status_2 |= 0x01; + if (ba_blocked) status_2 |= 0x02; + if (ba_full) status_2 |= 0x04; + if (ba_charge) status_2 |= 0x08; + if (vpf_ok) status_2 |= 0x10; + if (vzu_ok) status_2 |= 0x20; + if (pf_enabled) status_2 |= 0x40; + if (us_enabled) status_2 |= 0x80; + + status_3 = 0x00; + if (aus_ok) status_3 |= 0x01; + if (aba_ok) status_3 |= 0x02; + if (ain_ok) status_3 |= 0x04; + if (adc_ok) status_3 |= 0x08; +} + +/**************************************************************************** + * Функции + ****************************************************************************/ + +float readvcc() { + byte i; + float result = 0.0; + float tmp = 0.0; + + //for (i = 0; i < REP_COUNT; i++) { + // Read 1.1V reference against Avcc + // set the reference to vcc and the measurement to the internal 1.1V reference + #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) + ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); + #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) + ADMUX = _BV(MUX5) | _BV(MUX0); + #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) + ADMUX = _BV(MUX3) | _BV(MUX2); + #else + // works on an Arduino 168 or 328 + ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); + #endif + + delay(3); // Wait for Vref to settle + ADCSRA |= _BV(ADSC); // Start conversion + while (bit_is_set(ADCSRA,ADSC)); // measuring + + uint8_t low = ADCL; // must read ADCL first - it then locks ADCH + uint8_t high = ADCH; // unlocks both + + tmp = (high<<8) | low; + tmp = (typVbg * 1023.0) / tmp; + //result = result + tmp; + // delay(5); + //} + + //result = result / REP_COUNT; + return tmp;//result; +} + +// Callback for received data +void receiveData(int byteCount) { + + while(Wire.available()) { + // Get command + ext = Wire.read(); + if (ext == EXT_COM && byteCount == 3) { + cmd = 0x00; + sum = 0x00; + + if (Wire.available()) sum = Wire.read(); + if (Wire.available()) cmd = Wire.read(); + + if ((cmd ^ XOR_SEQ) != sum) { + autoResponse = CSE_RSP; + return; + } + } + else { + autoResponse = ERR_RSP; + while(Wire.available()) { + ext = Wire.read(); + } + return; + } + + // Process command + switch (cmd) { + case COM_GET_VIN: + sendFloat(vin); + break; + case COM_GET_VDC: + sendFloat(vdc); + break; + case COM_GET_VBT: + sendFloat(vbt); + break; + case COM_GET_VBA: + sendFloat(vba); + break; + case COM_GET_VPF: + sendFloat(vpf); + break; + case COM_GET_VZU: + sendFloat(vzu); + break; + case COM_GET_VCC: + sendFloat(vcc); + break; + + case COM_GET_AUS: + sendFloat(aus); + break; + case COM_GET_ABA: + sendFloat(aba); + break; + case COM_GET_AIN: + sendFloat(ain); + break; + case COM_GET_ADC: + sendFloat(adc); + break; + + case COM_GET_TEMP: + sendFloat(getInternalTemp()); + break; + case COM_GET_STAT1: + sendByte(status_1); + break; + case COM_GET_STAT2: + sendByte(status_2); + break; + case COM_GET_STAT3: + sendByte(status_3); + break; + + case COM_ENABLE_BA: + commandResponse(enableBA()); + break; + case COM_DISABLE_BA: + commandResponse(disableBA()); + break; + + case COM_ENABLE_EX: + commandResponse(enableEX()); + break; + case COM_DISABLE_EX: + commandResponse(disableEX()); + break; + + case COM_ENABLE_PF: + enablePF(); + commandResponse(); + break; + + case COM_DISABLE_PF: + disablePF(); + commandResponse(); + break; + + case COM_ENABLE_US: + enableUS(); + commandResponse(); + break; + + case COM_DISABLE_US: + disableUS(); + commandResponse(); + break; + + case COM_RESET_US: + resetUS(); + commandResponse(); + break; + + default: + autoResponse = ERR_RSP; + break; + } + } +} + +void commandResponse() { + lastCommandTime = millis(); + autoResponse = OK_RSP; +} + +void commandResponse(byte response) { + lastCommandTime = millis(); + autoResponse = response; +} + +void sendByte(byte value) { + lastCommandTime = millis(); + byteResponse = value; + needSumm = false; + needByte = true; +} + +void sendFloat(float value) { + lastCommandTime = millis(); + floatResponse = value; + floatByte = 0; + needFloat = true; +} + +byte cSum(byte value) { + return value ^ XOR_SEQ; +} + +byte cSum(byte *data, byte dataSize) { + byte tmp = 0x00; + for (byte i = 0; i < dataSize; i++) { + tmp = tmp ^ data[i]; + } + return tmp ^ XOR_SEQ; +} + +void answer() { + // Want float value? + if (needFloat) { + // Get access to the float as a byte-array: + byte *data = (byte *) &floatResponse; + + if (floatByte < sizeof(floatResponse)) { + // Send byte + Wire.write(data[floatByte]); + floatByte++; + } + else { + // Send control sum + Wire.write(cSum(data, sizeof(floatResponse))); + needFloat = false; + } + } + else { + // Want byte value? + if (needByte) { + if (!needSumm) { + // Send byte + Wire.write(byteResponse); + needSumm = true; + } + else { + // Send control sum + Wire.write(cSum(byteResponse)); + needSumm = false; + needByte = false; + } + } + else { + // Want something else? + Wire.write(autoResponse); + } + } + // Nothing more to send + autoResponse = NO_RSP; +} + +byte enableEX() { + if (vdc_ok) { + digitalWrite(R_DC, HIGH); + digitalWrite(LED_PIN, HIGH); + ex_enabled = true; + ex_blocked = false; + + return OK_RSP; + } + else return BLK_RSP; +} + +byte disableEX() { + if (vbt_ok) { + digitalWrite(R_DC, LOW); + digitalWrite(LED_PIN, LOW); + ex_enabled = false; + ex_time = millis(); + ex_blocked = true; + + return OK_RSP; + } + else return BLK_RSP; +} + +void enablePF() { + digitalWrite(R_PF, HIGH); + pf_enabled = true; +} + +void disablePF() { + digitalWrite(R_PF, LOW); + pf_enabled = false; +} + +byte enableBA() { + if (! (in_plugged() && ! vin_ok)) { + digitalWrite(R_BA, HIGH); + ba_enabled = true; + ba_blocked = false; + + return OK_RSP; + } + else return BLK_RSP; +} + +byte disableBA() { + if (! (ex_enabled && ! in_plugged() && ! vbt_ok)) { + digitalWrite(R_BA, LOW); + ba_enabled = false; + ba_time = millis(); + ba_blocked = true; + + return OK_RSP; + } + else return BLK_RSP; +} + +void enableUS() { + digitalWrite(R_US, LOW); + us_enabled = true; +} + +void disableUS() { + digitalWrite(R_US, HIGH); + us_enabled = false; +} + +void resetUS() { + disableUS(); + delay(500); + enableUS(); +} + +// Get the internal temperature +float getInternalTemp() { + unsigned int wADC; + float t; + ADMUX = (_BV(REFS1) | _BV(REFS0) | _BV(MUX3)); + ADCSRA |= _BV(ADEN); // enable the ADC + delay(20); // wait for voltages to become stable. + ADCSRA |= _BV(ADSC); // Start the ADC + while (bit_is_set(ADCSRA,ADSC)); + wADC = ADCW; + t = (wADC - 324.31 ) / 1.22; + return(t); +} + +bool in_plugged() { + if (digitalRead(INC_PIN) == HIGH) { + return true; + } else { + return false; + } +} + diff --git a/HXpower4/HXpower4.ino b/HXpower4/HXpower4.ino new file mode 100644 index 0000000..d91fc7f --- /dev/null +++ b/HXpower4/HXpower4.ino @@ -0,0 +1,897 @@ +///////////////////////////////////////// +// HXbot HXpower firmware v4a / +// EoF 2016 EoF@itphx.ru / +///////////////////////////////////////// + +#include + +// DEBUG +#define DEBUG 0 + +// DEFINE +#define SLAVE_ADDRESS 0x05 +#define XOR_SEQ 0xFF +#define EXT_COM 0xAA + +#define AIN_PIN A9 +#define ABT_PIN A8 +#define ABA_PIN A7 +#define AHX_PIN A6 + +#define VIN_PIN A5 +#define VDC_PIN A4 +#define VBT_PIN A3 +#define VBA_PIN A2 +#define VZU_PIN A1 +#define VPF_PIN A0 + +#define R_BT 11 +#define R_BA 7 +#define R_MV 5 +#define R_US 1 +//#define RED_PIN 10 +//#define GRN_PIN 12 +#define INC_PIN 0 +#define LED_PIN 13 + +#define REP_COUNT 5 + +#define TIMEOUT 5000 +#define BUTTON_REACTION_TIME 5000 + +// COMMANDS +// VOLTMETERS +#define COM_GET_VIN 0x01 +#define COM_GET_VDC 0x02 +#define COM_GET_VBT 0x03 +#define COM_GET_VBA 0x04 +#define COM_GET_VPF 0x05 +#define COM_GET_VZU 0x06 +#define COM_GET_VCC 0x07 + +// AMPERMETERS +#define COM_GET_ABT 0x21 +#define COM_GET_ABA 0x22 +#define COM_GET_AIN 0x23 +#define COM_GET_AHX 0x24 + +// STATUS +#define COM_GET_STAT1 0x08 +#define COM_GET_STAT2 0x09 +#define COM_GET_STAT3 0x20 + +// TEMP +#define COM_GET_TEMP 0x10 + +// RELAYS +#define COM_ENABLE_BA 0x11 // 17 +#define COM_ENABLE_MV 0x12 // 18 +#define COM_ENABLE_BT 0x13 // 19 +#define COM_ENABLE_US 0x14 // 20 + +#define COM_DISABLE_BA 0x15 // 21 +#define COM_DISABLE_MV 0x16 // 22 +#define COM_DISABLE_BT 0x17 // 23 +#define COM_DISABLE_US 0x18 // 24 + +#define COM_RUN 0x1B // 27 +#define COM_STOP 0x1C // 28 +#define COM_RESET_US 0x1D // 29 + +#define OK_RSP 0x00 +#define NO_RSP 0xFF +#define ERR_RSP 0x01 +#define BLK_RSP 0x02 +#define CSE_RSP 0x03 +#define IOE_RSP 0x04 +#define TMO_RSP 0x05 + +// CONST +#define BT_BLOCK_TIMEOUT 30000 +#define BT_FULL_CHECK_CYCLES 20 +#define BA_BLOCK_TIMEOUT 30000 +#define BA_FULL_CHECK_CYCLES 20 +#define V_CHECK_CYCLES 10 +#define AREF 5 + +#define VIN_MIN 14.0 +#define VIN_MAX 25.0 + +#define VDC_MIN 5.5 +#define VDC_MAX 6.5 + +#define VBT_MIN 6.6 +#define VBT_MAX 8.6 + +#define VBA_MIN 9.0 +#define VBA_MAX 13.0 +#define VBA_FULL 12.0 + +#define VPF_MIN 7.2 +#define VPF_MAX 10.0 + +#define VZU_MIN 5.0 +#define VZU_MAX 6.3 + +#define VCC_MIN 4.8 +#define VCC_MAX 5.5 + +#define ABT_MIN 0.1 +#define ABT_MAX 5.0 + +#define ABA_MIN 0.1 +#define ABA_MAX 5.0 + +#define AIN_MIN 0.1 +#define AIN_MAX 5.0 + +#define AHX_MIN 0.1 +#define AHX_MAX 5.0 + +// VAR +// резисторы делителя напряжения +const float r1_1 = 100000; // 100K +const float r1_2 = 10000; // 10K +const float r2_1 = 10380; // 10K +const float r2_2 = 10000; // 10K +const float r3_1 = 20000; // 10K +const float r3_2 = 10000; // 10K +const float r4_1 = 20330; // 20K +const float r4_2 = 10000; // 10K +const float r5_1 = 1060; // 1K +const float r5_2 = 1000; // 1K +const float r6_1 = 1000; // 1K +const float r6_2 = 1000; // 1K + +// эту константу (typVbg) необходимо откалибровать индивидуально +const float typVbg = 1.08; // 1.0 -- 1.2 + +float vcc = 0.0, tcc; +float kin, kdc, kbt, kba, kpf, kzu; +float vin, vdc, vbt, vba, vpf, vzu; +float tin, tdc, tbt, tba, tpf, tzu; +float abt, aba, ain, ahx; +float uus, uba, uin, udc; + +byte cmd = 0x00; +byte ext = 0x00; +byte sum = 0x00; + +unsigned long lastCommandTime = 0; +byte autoResponse = 0x00; + +byte byteResponse = 0x00; +boolean needByte = false; +boolean needSumm = false; + +float floatResponse = 0.0; +boolean needFloat = false; +byte floatByte = 0; + +unsigned long bt_time, ba_time; +boolean bt_blocked = false, ba_blocked = false; + +byte ba_full_count = 0, bt_full_count = 0; + +unsigned long inc_time; + +boolean vin_ok = false; +byte vin_count = 0; + +boolean vdc_ok = false; +byte vdc_count = 0; + +boolean vbt_ok = false, vbt_fail = false; +byte vbt_count = 0, vbt_fail_count = 0; + +boolean vba_ok = false; +byte vba_count = 0; + +boolean vpf_ok = false; +byte vpf_count = 0; + +boolean vzu_ok = false; +byte vzu_count = 0; + +boolean vcc_ok = false; +byte vcc_count = 0; + +boolean abt_ok = false; +byte abt_count = 0; + +boolean aba_ok = false; +byte aba_count = 0; + +boolean ain_ok = false; +byte ain_count = 0; + +boolean ahx_ok = false; +byte ahx_count = 0; + +boolean ba_enabled = false; +boolean bt_enabled = true; +boolean mv_enabled = false; +boolean us_enabled = true; + +boolean bt_full = false; +boolean bt_charge = false; +boolean ba_full = false; +boolean ba_charge = false; + +byte status_1 = 0x00; +byte status_2 = 0x00; +byte status_3 = 0x00; + +/**************************************************************************** + * Главная программа + ****************************************************************************/ + +void setup() { + if (DEBUG) { + Serial.begin(9600); + Serial.println("---"); + delay(1000); + } + + // определение опорного напряжения + analogReference(DEFAULT); // DEFAULT INTERNAL использовать vcc как AREF + + kin = r1_2 / (r1_1 + r1_2); + kdc = r2_2 / (r2_1 + r2_2); + kbt = r3_2 / (r3_1 + r3_2); + kba = r4_2 / (r4_1 + r4_2); + kpf = r5_2 / (r5_1 + r5_2); + kzu = r6_2 / (r6_1 + r6_2); + + if (DEBUG) { + Serial.print("Vcc= "); + Serial.println(vcc); + Serial.println("---"); + } + + // Initialize i2c as slave + Wire.begin(SLAVE_ADDRESS); + + // Define callbacks for i2c communication + Wire.onReceive(receiveData); + Wire.onRequest(answer); + + pinMode(R_BT, OUTPUT); + pinMode(R_BA, OUTPUT); + pinMode(R_MV, OUTPUT); + pinMode(R_US, OUTPUT); + + pinMode(VIN_PIN, INPUT); + pinMode(VDC_PIN, INPUT); + pinMode(VBT_PIN, INPUT); + pinMode(VBA_PIN, INPUT); + pinMode(VPF_PIN, INPUT); + pinMode(VZU_PIN, INPUT); + + pinMode(ABT_PIN, INPUT); + pinMode(ABA_PIN, INPUT); + pinMode(AIN_PIN, INPUT); + pinMode(AHX_PIN, INPUT); + + pinMode(INC_PIN, INPUT); + pinMode(LED_PIN, OUTPUT); + + bt_time = millis(); +} + +void loop() { + // Timeout protection + if ((lastCommandTime + TIMEOUT < millis())) { + floatResponse = 0.0; + floatByte = 0; + needFloat = false; + autoResponse = TMO_RSP; + } + + // BLOCK OF MAGIC + readvcc(); + analogRead(VIN_PIN); + readvcc(); + analogRead(VIN_PIN); + readvcc(); + analogRead(VIN_PIN); + // MAGIC + + // Get voltages + tin = 0.0; + tdc = 0.0; + tbt = 0.0; + tba = 0.0; + tpf = 0.0; + tzu = 0.0; + + tin += readvcc() * analogRead(VIN_PIN); + tdc += readvcc() * analogRead(VDC_PIN); + tbt += readvcc() * analogRead(VBT_PIN); + tba += readvcc() * analogRead(VBA_PIN); + tpf += readvcc() * analogRead(VPF_PIN); + tzu += readvcc() * analogRead(VZU_PIN); + + tcc = readvcc(); + tin = tin / 1024.0 / kin;// / REP_COUNT; + tdc = tdc / 1024.0 / kdc;// / REP_COUNT; + tbt = tbt / 1024.0 / kbt;// / REP_COUNT; + tba = tba / 1024.0 / kba;// / REP_COUNT; + tpf = tpf / 1024.0 / kpf;// / REP_COUNT; + tzu = tzu / 1024.0 / kzu;// / REP_COUNT; + + if (tcc > VCC_MIN) vcc = tcc; + vin = tin; + vdc = tdc; + vbt = tbt; + vba = tba; + vpf = tpf; + vzu = tzu; + + // Get currents + abt = (analogRead(ABT_PIN) - 512) * 0.0264; + //if (abt < 0) abt *= -1; + aba = (analogRead(ABA_PIN) - 512) * 0.0264; + //if (aba < 0) aba *= -1; + ain = (analogRead(AIN_PIN) - 512) * 0.0264; + //if (ain < 0) ain *= -1; + ahx = (analogRead(AHX_PIN) - 512) * 0.0264; + //if (ahx < 0) ahx *= -1; + + if (DEBUG) { + Serial.print("Vcc: "); + Serial.println(vcc); + Serial.print("Vin: "); + Serial.println(vin); + Serial.print("Vdc: "); + Serial.println(vdc); + Serial.print("Vbt: "); + Serial.println(vbt); + Serial.print("Vba: "); + Serial.println(vba); + Serial.print("Vpf: "); + Serial.println(vpf); + Serial.print("Vzu: "); + Serial.println(vzu); + Serial.println("---"); + } + + // Vin check + if (vin >= VIN_MIN && vin <= VIN_MAX) { + if (! vin_ok) vin_count++; + } + else { + vin_count = 0; + vin_ok = false; + } + + if (vin_count >= V_CHECK_CYCLES) vin_ok = true; + + // Vdc check + if (vdc >= VDC_MIN && vdc <= VDC_MAX) { + if (! vdc_ok) vdc_count++; + } + else { + vdc_count = 0; + vdc_ok = false; + } + + if (vdc_count >= V_CHECK_CYCLES) vdc_ok = true; + + // Vbt check + if (vbt >= VBT_MIN && vbt <= VBT_MAX) { + if (! vbt_ok) vbt_count++; + } + else { + vbt_count = 0; + vbt_ok = false; + } + + if (vbt_count >= V_CHECK_CYCLES) vbt_ok = true; + + // Vba check + if (vba >= VBA_MIN && vba <= VBA_MAX) { + if (! vba_ok) vba_count++; + } + else { + vba_count = 0; + vba_ok = false; + } + + if (vba_count >= V_CHECK_CYCLES) vba_ok = true; + + // Vpf check + if (vpf >= VPF_MIN && vpf <= VPF_MAX) { + if (! vpf_ok) vpf_count++; + } + else { + vpf_count = 0; + vpf_ok = false; + } + + if (vpf_count >= V_CHECK_CYCLES) vpf_ok = true; + + // Vzu check + if (vzu >= VZU_MIN && vzu <= VZU_MAX) { + if (! vzu_ok) vzu_count++; + } + else { + vzu_count = 0; + vzu_ok = false; + } + + if (vzu_count >= V_CHECK_CYCLES) vzu_ok = true; + + // Vcc check + if (vcc >= VCC_MIN && vcc <= VCC_MAX) { + if (! vcc_ok) vcc_count++; + } + else { + vcc_count = 0; + vcc_ok = false; + } + + if (vcc_count >= V_CHECK_CYCLES) vcc_ok = true; + + // Abt check + if (abt >= ABT_MIN && abt <= ABT_MAX) { + if (! abt_ok) abt_count++; + } + else { + abt_count = 0; + abt_ok = false; + } + + if (abt_count >= V_CHECK_CYCLES) abt_ok = true; + + // Aba check + if (aba >= ABA_MIN && aba <= ABA_MAX) { + if (! aba_ok) aba_count++; + } + else { + aba_count = 0; + aba_ok = false; + } + + if (aba_count >= V_CHECK_CYCLES) aba_ok = true; + + // Ain check + if (ain >= AIN_MIN && ain <= AIN_MAX) { + if (! ain_ok) ain_count++; + } + else { + ain_count = 0; + ain_ok = false; + } + + if (ain_count >= V_CHECK_CYCLES) ain_ok = true; + + // Ahx check + if (ahx >= AHX_MIN && ahx <= AHX_MAX) { + if (! ahx_ok) ahx_count++; + } + else { + ahx_count = 0; + ahx_ok = false; + } + + if (ahx_count >= V_CHECK_CYCLES) ahx_ok = true; + +// // BA full? +// if (vba >= VBA_FULL) { +// if (! ba_full && ! ba_enabled) ba_full_count++; +// } +// else { +// ba_full_count = 0; +// //ba_full = false; +// } +// +// if (ba_full_count >= BA_FULL_CHECK_CYCLES) { +// ba_full = true; +// } +// +// if (ba_enabled && ! in_plugged()) { +// ba_full = false; +// } + +// // Auto disable EX +// if (! vdc_ok) { // || ((! vin_ok || ! in_plugged()) && ! ex_requested)) { +// disableEX(); +// } +// +// // Disable EX block +// if (ex_blocked && ex_time + EX_BLOCK_TIMEOUT < millis()) { +// ex_blocked = false; +// } +// +// // Auto enable EX +// if (vdc_ok && ! ex_blocked) { +// enableEX(); +// } +// +// // Auto enable BA (for charge) +// if (! ba_enabled && vin_ok && in_plugged() && ! ba_full && ! ba_blocked) { +// enableBA(); +// } +// +// // Auto disable BA (if charge complete) +// if (ba_enabled && ba_full && in_plugged()) { //(ba_full || ! in_plugged())) { +// disableBA(); +// } +// +// // Auto enable BA (for support) +// if (! ba_enabled && ! ba_blocked && (! vin_ok || ! in_plugged())) { +// enableBA(); +// } +// +// // Auto disable BA (if discharged) +// if (ba_enabled && ! in_plugged() && ! vba_ok) { +// disableBA(); +// } +// +// // Disable BA block +// if (ba_blocked && ba_time + BA_BLOCK_TIMEOUT < millis()) { +// ba_blocked = false; +// } + + // Compile status + status_1 = 0x00; + if (vcc_ok) status_1 |= 0x01; + if (vin_ok) status_1 |= 0x02; + if (vdc_ok) status_1 |= 0x04; + if (vbt_ok) status_1 |= 0x08; + if (vba_ok) status_1 |= 0x10; + if (bt_enabled) status_1 |= 0x20; + if (ba_enabled) status_1 |= 0x40; + if (in_plugged()) status_1 |= 0x80; + + status_2 = 0x00; + if (bt_blocked) status_2 |= 0x01; + if (ba_blocked) status_2 |= 0x02; + if (bt_full) status_2 |= 0x04; + if (ba_full) status_2 |= 0x08; + if (vpf_ok) status_2 |= 0x10; + if (vzu_ok) status_2 |= 0x20; + if (mv_enabled) status_2 |= 0x40; + if (us_enabled) status_2 |= 0x80; + + status_3 = 0x00; + if (abt_ok) status_3 |= 0x01; + if (aba_ok) status_3 |= 0x02; + if (ain_ok) status_3 |= 0x04; + if (ahx_ok) status_3 |= 0x08; +} + +/**************************************************************************** + * Функции + ****************************************************************************/ + +float readvcc() { + byte i; + float result = 0.0; + float tmp = 0.0; + + //for (i = 0; i < REP_COUNT; i++) { + // Read 1.1V reference against Avcc + // set the reference to vcc and the measurement to the internal 1.1V reference + #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) + ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); + #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) + ADMUX = _BV(MUX5) | _BV(MUX0); + #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) + ADMUX = _BV(MUX3) | _BV(MUX2); + #else + // works on an Arduino 168 or 328 + ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); + #endif + + delay(3); // Wait for Vref to settle + ADCSRA |= _BV(ADSC); // Start conversion + while (bit_is_set(ADCSRA,ADSC)); // measuring + + uint8_t low = ADCL; // must read ADCL first - it then locks ADCH + uint8_t high = ADCH; // unlocks both + + tmp = (high<<8) | low; + tmp = (typVbg * 1023.0) / tmp; + //result = result + tmp; + // delay(5); + //} + + //result = result / REP_COUNT; + return tmp;//result; +} + +// Callback for received data +void receiveData(int byteCount) { + + while(Wire.available()) { + // Get command + ext = Wire.read(); + if (ext == EXT_COM && byteCount == 3) { + cmd = 0x00; + sum = 0x00; + + if (Wire.available()) sum = Wire.read(); + if (Wire.available()) cmd = Wire.read(); + + if ((cmd ^ XOR_SEQ) != sum) { + autoResponse = CSE_RSP; + return; + } + } + else { + autoResponse = ERR_RSP; + while(Wire.available()) { + ext = Wire.read(); + } + return; + } + + // Process command + switch (cmd) { + case COM_GET_VIN: + sendFloat(vin); + break; + case COM_GET_VDC: + sendFloat(vdc); + break; + case COM_GET_VBT: + sendFloat(vbt); + break; + case COM_GET_VBA: + sendFloat(vba); + break; + case COM_GET_VPF: + sendFloat(vpf); + break; + case COM_GET_VZU: + sendFloat(vzu); + break; + case COM_GET_VCC: + sendFloat(vcc); + break; + + case COM_GET_ABT: + sendFloat(abt); + break; + case COM_GET_ABA: + sendFloat(aba); + break; + case COM_GET_AIN: + sendFloat(ain); + break; + case COM_GET_AHX: + sendFloat(ahx); + break; + + case COM_GET_TEMP: + sendFloat(getInternalTemp()); + break; + case COM_GET_STAT1: + sendByte(status_1); + break; + case COM_GET_STAT2: + sendByte(status_2); + break; + case COM_GET_STAT3: + sendByte(status_3); + break; + + case COM_ENABLE_BA: + commandResponse(enableBA()); + break; + case COM_DISABLE_BA: + commandResponse(disableBA()); + break; + + case COM_ENABLE_BT: + commandResponse(enableBT()); + break; + case COM_DISABLE_BT: + commandResponse(disableBT()); + break; + + case COM_ENABLE_MV: + enableMV(); + commandResponse(); + break; + + case COM_DISABLE_MV: + disableMV(); + commandResponse(); + break; + + case COM_ENABLE_US: + enableUS(); + commandResponse(); + break; + + case COM_DISABLE_US: + disableUS(); + commandResponse(); + break; + + case COM_RESET_US: + resetUS(); + commandResponse(); + break; + + default: + autoResponse = ERR_RSP; + break; + } + } +} + +void commandResponse() { + lastCommandTime = millis(); + autoResponse = OK_RSP; +} + +void commandResponse(byte response) { + lastCommandTime = millis(); + autoResponse = response; +} + +void sendByte(byte value) { + lastCommandTime = millis(); + byteResponse = value; + needSumm = false; + needByte = true; +} + +void sendFloat(float value) { + lastCommandTime = millis(); + floatResponse = value; + floatByte = 0; + needFloat = true; +} + +byte cSum(byte value) { + return value ^ XOR_SEQ; +} + +byte cSum(byte *data, byte dataSize) { + byte tmp = 0x00; + for (byte i = 0; i < dataSize; i++) { + tmp = tmp ^ data[i]; + } + return tmp ^ XOR_SEQ; +} + +void answer() { + // Want float value? + if (needFloat) { + // Get access to the float as a byte-array: + byte *data = (byte *) &floatResponse; + + if (floatByte < sizeof(floatResponse)) { + // Send byte + Wire.write(data[floatByte]); + floatByte++; + } + else { + // Send control sum + Wire.write(cSum(data, sizeof(floatResponse))); + needFloat = false; + } + } + else { + // Want byte value? + if (needByte) { + if (!needSumm) { + // Send byte + Wire.write(byteResponse); + needSumm = true; + } + else { + // Send control sum + Wire.write(cSum(byteResponse)); + needSumm = false; + needByte = false; + } + } + else { + // Want something else? + Wire.write(autoResponse); + } + } + // Nothing more to send + autoResponse = NO_RSP; +} + +byte enableBT() { + if (vbt_ok) { + digitalWrite(R_BT, LOW); + bt_enabled = true; + bt_blocked = false; + + return OK_RSP; + } + else return BLK_RSP; +} + +byte disableBT() { + if ((vin_ok && in_plugged()) || (vba_ok && ba_enabled)) { + digitalWrite(R_BT, HIGH); + bt_enabled = false; + bt_time = millis(); + bt_blocked = true; + + return OK_RSP; + } + else return BLK_RSP; +} + +byte enableBA() { + if (vba_ok) { + digitalWrite(R_BA, HIGH); + ba_enabled = true; + ba_blocked = false; + + return OK_RSP; + } + else return BLK_RSP; +} + +byte disableBA() { + if ((vin_ok && in_plugged()) || (vbt_ok && bt_enabled)) { + digitalWrite(R_BA, LOW); + ba_enabled = false; + ba_time = millis(); + ba_blocked = true; + + return OK_RSP; + } + else return BLK_RSP; +} + +void enableMV() { + digitalWrite(R_MV, HIGH); + mv_enabled = true; +} + +void disableMV() { + digitalWrite(R_MV, LOW); + mv_enabled = false; +} + +void enableUS() { + digitalWrite(R_US, LOW); + us_enabled = true; +} + +void disableUS() { + digitalWrite(R_US, HIGH); + us_enabled = false; +} + +void resetUS() { + disableUS(); + delay(500); + enableUS(); +} + +// Get the internal temperature +float getInternalTemp() { + unsigned int wADC; + float t; + ADMUX = (_BV(REFS1) | _BV(REFS0) | _BV(MUX3)); + ADCSRA |= _BV(ADEN); // enable the ADC + delay(20); // wait for voltages to become stable. + ADCSRA |= _BV(ADSC); // Start the ADC + while (bit_is_set(ADCSRA,ADSC)); + wADC = ADCW; + t = (wADC - 324.31 ) / 1.22; + return(t); +} + +bool in_plugged() { + if (digitalRead(INC_PIN) == HIGH) { + return true; + } else { + return false; + } +} + diff --git a/HXtools/RGBconverter.py b/HXtools/RGBconverter.py new file mode 100644 index 0000000..09abf2c --- /dev/null +++ b/HXtools/RGBconverter.py @@ -0,0 +1,29 @@ +#!/usr/bin/python3 +# -*- coding: utf-8 -*- + +# MAIN PROGRAM +def main(): + color = int(input("Type color 0xHHHHHH>"), 16) + + r = color >> 16 + g = (color >> 8) & 0x0000FF + b = color & 0x0000FF + + r1 = int(r / 255 * 31) + g1 = int(g / 255 * 63) + b1 = int(b / 255 * 31) + + color = r1 << 11 + color = color + (g1 << 5) + color = color + b1 + + print('RED: 0x%X, %i' % (r, r1)) + print('GREEN: 0x%X, %i' % (g, g1)) + print('BLUE: 0x%X, %i' % (b, b1)) + print('COLOR: 0x%X' % color) + + + +# MAIN PROGRAM +if __name__ == "__main__": + main() diff --git a/HXtools/hxtools.nja b/HXtools/hxtools.nja new file mode 100644 index 0000000..4c778e6 --- /dev/null +++ b/HXtools/hxtools.nja @@ -0,0 +1,6 @@ +{ + "venv": "", + "name": "HXtools", + "license": "GNU General Public License v3", + "description": "" +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..3a6505e --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +HXbot diff --git a/REflex/REflex.ino b/REflex/REflex.ino new file mode 100644 index 0000000..a61e3b9 --- /dev/null +++ b/REflex/REflex.ino @@ -0,0 +1,643 @@ +///////////////////////////////////////// +// HXbot REflex firmware / +// EoF 2016 EoF@itphx.ru / +///////////////////////////////////////// + +#include +#include +#include +#include + +// DEBUG +#define DEBUG 1 + +// DEFINE +#define SLAVE_ADDRESS 0x04 +#define XOR_SEQ 0xFF +#define EXT_COM 0xAA + +//#define LED_PIN 13 +#define IRE_PIN 2 +#define IRR_PIN 3 +#define SV_PIN 13 // vertical +#define SV_CENTER 150 // 0 - up (min. 60), 180 - down (max. 170) +#define SH_PIN 12 //horisontal +#define SH_CENTER 90 // 0 - right, 180 - left +#define SERVO_DELAY 10 // time interval between servo moves +#define ULTRASONIC_PIN 6 +#define DRIVE_CHANNEL 2 +#define TIMEOUT 5000 +#define HEAD_V_FLAG 0x31 +#define HEAD_H_FLAG 0x30 +// Front and rear servos +#define SF_PIN 10 // front servo +#define SF_CENTER 96 +#define SR_PIN 11 // rear servo +#define SR_CENTER 93 +#define FR_STEP 2 +// IR distance sensors +#define IRD_FRONT_PIN 0 +#define IRD_F_MAX 3.0 +#define IRA_FRONT_PIN 1 +#define IRA_F_MIN 1.0 +#define IRD_REAR_PIN 2 +#define IRD_R_MAX 3.0 +#define IRA_REAR_PIN 3 +#define IRA_R_MIN 1.0 +#define IR_REPEAT_COUNT 3 + +// COMMANDS +// Util +#define COM_PING 0x01 +#define COM_GET_TEMP 0x02 +#define COM_GET_DISTANCE 0x03 + +// Stop +#define STOP 0x0F +// Move +#define MOVE_FLAG 0x04 +#define MOVE_FLOAT 0x10 +#define MOVE_FWD1 0x11 +#define MOVE_FWD2 0x12 +#define MOVE_FWD3 0x13 +#define MOVE_FWD4 0x14 +#define MOVE_FWD5 0x15 +#define MOVE_FWD6 0x16 +#define MOVE_FWD7 0x17 +#define MOVE_BREAK 0x18 +#define MOVE_REV7 0x19 +#define MOVE_REV6 0x1A +#define MOVE_REV5 0x1B +#define MOVE_REV4 0x1C +#define MOVE_REV3 0x1D +#define MOVE_REV2 0x1E +#define MOVE_REV1 0x1F +// Steering +#define STEER_FLAG 0x05 +#define STEER_CENTER 0x20 +#define STEER_LEFT1 0x21 +#define STEER_LEFT2 0x22 +#define STEER_LEFT3 0x23 +#define STEER_LEFT4 0x24 +#define STEER_LEFT5 0x25 +#define STEER_LEFT6 0x26 +#define STEER_LEFT7 0x27 +#define STEER_FIX_CENTER 0x28 +#define STEER_RIGHT7 0x29 +#define STEER_RIGHT6 0x2A +#define STEER_RIGHT5 0x2B +#define STEER_RIGHT4 0x2C +#define STEER_RIGHT3 0x2D +#define STEER_RIGHT2 0x2E +#define STEER_RIGHT1 0x2F + +// Response +#define OK_RSP 0x00 +#define NO_RSP 0xFF +#define ERR_RSP 0x01 +#define BLK_RSP 0x02 +#define CSE_RSP 0x03 +#define IOE_RSP 0x04 +#define TMO_RSP 0x05 + +// VAR +const float typVbg = 1.13; // 1.0 -- 1.2 + +float ird_f, ira_f, ird_r, ira_r; +boolean ird_ignore = false, ira_ignore = false; + +byte cmd = 0; +byte flg = 0; +byte ext = 0; + +byte autoresponse = 0; +long usDistance = 0; +unsigned long lastCommandTime = 0; +boolean isMove = false; +boolean frBlock = false; + +PowerFunctions pfDrive(IRE_PIN, DRIVE_CHANNEL); +Ultrasonic usSensor(ULTRASONIC_PIN); +Servo servV, servH, servF, servR; +byte destV, destH; +unsigned long lastServoMove = 0; + +// SETUP +void setup() { + + if (DEBUG) { + Serial.println("GO!"); + Serial.begin(9600); + } + + //pinMode(LED_PIN, OUTPUT); + + // Initialize i2c as slave + Wire.begin(SLAVE_ADDRESS); + + // Define callbacks for i2c communication + Wire.onReceive(receiveData); + Wire.onRequest(answer); + + analogReference(DEFAULT); + + destH = SH_CENTER; + destV = SV_CENTER; + + if (DEBUG) { + Serial.println("Setup complete"); + } +} + +// MAIN LOOP +void loop() { + // Timeout protection + if ((lastCommandTime + TIMEOUT < millis()) && isMove) { + pfDrive.combo_pwm(PWM_BRK, PWM_BRK); + servV.detach(); + servH.detach(); + isMove = false; + autoresponse = TMO_RSP; + } + + moveServo(); + + //usDistance = usSensor.MeasureInCentimeters(); + if (DEBUG) { + ird_f = analogRead(IRD_FRONT_PIN) * readvcc() / 1024; + ira_f = analogRead(IRA_FRONT_PIN) * readvcc() / 1024; + ird_r = analogRead(IRD_REAR_PIN) * readvcc() / 1024; + ira_r = analogRead(IRA_REAR_PIN) * readvcc() / 1024; + + Serial.print("VCC: "); + Serial.println(readvcc()); + Serial.print("IRD_F: "); + Serial.println(ird_f); + Serial.print("IRA_F: "); + Serial.println(ira_f); + Serial.print("IRD_R: "); + Serial.println(ird_r); + Serial.print("IRA_R: "); + Serial.println(ira_r); + Serial.println("------"); + delay(1000); + } + //delay(100); +} + +void moveResponse(byte rsp = OK_RSP) { + lastCommandTime = millis(); + isMove = true; + autoresponse = rsp; +} + +// Callback for received data +void receiveData(int byteCount) { + + while(Wire.available()) { + // Get command + cmd = Wire.read(); + if (cmd == EXT_COM && byteCount == 3) { + flg = 0x00; + ext = 0x00; + + if (Wire.available()) ext = Wire.read(); + if (Wire.available()) flg = Wire.read(); + } + else { + // Cleanup I2C bus + while(Wire.available()) { + ext = Wire.read(); + } + } + + switch (cmd) { + case COM_PING: + autoresponse = OK_RSP; + break; + case STOP: + pfDrive.combo_pwm(PWM_BRK, PWM_BRK); + moveResponse(); + break; + case COM_GET_TEMP: + autoresponse = getInternalTemp(); + break; + case COM_GET_DISTANCE: + usDistance = usSensor.MeasureInCentimeters(); + if (usDistance >= 255) { + autoresponse = NO_RSP; + } else { + autoresponse = usDistance; + } + break; + case EXT_COM: + switch (flg) { + case HEAD_V_FLAG: case HEAD_H_FLAG: + headControl(flg, ext); + break; + case MOVE_FLAG: case STEER_FLAG: + moveControl(flg, ext); + break; + } + break; + default: + autoresponse = ERR_RSP; + break; + } + } +} + +void headControl(byte flg, byte val) { + if (! servV.attached()) servV.attach(SV_PIN); + if (! servH.attached()) servH.attach(SH_PIN); + + switch (flg) { + case HEAD_V_FLAG: + destV = val; + break; + case HEAD_H_FLAG: + destH = val; + break; + } + moveResponse(); +} + +void moveServo() { + byte curV, curH; + + if (! isMove) return; + + if (lastServoMove + SERVO_DELAY < millis()) { + curV = servV.read(); + curH = servH.read(); + + if (destV < curV) servV.write(curV - 1); + if (destV > curV) servV.write(curV + 1); + if (destH < curH) servH.write(curH - 1); + if (destH > curH) servH.write(curH + 1); + + lastServoMove = millis(); + } +} + +// Callback for sending data +void answer() { + Wire.write(autoresponse); +} + +boolean ird_f_ok() { + if (! ird_ignore) { + + ird_f = 0.0; + + for (byte i = 0; i < IR_REPEAT_COUNT; i++) { + ird_f = ird_f + analogRead(IRD_FRONT_PIN) * readvcc() / 1024; + } + ird_f = ird_f / IR_REPEAT_COUNT; + + if (ird_f <= IRD_F_MAX) { + return true; + } else { + return false; + } + + } else return true; +} + +boolean ird_r_ok() { + if (! ird_ignore) { + + ird_r = 0.0; + + for (byte i = 0; i < IR_REPEAT_COUNT; i++) { + ird_r = ird_r + analogRead(IRD_REAR_PIN) * readvcc() / 1024; + } + ird_r = ird_r / IR_REPEAT_COUNT; + + if (ird_r <= IRD_R_MAX) { + return true; + } else { + return false; + } + + } else return true; +} + +boolean ira_f_ok() { + if (! ira_ignore) { + + ira_f = 0.0; + + for (byte i = 0; i < IR_REPEAT_COUNT; i++) { + ira_f = ira_f + analogRead(IRA_FRONT_PIN) * readvcc() / 1024; + } + ira_f = ira_f / IR_REPEAT_COUNT; + + if (ira_f >= IRA_F_MIN) { + return true; + } else { + return false; + } + + } else return true; +} + +boolean ira_r_ok() { + if (! ira_ignore) { + + ira_r = 0.0; + + for (byte i = 0; i < IR_REPEAT_COUNT; i++) { + ira_r = ira_r + analogRead(IRA_REAR_PIN) * readvcc() / 1024; + } + ira_r = ira_r / IR_REPEAT_COUNT; + + if (ira_r >= IRA_R_MIN) { + return true; + } else { + return false; + } + + } else return true; +} + +void stopMove() { + pfDrive.single_pwm(RED, PWM_BRK); + pfDrive.single_pwm(RED, PWM_BRK); + pfDrive.single_pwm(RED, PWM_BRK); +} + +void moveControl(byte flg, byte cmd) { + if (flg == MOVE_FLAG) { + if (cmd >= MOVE_FWD1 && cmd <= MOVE_FWD7) { + if (! ira_f_ok()) { + stopMove(); + moveResponse(BLK_RSP); + return; + } + if (! ird_f_ok()) { + stopMove(); + moveResponse(BLK_RSP); + return; + } + } + + if (cmd >= MOVE_REV7 && cmd <= MOVE_REV1) { + if (! ira_r_ok()) { + stopMove(); + moveResponse(BLK_RSP); + return; + } + if (! ird_r_ok()) { + stopMove(); + moveResponse(BLK_RSP); + return; + } + } + } + + switch (cmd) { + // Moving + case MOVE_FLOAT: + pfDrive.single_pwm(RED, PWM_FLT); + break; + case MOVE_FWD1: + pfDrive.single_pwm(RED, PWM_FWD1); + break; + case MOVE_FWD2: + pfDrive.single_pwm(RED, PWM_FWD2); + break; + case MOVE_FWD3: + pfDrive.single_pwm(RED, PWM_FWD3); + break; + case MOVE_FWD4: + pfDrive.single_pwm(RED, PWM_FWD4); + break; + case MOVE_FWD5: + pfDrive.single_pwm(RED, PWM_FWD5); + break; + case MOVE_FWD6: + pfDrive.single_pwm(RED, PWM_FWD6); + break; + case MOVE_FWD7: + pfDrive.single_pwm(RED, PWM_FWD7); + break; + case MOVE_BREAK: + pfDrive.single_pwm(RED, PWM_BRK); + break; + case MOVE_REV1: + pfDrive.single_pwm(RED, PWM_REV1); + break; + case MOVE_REV2: + pfDrive.single_pwm(RED, PWM_REV2); + break; + case MOVE_REV3: + pfDrive.single_pwm(RED, PWM_REV3); + break; + case MOVE_REV4: + pfDrive.single_pwm(RED, PWM_REV4); + break; + case MOVE_REV5: + pfDrive.single_pwm(RED, PWM_REV5); + break; + case MOVE_REV6: + pfDrive.single_pwm(RED, PWM_REV6); + break; + case MOVE_REV7: + pfDrive.single_pwm(RED, PWM_REV7); + break; + + // Steering + case STEER_CENTER: + pfDrive.single_pwm(BLUE, PWM_FLT); + frControl(cmd); + break; + case STEER_LEFT1: + pfDrive.single_pwm(BLUE, PWM_FWD1); + frControl(cmd); + break; + case STEER_LEFT2: + pfDrive.single_pwm(BLUE, PWM_FWD2); + frControl(cmd); + break; + case STEER_LEFT3: + pfDrive.single_pwm(BLUE, PWM_FWD3); + frControl(cmd); + break; + case STEER_LEFT4: + pfDrive.single_pwm(BLUE, PWM_FWD4); + frControl(cmd); + break; + case STEER_LEFT5: + pfDrive.single_pwm(BLUE, PWM_FWD5); + frControl(cmd); + break; + case STEER_LEFT6: + pfDrive.single_pwm(BLUE, PWM_FWD6); + frControl(cmd); + break; + case STEER_LEFT7: + pfDrive.single_pwm(BLUE, PWM_FWD7); + frControl(cmd); + break; + case STEER_FIX_CENTER: + pfDrive.single_pwm(BLUE, PWM_BRK); + frControl(cmd); + break; + case STEER_RIGHT1: + pfDrive.single_pwm(BLUE, PWM_REV1); + frControl(cmd); + break; + case STEER_RIGHT2: + pfDrive.single_pwm(BLUE, PWM_REV2); + frControl(cmd); + break; + case STEER_RIGHT3: + pfDrive.single_pwm(BLUE, PWM_REV3); + frControl(cmd); + break; + case STEER_RIGHT4: + pfDrive.single_pwm(BLUE, PWM_REV4); + frControl(cmd); + break; + case STEER_RIGHT5: + pfDrive.single_pwm(BLUE, PWM_REV5); + frControl(cmd); + break; + case STEER_RIGHT6: + pfDrive.single_pwm(BLUE, PWM_REV6); + frControl(cmd); + break; + case STEER_RIGHT7: + pfDrive.single_pwm(BLUE, PWM_REV7); + frControl(cmd); + break; + default: + moveResponse(NO_RSP); + return; + break; + } + // Send response + moveResponse(); +} + +void frControl(byte cmd) { + if (! frBlock) { + if (! servF.attached()) servF.attach(SF_PIN); + if (! servR.attached()) servR.attach(SR_PIN); + + switch (cmd) { + case STEER_CENTER: + servF.write(SF_CENTER); + servR.write(SR_CENTER); + break; + case STEER_LEFT1: + servF.write(SF_CENTER - FR_STEP * 1); + servR.write(SR_CENTER + FR_STEP * 1); + break; + case STEER_LEFT2: + servF.write(SF_CENTER - FR_STEP * 2); + servR.write(SR_CENTER + FR_STEP * 2); + break; + case STEER_LEFT3: + servF.write(SF_CENTER - FR_STEP * 3); + servR.write(SR_CENTER + FR_STEP * 3); + break; + case STEER_LEFT4: + servF.write(SF_CENTER - FR_STEP * 4); + servR.write(SR_CENTER + FR_STEP * 4); + break; + case STEER_LEFT5: + servF.write(SF_CENTER - FR_STEP * 5); + servR.write(SR_CENTER + FR_STEP * 5); + break; + case STEER_LEFT6: + servF.write(SF_CENTER - FR_STEP * 6); + servR.write(SR_CENTER + FR_STEP * 6); + break; + case STEER_LEFT7: + servF.write(SF_CENTER - FR_STEP * 7); + servR.write(SR_CENTER + FR_STEP * 7); + break; + case STEER_FIX_CENTER: + servF.write(SF_CENTER); + servR.write(SR_CENTER); + break; + case STEER_RIGHT1: + servF.write(SF_CENTER + FR_STEP * 1); + servR.write(SR_CENTER - FR_STEP * 1); + break; + case STEER_RIGHT2: + servF.write(SF_CENTER + FR_STEP * 2); + servR.write(SR_CENTER - FR_STEP * 2); + break; + case STEER_RIGHT3: + servF.write(SF_CENTER + FR_STEP * 3); + servR.write(SR_CENTER - FR_STEP * 3); + break; + case STEER_RIGHT4: + servF.write(SF_CENTER + FR_STEP * 4); + servR.write(SR_CENTER - FR_STEP * 4); + break; + case STEER_RIGHT5: + servF.write(SF_CENTER + FR_STEP * 5); + servR.write(SR_CENTER - FR_STEP * 5); + break; + case STEER_RIGHT6: + servF.write(SF_CENTER + FR_STEP * 6); + servR.write(SR_CENTER - FR_STEP * 6); + break; + case STEER_RIGHT7: + servF.write(SF_CENTER + FR_STEP * 7); + servR.write(SR_CENTER - FR_STEP * 7); + break; + default: + servF.write(SF_CENTER); + servR.write(SR_CENTER); + break; + } + } +} + +// Get the internal temperature of the arduino +double getInternalTemp(void) { + unsigned int wADC; + double t; + ADMUX = (_BV(REFS1) | _BV(REFS0) | _BV(MUX3)); + ADCSRA |= _BV(ADEN); // enable the ADC + delay(20); // wait for voltages to become stable. + ADCSRA |= _BV(ADSC); // Start the ADC + while (bit_is_set(ADCSRA,ADSC)); + wADC = ADCW; + t = (wADC - 324.31 ) / 1.22; + return (t); +} + +float readvcc() { + float tmp = 0.0; + + // Read 1.1V reference against Avcc + // set the reference to vcc and the measurement to the internal 1.1V reference + #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) + ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); + #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) + ADMUX = _BV(MUX5) | _BV(MUX0); + #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) + ADMUX = _BV(MUX3) | _BV(MUX2); + #else + // works on an Arduino 168 or 328 + ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); + #endif + + delay(3); // Wait for Vref to settle + ADCSRA |= _BV(ADSC); // Start conversion + while (bit_is_set(ADCSRA,ADSC)); // measuring + + uint8_t low = ADCL; // must read ADCL first - it then locks ADCH + uint8_t high = ADCH; // unlocks both + + tmp = (high<<8) | low; + tmp = (typVbg * 1023.0) / tmp; + + return tmp; +} diff --git a/reset-hxlcd b/reset-hxlcd new file mode 100755 index 0000000..930a815 --- /dev/null +++ b/reset-hxlcd @@ -0,0 +1,28 @@ +#!/bin/sh +# You need to have installed Wiring Pi library to be able +# to use this script +# see http://wiringpi.com/download-and-install/ + +# define GPIO number where RESET line (DTR) is connected to +# here GPIO 18 +io=24 + +# Set IO pin to output +gpio -g mode $io out + +# Set IO pin to LOW (bring reset to GND) +echo -n "Resetting with GPIO"$io"..." + +gpio -g write $io 0 + +# wait little time +sleep 1 + +# Set IO pin to HIGH (release reset to VDD) +gpio -g write $io 1 +echo "done" + +# Optionnal, you can just after reset launch a +# serial connection to Arduino +# uncomment the following line to do it +#picocom -b 115200 --imap lfcrlf /dev/ttyS0 diff --git a/reset-hxpower b/reset-hxpower new file mode 100755 index 0000000..8894b44 --- /dev/null +++ b/reset-hxpower @@ -0,0 +1,27 @@ +#!/bin/sh +# You need to have installed Wiring Pi library to be able +# to use this script +# see http://wiringpi.com/download-and-install/ + +# define GPIO number where RESET line (DTR) is connected to +# here GPIO 18 +io=25 + +# Set IO pin to output +gpio -g mode $io out + +# Set IO pin to LOW (bring reset to GND) +echo -n "Resetting with GPIO"$io"..." +gpio -g write $io 0 + +# wait little time +sleep 1 + +# Set IO pin to HIGH (release reset to VDD) +gpio -g write $io 1 +echo "done" + +# Optionnal, you can just after reset launch a +# serial connection to Arduino +# uncomment the following line to do it +#picocom -b 115200 --imap lfcrlf /dev/ttyS0 diff --git a/reset-reflex b/reset-reflex new file mode 100755 index 0000000..3a6de87 --- /dev/null +++ b/reset-reflex @@ -0,0 +1,27 @@ +#!/bin/sh +# You need to have installed Wiring Pi library to be able +# to use this script +# see http://wiringpi.com/download-and-install/ + +# define GPIO number where RESET line (DTR) is connected to +# here GPIO 18 +io=18 + +# Set IO pin to output +gpio -g mode $io out + +# Set IO pin to LOW (bring reset to GND) +echo -n "Resetting with GPIO"$io"..." +gpio -g write $io 0 + +# wait little time +sleep 1 + +# Set IO pin to HIGH (release reset to VDD) +gpio -g write $io 1 +echo "done" + +# Optionnal, you can just after reset launch a +# serial connection to Arduino +# uncomment the following line to do it +#picocom -b 115200 --imap lfcrlf /dev/ttyS0