diff --git a/tools/nano/AhoyUL/_libs2/com_handling.py b/tools/nano/AhoyUL/_libs2/com_handling.py index ef781d46..62d93fc0 100644 --- a/tools/nano/AhoyUL/_libs2/com_handling.py +++ b/tools/nano/AhoyUL/_libs2/com_handling.py @@ -12,13 +12,13 @@ import _libs2.file_handling as fh #some global variables -__version_info__ = ('2022', '11', '13') +__version_info__ = ('2022', '12', '19') __version_string__ = '%40s' % ('hm inverter handling version: ' + '-'.join(__version_info__)) lck2 = threading.Lock() # used for AT-commands to access serial port com_stop = True -promt = '/> ' -respo = '<< ' -sendi = '>> ' +PROMT = '/> ' +RESPO= '<< ' +SENDI = '>> ' def get_version(): @@ -48,21 +48,23 @@ class AsyncComRead(threading.Thread): line = line.replace('\n','').replace('\r','') if len(line) > 2: # filter out empty lines if self.addTS: - urc.append('\n%s%s%s' % (timestamp(0), respo, line)) + urc.append('\n%s%s%s' % (timestamp(0), RESPO, line)) else: - urc.append('\n%s%s' % (respo, line)) + urc.append('\n%s%s' % (RESPO, line)) #todo: return values into callback function if not self.com.is_open or com_stop: break if urc: + print('\r', end='', flush=True) # return to line-start fh.my_print('\n%s' % ( (' '.join(urc)).replace('\n ', '\n') )) - urc_millis = millis_since(0) - urc_ln = False + # urc_millis = millis_since(0) + # urc_ln = False + print('\n%s' % (PROMT,), end = '') # print promt - if (not urc_ln) and (millis_since(urc_millis) >= 3000): - urc_ln = True - print('\n%s' % (promt,), end = '') + # if (not urc_ln) and (millis_since(urc_millis) >= 3000): + # urc_ln = True + # print('\n%s' % (PROMT,), end = '') time.sleep(0.1) if self.debug: print('\n +++ Thread: com reader stopped', end='', flush=True) @@ -121,8 +123,8 @@ def simple_terminal(_com, _debug): next = True while(next): time.sleep(1.0) - _cmd_in = input('\n%s'%(promt,)) - fh.my_print('\n%s%s' % (promt, _cmd_in, )) + _cmd_in = input('%s'%(PROMT,)) + fh.my_print('\n%s%s' % (PROMT, _cmd_in, ), False) if "start" in _cmd_in: #end terminal and return true @@ -133,12 +135,12 @@ def simple_terminal(_com, _debug): elif '_time' in _cmd_in or '_tnow' in _cmd_in: _uartstr = 't{:d}'.format(int(time.time())) _com.write( _uartstr.encode('ascii') ) - fh.my_print('\n%s%s%s' % (timestamp(0), sendi, _uartstr, )) + fh.my_print('\n%s%s%s' % (timestamp(0), SENDI, _uartstr, )) continue _uartstr = _cmd_in.encode('ascii') - _com.write( ('%s%s' % (sendi, _uartstr, )).encode('ascii') ) - fh.my_print('\n%s%s%s' % (timestamp(0), sendi, _uartstr, )) + _com.write( ('%s%s' % (SENDI, _uartstr, )).encode('ascii') ) + fh.my_print('\n%s%s%s' % (timestamp(0), SENDI, _uartstr, )) return True diff --git a/tools/nano/AhoyUL/_libs2/file_handling.py b/tools/nano/AhoyUL/_libs2/file_handling.py index c841d044..bf53db08 100644 --- a/tools/nano/AhoyUL/_libs2/file_handling.py +++ b/tools/nano/AhoyUL/_libs2/file_handling.py @@ -11,7 +11,7 @@ import binascii #some global variables -__version_info__ = ('2022', '11', '13') +__version_info__ = ('2022', '12', '19') __version_string__ = 'file handling version: ' + '-'.join(__version_info__) lck = threading.Lock() # used for log_sum writing log_sum = 'logstart... ' @@ -29,10 +29,11 @@ def get_log_stop(): return log_stop -def my_print(out): +def my_print(out, _local_print=True): global lck global log_sum - print(out, end='', flush=True) + if (_local_print): + print(out, end='', flush=True) with lck: log_sum += out diff --git a/tools/nano/AhoyUL/src/hmRadio.h b/tools/nano/AhoyUL/src/hmRadio.h index 7407dcc4..d86e4c89 100644 --- a/tools/nano/AhoyUL/src/hmRadio.h +++ b/tools/nano/AhoyUL/src/hmRadio.h @@ -328,6 +328,7 @@ class HmRadio { DHEX(buf[i]); if (i % 10 == 0) DBGPRINT(" "); } // end for() + DBGPRINTLN(F("")); } /** @@ -338,7 +339,6 @@ class HmRadio { if (_thisdebug <= DEBUG_LEVEL) { dumpBuf(info, buf, len); } // end if(debug) - // DBGPRINTLN(""); } bool isChipConnected(void) { @@ -350,7 +350,8 @@ class HmRadio { bool mSerialDebug; /** - * send the buf content to the tx-channel, the rx-channel is switched to two higher index + * send the buf content to the tx-channel, the rx-channel is switched to two higher index or can be given additionally + * packet_t was extended by rf-channel, here used for tx-channel */ uint8_t sendPacket_raw(uint8_t *_radio_id, packet_t *_p, uint8_t _rxch) { // void sendPacket_raw(uint64_t _radio_id64, packet_t *_p, uint8_t _rxch) { @@ -358,7 +359,7 @@ class HmRadio { uint8_t _arc = 0; DPRINT(DBG_INFO, F("TXraw Ch")); - if (_p->rfch) _DPRINT(DBG_INFO, F("0")); + if (_p->rfch < 10) _DPRINT(DBG_INFO, F("0")); _DPRINT(DBG_INFO, _p->rfch); _DPRINT(DBG_INFO, F(" ")); _DPRINT(DBG_INFO, _p->plen); diff --git a/tools/nano/AhoyUL/src/main.cpp b/tools/nano/AhoyUL/src/main.cpp index bbdf1c42..aed408ba 100644 --- a/tools/nano/AhoyUL/src/main.cpp +++ b/tools/nano/AhoyUL/src/main.cpp @@ -49,7 +49,8 @@ static bool processPayload(invPayload_t *, config_t *, bool); static uint8_t checkPayload(invPayload_t *); static bool resetPayload(invPayload_t *); // output and decoding -static bool out_uart_smac_resp(invPayload_t *); +static bool out_uart_smac_resp_OK(invPayload_t *); +static bool out_uart_smac_resp_ERR(invPayload_t *); static uint8_t collect_and_return_userPayload(invPayload_t *, uint8_t *, uint8_t); static void decodePayload(uint8_t, uint8_t *, uint8_t, uint32_t, char *, uint8_t, uint16_t); // interrupt handler @@ -82,7 +83,7 @@ static RadioType hmRadio; // static uint8_t radio_id[5]; //todo: use the mPayload[].id field ,this defines the radio-id (domain) of the rf24 transmission, will be derived from inverter id // static uint64_t radio_id64 = 0ULL; -#define DEF_VERSION "\n version 2022-12-15 23:00" +#define DEF_VERSION "\n version 2022-12-19 21:35" #define P(x) (__FlashStringHelper *)(x) // PROGMEM-Makro for variables static const char COMPILE_DATE[] PROGMEM = {__DATE__}; static const char COMPILE_TIME[] PROGMEM = {__TIME__}; @@ -110,7 +111,7 @@ static volatile uint32_t tcmd_millis = 0L; // timer for smac cmd #define ONE_SECOND (1000L) static uint8_t c_loop = 0; -static volatile int sread_len = 0; // UART read length +static volatile int m_sread_len = 0; // UART read length // static volatile bool rxRdy = false; //will be set true on first receive packet during sending interval, reset to false before sending static uint8_t m_inv_ix = 0; static bool payload_used[MAX_NUM_INVERTERS]; @@ -126,7 +127,7 @@ static uint8_t tmp81 = 0; // static uint32_t min_SEND_SYNC_msec = MIN_SEND_INTERVAL_ms; static uint8_t mCountdown_noSignal = SEND_REPEAT; static volatile uint32_t mSendInterval_ms = SEND_NOSIGNAL_SHORT * ONE_SECOND; -static volatile uint32_t polling_req_msec = SEND_INTERVAL * ONE_SECOND; // will be set via serial interface +static volatile uint32_t polling_req_msec = SEND_INTERVAL * ONE_SECOND; // will be set via serial interface static bool iv_devControlReq = false; // this is one kind of requests, see devControlCmds static uint8_t iv_devControlCmd = ActivePowerContr; // for now the only devControlCmd @@ -269,8 +270,8 @@ void loop() { Serial.print(F("\nd")); // simple decoding, can only handle the current active inverter index, maybe erased if new data arrive, switch other inverter via interter indexing in automode settings decodePayload(TX_REQ_INFO + 0x80, user_payload, 42, user_pl_ts, utSer.mStrOutBuf, MAX_STRING_LEN, mPayload[m_inv_ix].invType); - sread_len = utSer.serBlockRead_ms(utSer.mSerBuffer); - doDecode = (bool)utSer.uart_eval_decimal_val(F("decoding "), utSer.mSerBuffer, sread_len, 0, 255, 1); + m_sread_len = utSer.serBlockRead_ms(utSer.mSerBuffer); + doDecode = (bool)utSer.uart_eval_decimal_val(F("decoding "), utSer.mSerBuffer, m_sread_len, 0, 255, 1); break; } // end case d @@ -369,7 +370,7 @@ void loop() { } // end case i case (char)'c': { - // todo: scan all channels for 1bit RDP (RSSI) value and print result + // scans all channels for 1bit RDP (RSSI) value and print result e.g c100 scans in a loop of 100 iterations // Serial.print(F("\nc OK ")); mParams = utSer.getParamsBuf(); tmp8 = utSer.read_uart_cmd_param(mParams); @@ -391,8 +392,8 @@ void loop() { case (char)'m': { // enable/disable show MACmessages via "m0" or "m1" Serial.print(F("\nm")); - sread_len = utSer.serBlockRead_ms(utSer.mSerBuffer); - showMAC = (bool)utSer.uart_eval_decimal_val(F("showMAC "), utSer.mSerBuffer, sread_len, 0, 255, 1); + m_sread_len = utSer.serBlockRead_ms(utSer.mSerBuffer); + showMAC = (bool)utSer.uart_eval_decimal_val(F("showMAC "), utSer.mSerBuffer, m_sread_len, 0, 255, 1); break; } // end case m @@ -446,8 +447,8 @@ void loop() { // set the time sec since Jan-01 1970 (UNIX epoch time) as decimal String value e.g. "t1612345678:" for Feb-03 2021 9:47:58 // timestamp is only used for sending packet timer, but not for the timing of Tx/Rx scheduling etc... // ther is no need of exact timing, it must only increase (change) in REQ_INFO_CMDs - sread_len = utSer.serBlockRead_ms(utSer.getInBuf()); - mTimestamp = utSer.uart_eval_decimal_val(F("time set "), utSer.getInBuf(), sread_len, 10 * 3600, 0xFFFFFFFF, 1); + m_sread_len = utSer.serBlockRead_ms(utSer.getInBuf()); + mTimestamp = utSer.uart_eval_decimal_val(F("time set "), utSer.getInBuf(), m_sread_len, 10 * 3600, 0xFFFFFFFF, 1); break; } // end case t @@ -490,6 +491,7 @@ void loop() { // todo: add queue of cmds or schedule simple device control request for power limit values if (sendNow || (millis() - timer2_millis > mSendInterval_ms)) { timer2_millis = millis(); + smac_send |= showMAC; // DISABLE_IRQ; payload_used[m_inv_ix] = !resetPayload(&mPayload[m_inv_ix]); mPayload[m_inv_ix].isMACPacket = true; @@ -554,8 +556,9 @@ void loop() { if (processPayload(&mPayload[m_inv_ix], &mConfig, true)) { // data valid and complete - if (mPayload[m_inv_ix].isMACPacket && showMAC) { - out_uart_smac_resp(&mPayload[m_inv_ix]); + if (mPayload[m_inv_ix].isMACPacket && smac_send) { + smac_send = false; + out_uart_smac_resp_OK(&mPayload[m_inv_ix]); } payload_used[m_inv_ix] = true; tmp8 = collect_and_return_userPayload(&mPayload[m_inv_ix], &user_payload[0], USER_PAYLOAD_MAXLEN); @@ -572,9 +575,8 @@ void loop() { if (smac_send && (millis() - tcmd_millis > 4000)) { smac_send = false; // shows number of retransmits, if rt>0 some response, but incomplete - Serial.print(F("rmac:rt")); - Serial.print(mPayload[m_inv_ix].retransmits); - Serial.println(F(":ERR")); + out_uart_smac_resp_ERR(&mPayload[m_inv_ix]); + } // end if() } @@ -689,7 +691,7 @@ static uint8_t getNumInv(invPayload_t *_payload, uint8_t _pMAX) { // /** - * clearing of the current inverter data structure, except the ID and typedef + * clearing of the current inverter data structure, except the inv_id and inv_type */ static bool resetPayload(invPayload_t *_payload) { // static uint8_t m_inv_ix; @@ -918,7 +920,7 @@ static uint8_t checkPayload(invPayload_t *_payload) { /** * output of sorted packets with MAC-header, all info included */ -static bool out_uart_smac_resp(invPayload_t *_payload) { +static bool out_uart_smac_resp_OK(invPayload_t *_payload) { Serial.print(F("\nrMAC:ch")); if (_payload->rxChIdx < 10) Serial.print(F("0")); Serial.print(_payload->rxChIdx); @@ -936,6 +938,16 @@ static bool out_uart_smac_resp(invPayload_t *_payload) { return true; } +static bool out_uart_smac_resp_ERR(invPayload_t *_payload) { + Serial.print(F("\nrMAC:ch")); + if (_payload->rxChIdx < 10) Serial.print(F("0")); + Serial.print(_payload->rxChIdx); + Serial.print(F(":{}:rt")); + Serial.print(_payload->retransmits); + Serial.println(F(":ERR")); + return true; +} + /** * output of pure user payload message */