{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import serial\n",
    "import time\n",
    "import datetime\n",
    "import pandas as pd\n",
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "plt.style.use('seaborn-deep')\n",
    "import numpy as np\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Test Notes\n",
    "\n",
    "### Configuration ###\n",
    "\n",
    "* NAL Power: `Internal 12\n",
    "* NAL Serial : `Connected to Laptop`\n",
    "* CPF Power: `On`\n",
    "* CPF Electronics: `In housing`\n",
    "\n",
    "\n",
    "\n",
    "### Log ###\n",
    "* `2019-04-11T12:18`: Running from the laptop for the same config as test O, just a different power supply\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "def print_msg(filename, in_msg):\n",
    "    if len(in_msg.decode('utf-8').rstrip()) is 0: \n",
    "        return\n",
    "    now = datetime.datetime.now()\n",
    "    line = f\"MSG {now.strftime('%Y%m%d')} {now.strftime('%H%M%S')} {in_msg.decode('utf-8').rstrip()}\\n\"\n",
    "    with open(filename, 'a') as f:\n",
    "        f.write(line)\n",
    "        print(line.rstrip())\n",
    "        \n",
    "\n",
    "def print_csq(filename, in_msg):\n",
    "    if len(in_msg.decode('utf-8').rstrip()) is 0: \n",
    "        return\n",
    "    now = datetime.datetime.now()\n",
    "    line = f\"CSQ {now.strftime('%Y%m%d')} {now.strftime('%H%M%S')} {in_msg[5:6].decode('utf-8').rstrip()}\\n\"\n",
    "    with open(filename,'a') as f:\n",
    "        f.write(line)\n",
    "        print(line.rstrip())\n",
    "\n",
    "def print_cier(filename, in_msg):\n",
    "    if len(in_msg.decode('utf-8').rstrip()) is 0: \n",
    "        return\n",
    "    now = datetime.datetime.now()\n",
    "    line = f\"CIEV {now.strftime('%Y%m%d')} {now.strftime('%H%M%S')} {in_msg[8:9].decode('utf-8').rstrip()}\\n\"\n",
    "    with open(filename,'a') as f:\n",
    "        f.write(line)\n",
    "        print(line.rstrip())\n",
    "\n",
    "def serial_state_machine():\n",
    "    with serial.Serial('COM4', \n",
    "                       baudrate=19200,\n",
    "                       bytesize=serial.EIGHTBITS, \n",
    "                       stopbits=serial.STOPBITS_ONE, \n",
    "                       parity=serial.PARITY_NONE, \n",
    "                       timeout=10) as ser:\n",
    "        \n",
    "        #Response Encodings\n",
    "        got_ok = False;\n",
    "        got_connect = False;\n",
    "        got_csq = False;\n",
    "        got_no_carrier = False;\n",
    "        got_msq = False;\n",
    "        got_prompt = False;\n",
    "        state_entry = True;\n",
    "        filename = datetime.datetime.now().strftime(\"%Y%m%dT%H%M%S_csqlog.txt\")  \n",
    "                \n",
    "        #BEGIN STATE MACHINE\n",
    "        \n",
    "        STATE = 0\n",
    "        ATTEMPTS = 0\n",
    "        while STATE >= 0:\n",
    "            in_message = ser.readline()\n",
    "            \n",
    "            try:\n",
    "                if len(in_message)>0:\n",
    "                    in_message.decode('utf-8')\n",
    "                    got_msg = True if len(in_message.decode('utf-8').rstrip()) > 0 else False\n",
    "                else:\n",
    "                    got_msg = False\n",
    "            \n",
    "            except:\n",
    "                got_msg = False\n",
    "            \n",
    "            \n",
    "            #categorize message\n",
    "            if got_msg is True:\n",
    "                print(in_message)\n",
    "                print_msg(filename, in_message)\n",
    "                got_ok = True if in_message[0:2] == b'OK' else False\n",
    "                got_connect = True if in_message[0:7] == b'CONNECT' else False\n",
    "                got_csq = True if in_message[0:5] == b'+CSQ:' else False\n",
    "                got_no_carrier = True if in_message[0:10] == b'NO CARRIER' else False\n",
    "                got_busy = True if in_message[0:4] == b'BUSY' else False\n",
    "                \n",
    "                got_prompt = True if in_message[0:2] == b'$:' else False\n",
    "            \n",
    "                # Message Actions\n",
    "                if got_no_carrier or got_busy:\n",
    "                    STATE = 3\n",
    "                    print_msg(filename, b'NO CARRIER RXD\\r')\n",
    "                    state_entry = True\n",
    "                if got_connect: \n",
    "                    STATE = 5\n",
    "                    \n",
    "                    print_msg(filename, b'UNIT CONNECTED\\r')\n",
    "                    state_entry = True\n",
    "                if got_csq:\n",
    "                    print_csq(filename, in_message)\n",
    "                    time.sleep(1)\n",
    "                    STATE = 4\n",
    "                    state_entry= True\n",
    "                    continue\n",
    "\n",
    "            \n",
    "            # States Actions\n",
    "            print(f'STATE is {STATE}')\n",
    "            #Send no echo\n",
    "            if STATE is 0:\n",
    "            \n",
    "                print_msg(filename, b'SEND NO ECHO\\r')\n",
    "                filename = datetime.datetime.now().strftime(\"%Y%m%dT%H%M%S_csqlog.txt\")  \n",
    "                out_message = ser.write(b'ATEN\\r')\n",
    "                STATE += 1\n",
    "                continue\n",
    "                \n",
    "            #send call service bearer type\n",
    "            if STATE is 1:\n",
    "                print_msg(filename, b'SEND CBST\\r')\n",
    "                out_message = ser.write(b'AT+CBST=71,0,1\\r')\n",
    "                STATE +=1\n",
    "                continue\n",
    "            \n",
    "            #stop unsolicited messages\n",
    "            if STATE is 2:\n",
    "                print_msg(filename, b'SEND CIER 0\\r')\n",
    "                out_message = ser.write(b'AT+CIER=0,1,0\\r')\n",
    "                STATE +=1\n",
    "                state_entry = True\n",
    "                time.sleep(3)\n",
    "                continue\n",
    "            \n",
    "            #query csq\n",
    "            if STATE is 3:\n",
    "                if state_entry:\n",
    "                    csq_attempt = 0\n",
    "                    print_msg(filename, b'SEND CSQ\\r')\n",
    "                    out_message = ser.write(b'AT+CSQ\\r')\n",
    "                    state_entry = False       \n",
    "                csq_attempt += 1\n",
    "                if csq_attempt > 3:\n",
    "                    state_entry = True;\n",
    "                continue\n",
    "                \n",
    "                \n",
    "            \n",
    "            #Make the call\n",
    "            if STATE is 4:\n",
    "                if state_entry:\n",
    "                    print_msg(filename, b'DIALING\\r')\n",
    "                    out_message = ser.write(b'ATD00881600005391\\r')\n",
    "                    ATTEMPTS += 1\n",
    "                    count = 0\n",
    "                    state_entry = False\n",
    "                    continue\n",
    "                    \n",
    "            #Send a message if it connects\n",
    "            if STATE is 5:\n",
    "                count += 1\n",
    "                print_msg(filename, b'BROADCAST\\r')\n",
    "                \n",
    "                out_message = ser.write(f'broadcast I am number {count}\\r'.encode('utf-8'))\n",
    "                    \n",
    "        \n",
    "        \n",
    "        \n",
    "def serial_exchange(num_tries=10):\n",
    "    MAX_RETRIES = 1\n",
    "    with serial.Serial('COM4', \n",
    "                       baudrate=19200,\n",
    "                       bytesize=serial.EIGHTBITS, \n",
    "                       stopbits=serial.STOPBITS_ONE, \n",
    "                       parity=serial.PARITY_NONE, \n",
    "                       timeout=5) as ser:\n",
    "        \n",
    "        filename = datetime.datetime.now().strftime(\"%Y%m%dT%H%M%S_csqlog.txt\")  \n",
    "        out_message = ser.write(b'ATEN\\r')\n",
    "        in_message = ser.readline()\n",
    "        print_msg(filename, in_message)\n",
    "        in_message = ser.readline()\n",
    "        print_msg(filename, in_message)\n",
    "        \n",
    "        out_message = ser.write(b'AT+CIER=1,1,0\\r')\n",
    "        in_message = ser.readline()\n",
    "        print_msg(filename, in_message)\n",
    "        in_message = ser.readline()\n",
    "        print_msg(filename, in_message)\n",
    "        \n",
    "        #Get a bunch of CSQs\n",
    "        last_len = 0;\n",
    "        req_new_csq = True\n",
    "        df = pd.DataFrame(columns=['date','csq', 'cier'])\n",
    "        \n",
    "        \n",
    "        while True:\n",
    "          \n",
    "            if req_new_csq is True:\n",
    "                ser.write(b'AT+CSQ\\r')\n",
    "                req_new_csq = False\n",
    "                num_tries -= 1\n",
    "          \n",
    "            in_message = ser.readline()\n",
    "            print_msg(filename, in_message)\n",
    "          \n",
    "            if len(in_message) is 0: \n",
    "                last_len+=1\n",
    "            else:\n",
    "                last_len = 0\n",
    "            #figure out if its a CSQ or CIEV:0 message\n",
    "            if len(in_message) >= 4:\n",
    "                if in_message[0:5] == b'+CSQ:':\n",
    "                    print_csq(filename, in_message)\n",
    "                    now = datetime.datetime.now()\n",
    "                    row = {'date':now,'csq':int(in_message[5:6].decode('utf-8'))}\n",
    "                    df = df.append(row, ignore_index=True)\n",
    "                    df.to_csv(filename[:-3]+'csv',index=False)\n",
    "                    req_new_csq = True;\n",
    "                if in_message[0:8] == b'+CIEV:0,':\n",
    "                    print_cier(filename, in_message)\n",
    "                    now = datetime.datetime.now()\n",
    "                    row = {'date':now,'cier':int(in_message[8:9].decode('utf-8'))}\n",
    "                    df = df.append(row, ignore_index=True)\n",
    "                    df.to_csv(filename[:-3]+'csv',index=False)\n",
    "                    \n",
    "                    \n",
    "            if last_len > MAX_RETRIES:\n",
    "                break;\n",
    "            if num_tries < 0: \n",
    "                break;\n",
    "        \n",
    "        return df\n",
    "        "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "STATE is 0\n",
      "MSG 20190415 094503 SEND NO ECHO\n",
      "b'ATEN\\r\\r\\n'\n",
      "MSG 20190415 094503 ATEN\n",
      "STATE is 1\n",
      "MSG 20190415 094503 SEND CBST\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 094503 OK\n",
      "STATE is 2\n",
      "MSG 20190415 094503 SEND CIER 0\n",
      "STATE is 3\n",
      "MSG 20190415 094506 SEND CSQ\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 094506 OK\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 094506 OK\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "MSG 20190415 094513 SEND CSQ\n",
      "b'+CSQ:3\\r\\n'\n",
      "MSG 20190415 094513 +CSQ:3\n",
      "CSQ 20190415 094513 3\n",
      "STATE is 4\n",
      "MSG 20190415 094514 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 094514 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'+CSQ:3\\r\\n'\n",
      "MSG 20190415 094518 +CSQ:3\n",
      "CSQ 20190415 094518 3\n",
      "STATE is 4\n",
      "MSG 20190415 094519 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 094519 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'CONNECT 19200\\r\\n'\n",
      "MSG 20190415 094540 CONNECT 19200\n",
      "MSG 20190415 094540 UNIT CONNECTED\n",
      "STATE is 5\n",
      "MSG 20190415 094540 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 094554 :$\n",
      "STATE is 5\n",
      "MSG 20190415 094554 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 094606 :$\n",
      "STATE is 5\n",
      "MSG 20190415 094606 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 094617 :$\n",
      "STATE is 5\n",
      "MSG 20190415 094617 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 094629 :$\n",
      "STATE is 5\n",
      "MSG 20190415 094629 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 094641 :$\n",
      "STATE is 5\n",
      "MSG 20190415 094641 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 094652 :$\n",
      "STATE is 5\n",
      "MSG 20190415 094652 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 094704 :$\n",
      "STATE is 5\n",
      "MSG 20190415 094704 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 094715 :$\n",
      "STATE is 5\n",
      "MSG 20190415 094715 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 094727 :$\n",
      "STATE is 5\n",
      "MSG 20190415 094727 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 094738 :$\n",
      "STATE is 5\n",
      "MSG 20190415 094738 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 094749 :$\n",
      "STATE is 5\n",
      "MSG 20190415 094749 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 094759 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 094805 BROADCAST\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 094805 NO CARRIER\n",
      "MSG 20190415 094805 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 094805 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:5\\r\\n'\n",
      "MSG 20190415 094809 +CSQ:5\n",
      "CSQ 20190415 094809 5\n",
      "STATE is 4\n",
      "MSG 20190415 094810 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 094810 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'CONNECT 19200\\r\\n'\n",
      "MSG 20190415 094819 CONNECT 19200\n",
      "MSG 20190415 094819 UNIT CONNECTED\n",
      "STATE is 5\n",
      "MSG 20190415 094819 BROADCAST\n",
      "b'Welcome to the CPF Server \\n'\n",
      "MSG 20190415 094820 Welcome to the CPF Server\n",
      "STATE is 5\n",
      "MSG 20190415 094820 BROADCAST\n",
      "b'\\r:$ :$ '\n",
      ":$ :$0190415 094832 \n",
      "STATE is 5\n",
      "MSG 20190415 094832 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 094843 :$\n",
      "STATE is 5\n",
      "MSG 20190415 094843 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 094900 :$\n",
      "STATE is 5\n",
      "MSG 20190415 094900 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 094918 :$\n",
      "STATE is 5\n",
      "MSG 20190415 094918 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 094930 :$\n",
      "STATE is 5\n",
      "MSG 20190415 094930 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 094949 :$\n",
      "STATE is 5\n",
      "MSG 20190415 094949 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 094959 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 095002 BROADCAST\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 095002 NO CARRIER\n",
      "MSG 20190415 095002 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 095002 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:3\\r\\n'\n",
      "MSG 20190415 095006 +CSQ:3\n",
      "CSQ 20190415 095006 3\n",
      "STATE is 4\n",
      "MSG 20190415 095007 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 095007 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 095025 NO CARRIER\n",
      "MSG 20190415 095025 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 095025 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:5\\r\\n'\n",
      "MSG 20190415 095029 +CSQ:5\n",
      "CSQ 20190415 095029 5\n",
      "STATE is 4\n",
      "MSG 20190415 095030 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 095030 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 095043 NO CARRIER\n",
      "MSG 20190415 095043 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 095043 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:5\\r\\n'\n",
      "MSG 20190415 095047 +CSQ:5\n",
      "CSQ 20190415 095047 5\n",
      "STATE is 4\n",
      "MSG 20190415 095048 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 095048 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 095106 NO CARRIER\n",
      "MSG 20190415 095106 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 095106 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:2\\r\\n'\n",
      "MSG 20190415 095111 +CSQ:2\n",
      "CSQ 20190415 095111 2\n",
      "STATE is 4\n",
      "MSG 20190415 095112 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 095112 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'CONNECT 19200\\r\\n'\n",
      "MSG 20190415 095120 CONNECT 19200\n",
      "MSG 20190415 095120 UNIT CONNECTED\n",
      "STATE is 5\n",
      "MSG 20190415 095120 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 095130 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 095140 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 095150 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 095152 BROADCAST\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 095152 NO CARRIER\n",
      "MSG 20190415 095152 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 095152 SEND CSQ\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "MSG 20190415 095232 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:3\\r\\n'\n",
      "MSG 20190415 095238 +CSQ:3\n",
      "CSQ 20190415 095238 3\n",
      "STATE is 4\n",
      "MSG 20190415 095239 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 095239 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 095252 NO CARRIER\n",
      "MSG 20190415 095252 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 095252 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:2\\r\\n'\n",
      "MSG 20190415 095257 +CSQ:2\n",
      "CSQ 20190415 095257 2\n",
      "STATE is 4\n",
      "MSG 20190415 095258 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 095258 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 095315 NO CARRIER\n",
      "MSG 20190415 095315 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 095315 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:5\\r\\n'\n",
      "MSG 20190415 095320 +CSQ:5\n",
      "CSQ 20190415 095320 5\n",
      "STATE is 4\n",
      "MSG 20190415 095321 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 095321 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 095333 NO CARRIER\n",
      "MSG 20190415 095333 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 095333 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:5\\r\\n'\n",
      "MSG 20190415 095337 +CSQ:5\n",
      "CSQ 20190415 095337 5\n",
      "STATE is 4\n",
      "MSG 20190415 095338 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 095338 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 095350 NO CARRIER\n",
      "MSG 20190415 095350 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 095350 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:5\\r\\n'\n",
      "MSG 20190415 095354 +CSQ:5\n",
      "CSQ 20190415 095354 5\n",
      "STATE is 4\n",
      "MSG 20190415 095355 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 095355 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 095407 NO CARRIER\n",
      "MSG 20190415 095407 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 095407 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:5\\r\\n'\n",
      "MSG 20190415 095412 +CSQ:5\n",
      "CSQ 20190415 095412 5\n",
      "STATE is 4\n",
      "MSG 20190415 095413 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 095413 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 095423 NO CARRIER\n",
      "MSG 20190415 095423 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 095423 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:5\\r\\n'\n",
      "MSG 20190415 095428 +CSQ:5\n",
      "CSQ 20190415 095428 5\n",
      "STATE is 4\n",
      "MSG 20190415 095429 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 095429 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 095441 NO CARRIER\n",
      "MSG 20190415 095441 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 095441 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:4\\r\\n'\n",
      "MSG 20190415 095445 +CSQ:4\n",
      "CSQ 20190415 095445 4\n",
      "STATE is 4\n",
      "MSG 20190415 095446 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 095446 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 095458 NO CARRIER\n",
      "MSG 20190415 095458 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 095458 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:5\\r\\n'\n",
      "MSG 20190415 095502 +CSQ:5\n",
      "CSQ 20190415 095502 5\n",
      "STATE is 4\n",
      "MSG 20190415 095503 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 095503 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'CONNECT 19200\\r\\n'\n",
      "MSG 20190415 095514 CONNECT 19200\n",
      "MSG 20190415 095514 UNIT CONNECTED\n",
      "STATE is 5\n",
      "MSG 20190415 095514 BROADCAST\n",
      "b'Welcome to the CPF Server \\n'\n",
      "MSG 20190415 095515 Welcome to the CPF Server\n",
      "STATE is 5\n",
      "MSG 20190415 095515 BROADCAST\n",
      "b'\\r:$ :$ '\n",
      ":$ :$0190415 095526 \n",
      "STATE is 5\n",
      "MSG 20190415 095526 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 095537 :$\n",
      "STATE is 5\n",
      "MSG 20190415 095537 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 095549 :$\n",
      "STATE is 5\n",
      "MSG 20190415 095549 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 095600 :$\n",
      "STATE is 5\n",
      "MSG 20190415 095600 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 095611 :$\n",
      "STATE is 5\n",
      "MSG 20190415 095611 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 095623 :$\n",
      "STATE is 5\n",
      "MSG 20190415 095623 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 095634 :$\n",
      "STATE is 5\n",
      "MSG 20190415 095634 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 095645 :$\n",
      "STATE is 5\n",
      "MSG 20190415 095645 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 095657 :$\n",
      "STATE is 5\n",
      "MSG 20190415 095657 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 095708 :$\n",
      "STATE is 5\n",
      "MSG 20190415 095708 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 095719 :$\n",
      "STATE is 5\n",
      "MSG 20190415 095719 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 095731 :$\n",
      "STATE is 5\n",
      "MSG 20190415 095731 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 095742 :$\n",
      "STATE is 5\n",
      "MSG 20190415 095742 BROADCAST\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "b':$ '\n",
      "MSG 20190415 095757 :$\n",
      "STATE is 5\n",
      "MSG 20190415 095757 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 095810 :$\n",
      "STATE is 5\n",
      "MSG 20190415 095810 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 095822 :$\n",
      "STATE is 5\n",
      "MSG 20190415 095822 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 095833 :$\n",
      "STATE is 5\n",
      "MSG 20190415 095833 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 095845 :$\n",
      "STATE is 5\n",
      "MSG 20190415 095845 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 095856 :$\n",
      "STATE is 5\n",
      "MSG 20190415 095856 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 095907 :$\n",
      "STATE is 5\n",
      "MSG 20190415 095907 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 095918 :$\n",
      "STATE is 5\n",
      "MSG 20190415 095918 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 095930 :$\n",
      "STATE is 5\n",
      "MSG 20190415 095930 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 095941 :$\n",
      "STATE is 5\n",
      "MSG 20190415 095941 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 095953 :$\n",
      "STATE is 5\n",
      "MSG 20190415 095953 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 100004 :$\n",
      "STATE is 5\n",
      "MSG 20190415 100004 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 100020 :$\n",
      "STATE is 5\n",
      "MSG 20190415 100020 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 100032 :$\n",
      "STATE is 5\n",
      "MSG 20190415 100032 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 100042 BROADCAST\n",
      "b':$ :$ '\n",
      "MSG 20190415 100100 :$ :$\n",
      "STATE is 5\n",
      "MSG 20190415 100100 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 100112 :$\n",
      "STATE is 5\n",
      "MSG 20190415 100112 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 100123 :$\n",
      "STATE is 5\n",
      "MSG 20190415 100123 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 100135 :$\n",
      "STATE is 5\n",
      "MSG 20190415 100135 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 100147 :$\n",
      "STATE is 5\n",
      "MSG 20190415 100147 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 100159 :$\n",
      "STATE is 5\n",
      "MSG 20190415 100159 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 100210 :$\n",
      "STATE is 5\n",
      "MSG 20190415 100210 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 100222 :$\n",
      "STATE is 5\n",
      "MSG 20190415 100222 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 100233 :$\n",
      "STATE is 5\n",
      "MSG 20190415 100233 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 100245 :$\n",
      "STATE is 5\n",
      "MSG 20190415 100245 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 100256 :$\n",
      "STATE is 5\n",
      "MSG 20190415 100256 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 100307 :$\n",
      "STATE is 5\n",
      "MSG 20190415 100307 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 100319 :$\n",
      "STATE is 5\n",
      "MSG 20190415 100319 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 100330 :$\n",
      "STATE is 5\n",
      "MSG 20190415 100330 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 100341 :$\n",
      "STATE is 5\n",
      "MSG 20190415 100341 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 100353 :$\n",
      "STATE is 5\n",
      "MSG 20190415 100353 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 100404 :$\n",
      "STATE is 5\n",
      "MSG 20190415 100404 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 100415 :$\n",
      "STATE is 5\n",
      "MSG 20190415 100415 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 100416 BROADCAST\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 100416 NO CARRIER\n",
      "MSG 20190415 100416 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 100416 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:3\\r\\n'\n",
      "MSG 20190415 100420 +CSQ:3\n",
      "CSQ 20190415 100420 3\n",
      "STATE is 4\n",
      "MSG 20190415 100421 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 100421 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'CONNECT 19200\\r\\n'\n",
      "MSG 20190415 100442 CONNECT 19200\n",
      "MSG 20190415 100442 UNIT CONNECTED\n",
      "STATE is 5\n",
      "MSG 20190415 100442 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 100452 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 100502 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 100512 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 100512 BROADCAST\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 100512 NO CARRIER\n",
      "MSG 20190415 100512 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 100512 SEND CSQ\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "MSG 20190415 100552 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:5\\r\\n'\n",
      "MSG 20190415 100557 +CSQ:5\n",
      "CSQ 20190415 100557 5\n",
      "STATE is 4\n",
      "MSG 20190415 100558 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 100558 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 100605 NO CARRIER\n",
      "MSG 20190415 100605 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 100605 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:2\\r\\n'\n",
      "MSG 20190415 100609 +CSQ:2\n",
      "CSQ 20190415 100609 2\n",
      "STATE is 4\n",
      "MSG 20190415 100610 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 100610 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 100622 NO CARRIER\n",
      "MSG 20190415 100622 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 100622 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:2\\r\\n'\n",
      "MSG 20190415 100627 +CSQ:2\n",
      "CSQ 20190415 100627 2\n",
      "STATE is 4\n",
      "MSG 20190415 100628 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 100628 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 100643 NO CARRIER\n",
      "MSG 20190415 100643 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 100643 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:4\\r\\n'\n",
      "MSG 20190415 100648 +CSQ:4\n",
      "CSQ 20190415 100648 4\n",
      "STATE is 4\n",
      "MSG 20190415 100649 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 100649 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 100658 NO CARRIER\n",
      "MSG 20190415 100658 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 100658 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:2\\r\\n'\n",
      "MSG 20190415 100703 +CSQ:2\n",
      "CSQ 20190415 100703 2\n",
      "STATE is 4\n",
      "MSG 20190415 100704 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 100704 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'CONNECT 19200\\r\\n'\n",
      "MSG 20190415 100717 CONNECT 19200\n",
      "MSG 20190415 100717 UNIT CONNECTED\n",
      "STATE is 5\n",
      "MSG 20190415 100717 BROADCAST\n",
      "b'UUUUUUUUUU\\r\\n'\n",
      "MSG 20190415 100718 UUUUUUUUUU\n",
      "STATE is 5\n",
      "MSG 20190415 100718 BROADCAST\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 100718 NO CARRIER\n",
      "MSG 20190415 100718 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 100718 SEND CSQ\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "MSG 20190415 100758 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:3\\r\\n'\n",
      "MSG 20190415 100802 +CSQ:3\n",
      "CSQ 20190415 100802 3\n",
      "STATE is 4\n",
      "MSG 20190415 100803 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 100803 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'CONNECT 19200\\r\\n'\n",
      "MSG 20190415 100822 CONNECT 19200\n",
      "MSG 20190415 100822 UNIT CONNECTED\n",
      "STATE is 5\n",
      "MSG 20190415 100822 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 100832 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 100842 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 100852 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 100853 BROADCAST\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 100853 NO CARRIER\n",
      "MSG 20190415 100853 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 100853 SEND CSQ\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "MSG 20190415 100933 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:2\\r\\n'\n",
      "MSG 20190415 100933 +CSQ:2\n",
      "CSQ 20190415 100933 2\n",
      "STATE is 4\n",
      "MSG 20190415 100934 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 100934 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'CONNECT 19200\\r\\n'\n",
      "MSG 20190415 100942 CONNECT 19200\n",
      "MSG 20190415 100942 UNIT CONNECTED\n",
      "STATE is 5\n",
      "MSG 20190415 100942 BROADCAST\n",
      "b'UUUUUUUUUUU\\r\\n'\n",
      "MSG 20190415 100944 UUUUUUUUUUU\n",
      "STATE is 5\n",
      "MSG 20190415 100944 BROADCAST\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 100944 NO CARRIER\n",
      "MSG 20190415 100944 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 100944 SEND CSQ\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "MSG 20190415 101024 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:5\\r\\n'\n",
      "MSG 20190415 101025 +CSQ:5\n",
      "CSQ 20190415 101025 5\n",
      "STATE is 4\n",
      "MSG 20190415 101026 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 101026 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'CONNECT 19200\\r\\n'\n",
      "MSG 20190415 101034 CONNECT 19200\n",
      "MSG 20190415 101034 UNIT CONNECTED\n",
      "STATE is 5\n",
      "MSG 20190415 101034 BROADCAST\n",
      "b'UUUUUUUUUUUUU\\r\\n'\n",
      "MSG 20190415 101035 UUUUUUUUUUUUU\n",
      "STATE is 5\n",
      "MSG 20190415 101035 BROADCAST\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 101035 NO CARRIER\n",
      "MSG 20190415 101035 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 101035 SEND CSQ\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "MSG 20190415 101115 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:3\\r\\n'\n",
      "MSG 20190415 101121 +CSQ:3\n",
      "CSQ 20190415 101121 3\n",
      "STATE is 4\n",
      "MSG 20190415 101122 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 101122 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 101131 NO CARRIER\n",
      "MSG 20190415 101131 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 101131 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:3\\r\\n'\n",
      "MSG 20190415 101135 +CSQ:3\n",
      "CSQ 20190415 101135 3\n",
      "STATE is 4\n",
      "MSG 20190415 101136 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 101136 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 101140 NO CARRIER\n",
      "MSG 20190415 101140 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 101140 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:4\\r\\n'\n",
      "MSG 20190415 101144 +CSQ:4\n",
      "CSQ 20190415 101144 4\n",
      "STATE is 4\n",
      "MSG 20190415 101145 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 101145 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 101148 NO CARRIER\n",
      "MSG 20190415 101148 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 101148 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:5\\r\\n'\n",
      "MSG 20190415 101153 +CSQ:5\n",
      "CSQ 20190415 101153 5\n",
      "STATE is 4\n",
      "MSG 20190415 101154 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 101154 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 101157 NO CARRIER\n",
      "MSG 20190415 101157 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 101157 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:4\\r\\n'\n",
      "MSG 20190415 101201 +CSQ:4\n",
      "CSQ 20190415 101201 4\n",
      "STATE is 4\n",
      "MSG 20190415 101202 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 101202 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 101206 NO CARRIER\n",
      "MSG 20190415 101206 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 101206 SEND CSQ\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "STATE is 3\n",
      "b'+CSQ:5\\r\\n'\n",
      "MSG 20190415 101210 +CSQ:5\n",
      "CSQ 20190415 101210 5\n",
      "STATE is 4\n",
      "MSG 20190415 101211 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 101211 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 101219 NO CARRIER\n",
      "MSG 20190415 101219 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 101219 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:5\\r\\n'\n",
      "MSG 20190415 101223 +CSQ:5\n",
      "CSQ 20190415 101223 5\n",
      "STATE is 4\n",
      "MSG 20190415 101224 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 101224 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 101234 NO CARRIER\n",
      "MSG 20190415 101234 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 101234 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:4\\r\\n'\n",
      "MSG 20190415 101239 +CSQ:4\n",
      "CSQ 20190415 101239 4\n",
      "STATE is 4\n",
      "MSG 20190415 101240 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 101240 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'CONNECT 19200\\r\\n'\n",
      "MSG 20190415 101302 CONNECT 19200\n",
      "MSG 20190415 101302 UNIT CONNECTED\n",
      "STATE is 5\n",
      "MSG 20190415 101302 BROADCAST\n",
      "b'UUUUUUUUUUU\\r\\n'\n",
      "MSG 20190415 101304 UUUUUUUUUUU\n",
      "STATE is 5\n",
      "MSG 20190415 101304 BROADCAST\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 101304 NO CARRIER\n",
      "MSG 20190415 101304 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 101304 SEND CSQ\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "MSG 20190415 101344 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:5\\r\\n'\n",
      "MSG 20190415 101351 +CSQ:5\n",
      "CSQ 20190415 101351 5\n",
      "STATE is 4\n",
      "MSG 20190415 101352 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 101352 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 101410 NO CARRIER\n",
      "MSG 20190415 101410 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 101410 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:4\\r\\n'\n",
      "MSG 20190415 101414 +CSQ:4\n",
      "CSQ 20190415 101414 4\n",
      "STATE is 4\n",
      "MSG 20190415 101415 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 101415 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 101443 NO CARRIER\n",
      "MSG 20190415 101443 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 101443 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:5\\r\\n'\n",
      "MSG 20190415 101447 +CSQ:5\n",
      "CSQ 20190415 101447 5\n",
      "STATE is 4\n",
      "MSG 20190415 101448 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 101448 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'CONNECT 19200\\r\\n'\n",
      "MSG 20190415 101457 CONNECT 19200\n",
      "MSG 20190415 101457 UNIT CONNECTED\n",
      "STATE is 5\n",
      "MSG 20190415 101457 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 101458 BROADCAST\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 101458 NO CARRIER\n",
      "MSG 20190415 101458 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 101458 SEND CSQ\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "MSG 20190415 101538 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:0\\r\\n'\n",
      "MSG 20190415 101543 +CSQ:0\n",
      "CSQ 20190415 101543 0\n",
      "STATE is 4\n",
      "MSG 20190415 101544 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 101544 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'CONNECT 19200\\r\\n'\n",
      "MSG 20190415 101604 CONNECT 19200\n",
      "MSG 20190415 101604 UNIT CONNECTED\n",
      "STATE is 5\n",
      "MSG 20190415 101604 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 101614 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 101624 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 101634 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 101635 BROADCAST\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 101635 NO CARRIER\n",
      "MSG 20190415 101635 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 101635 SEND CSQ\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "MSG 20190415 101715 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:4\\r\\n'\n",
      "MSG 20190415 101723 +CSQ:4\n",
      "CSQ 20190415 101723 4\n",
      "STATE is 4\n",
      "MSG 20190415 101724 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 101724 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'CONNECT 19200\\r\\n'\n",
      "MSG 20190415 101748 CONNECT 19200\n",
      "MSG 20190415 101748 UNIT CONNECTED\n",
      "STATE is 5\n",
      "MSG 20190415 101748 BROADCAST\n",
      "b'UUUUUUUUUUUU\\r\\n'\n",
      "MSG 20190415 101749 UUUUUUUUUUUU\n",
      "STATE is 5\n",
      "MSG 20190415 101749 BROADCAST\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 101749 NO CARRIER\n",
      "MSG 20190415 101749 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 101749 SEND CSQ\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "MSG 20190415 101829 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:3\\r\\n'\n",
      "MSG 20190415 101837 +CSQ:3\n",
      "CSQ 20190415 101837 3\n",
      "STATE is 4\n",
      "MSG 20190415 101838 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 101838 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 101901 NO CARRIER\n",
      "MSG 20190415 101901 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 101901 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:0\\r\\n'\n",
      "MSG 20190415 101906 +CSQ:0\n",
      "CSQ 20190415 101906 0\n",
      "STATE is 4\n",
      "MSG 20190415 101907 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 101907 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'CONNECT 19200\\r\\n'\n",
      "MSG 20190415 101932 CONNECT 19200\n",
      "MSG 20190415 101932 UNIT CONNECTED\n",
      "STATE is 5\n",
      "MSG 20190415 101932 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 101933 BROADCAST\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 101933 NO CARRIER\n",
      "MSG 20190415 101933 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 101933 SEND CSQ\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "MSG 20190415 102013 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:5\\r\\n'\n",
      "MSG 20190415 102020 +CSQ:5\n",
      "CSQ 20190415 102020 5\n",
      "STATE is 4\n",
      "MSG 20190415 102021 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 102021 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'CONNECT 19200\\r\\n'\n",
      "MSG 20190415 102027 CONNECT 19200\n",
      "MSG 20190415 102027 UNIT CONNECTED\n",
      "STATE is 5\n",
      "MSG 20190415 102027 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 102029 BROADCAST\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 102029 NO CARRIER\n",
      "MSG 20190415 102029 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 102029 SEND CSQ\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "MSG 20190415 102109 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:4\\r\\n'\n",
      "MSG 20190415 102116 +CSQ:4\n",
      "CSQ 20190415 102116 4\n",
      "STATE is 4\n",
      "MSG 20190415 102117 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 102117 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'CONNECT 19200\\r\\n'\n",
      "MSG 20190415 102125 CONNECT 19200\n",
      "MSG 20190415 102125 UNIT CONNECTED\n",
      "STATE is 5\n",
      "MSG 20190415 102125 BROADCAST\n",
      "b'Welcome to the CPF Server \\n'\n",
      "MSG 20190415 102125 Welcome to the CPF Server\n",
      "STATE is 5\n",
      "MSG 20190415 102125 BROADCAST\n",
      "b'\\r:$ :$ '\n",
      ":$ :$0190415 102137 \n",
      "STATE is 5\n",
      "MSG 20190415 102137 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 102148 :$\n",
      "STATE is 5\n",
      "MSG 20190415 102148 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 102200 :$\n",
      "STATE is 5\n",
      "MSG 20190415 102200 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 102211 :$\n",
      "STATE is 5\n",
      "MSG 20190415 102211 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 102222 :$\n",
      "STATE is 5\n",
      "MSG 20190415 102222 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 102234 :$\n",
      "STATE is 5\n",
      "MSG 20190415 102234 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 102245 :$\n",
      "STATE is 5\n",
      "MSG 20190415 102245 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 102256 :$\n",
      "STATE is 5\n",
      "MSG 20190415 102256 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 102308 :$\n",
      "STATE is 5\n",
      "MSG 20190415 102308 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 102316 BROADCAST\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 102316 NO CARRIER\n",
      "MSG 20190415 102316 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 102316 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:2\\r\\n'\n",
      "MSG 20190415 102321 +CSQ:2\n",
      "CSQ 20190415 102321 2\n",
      "STATE is 4\n",
      "MSG 20190415 102322 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 102322 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 102332 NO CARRIER\n",
      "MSG 20190415 102332 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 102332 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:0\\r\\n'\n",
      "MSG 20190415 102336 +CSQ:0\n",
      "CSQ 20190415 102336 0\n",
      "STATE is 4\n",
      "MSG 20190415 102337 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 102337 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'CONNECT 19200\\r\\n'\n",
      "MSG 20190415 102354 CONNECT 19200\n",
      "MSG 20190415 102354 UNIT CONNECTED\n",
      "STATE is 5\n",
      "MSG 20190415 102354 BROADCAST\n",
      "b'Welcome to the CPF Server \\n'\n",
      "MSG 20190415 102354 Welcome to the CPF Server\n",
      "STATE is 5\n",
      "MSG 20190415 102354 BROADCAST\n",
      "b'\\r:$ :$ '\n",
      ":$ :$0190415 102405 \n",
      "STATE is 5\n",
      "MSG 20190415 102405 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 102417 :$\n",
      "STATE is 5\n",
      "MSG 20190415 102417 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 102428 :$\n",
      "STATE is 5\n",
      "MSG 20190415 102428 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 102442 :$\n",
      "STATE is 5\n",
      "MSG 20190415 102442 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 102452 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 102454 BROADCAST\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 102454 NO CARRIER\n",
      "MSG 20190415 102454 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 102454 SEND CSQ\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "MSG 20190415 102534 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:4\\r\\n'\n",
      "MSG 20190415 102540 +CSQ:4\n",
      "CSQ 20190415 102540 4\n",
      "STATE is 4\n",
      "MSG 20190415 102541 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 102541 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 102549 NO CARRIER\n",
      "MSG 20190415 102549 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 102549 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:4\\r\\n'\n",
      "MSG 20190415 102553 +CSQ:4\n",
      "CSQ 20190415 102553 4\n",
      "STATE is 4\n",
      "MSG 20190415 102554 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 102554 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 102607 NO CARRIER\n",
      "MSG 20190415 102607 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 102607 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:2\\r\\n'\n",
      "MSG 20190415 102611 +CSQ:2\n",
      "CSQ 20190415 102611 2\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "STATE is 4\n",
      "MSG 20190415 102612 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 102612 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 102624 NO CARRIER\n",
      "MSG 20190415 102624 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 102624 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:2\\r\\n'\n",
      "MSG 20190415 102628 +CSQ:2\n",
      "CSQ 20190415 102628 2\n",
      "STATE is 4\n",
      "MSG 20190415 102629 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 102629 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'CONNECT 19200\\r\\n'\n",
      "MSG 20190415 102638 CONNECT 19200\n",
      "MSG 20190415 102638 UNIT CONNECTED\n",
      "STATE is 5\n",
      "MSG 20190415 102638 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 102648 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 102658 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 102708 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 102710 BROADCAST\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 102710 NO CARRIER\n",
      "MSG 20190415 102710 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 102710 SEND CSQ\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "MSG 20190415 102750 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:2\\r\\n'\n",
      "MSG 20190415 102756 +CSQ:2\n",
      "CSQ 20190415 102756 2\n",
      "STATE is 4\n",
      "MSG 20190415 102757 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 102757 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 102816 NO CARRIER\n",
      "MSG 20190415 102816 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 102816 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:0\\r\\n'\n",
      "MSG 20190415 102820 +CSQ:0\n",
      "CSQ 20190415 102820 0\n",
      "STATE is 4\n",
      "MSG 20190415 102821 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 102821 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'CONNECT 19200\\r\\n'\n",
      "MSG 20190415 102844 CONNECT 19200\n",
      "MSG 20190415 102844 UNIT CONNECTED\n",
      "STATE is 5\n",
      "MSG 20190415 102844 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 102855 :$\n",
      "STATE is 5\n",
      "MSG 20190415 102855 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 102907 :$\n",
      "STATE is 5\n",
      "MSG 20190415 102907 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 102918 :$\n",
      "STATE is 5\n",
      "MSG 20190415 102918 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 102930 :$\n",
      "STATE is 5\n",
      "MSG 20190415 102930 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 102941 :$\n",
      "STATE is 5\n",
      "MSG 20190415 102941 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 102953 :$\n",
      "STATE is 5\n",
      "MSG 20190415 102953 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 103004 :$\n",
      "STATE is 5\n",
      "MSG 20190415 103004 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 103015 :$\n",
      "STATE is 5\n",
      "MSG 20190415 103015 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 103027 :$\n",
      "STATE is 5\n",
      "MSG 20190415 103027 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 103038 :$\n",
      "STATE is 5\n",
      "MSG 20190415 103038 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 103049 :$\n",
      "STATE is 5\n",
      "MSG 20190415 103049 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 103101 :$\n",
      "STATE is 5\n",
      "MSG 20190415 103101 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 103112 :$\n",
      "STATE is 5\n",
      "MSG 20190415 103112 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 103124 :$\n",
      "STATE is 5\n",
      "MSG 20190415 103124 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 103135 :$\n",
      "STATE is 5\n",
      "MSG 20190415 103135 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 103146 :$\n",
      "STATE is 5\n",
      "MSG 20190415 103146 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 103158 :$\n",
      "STATE is 5\n",
      "MSG 20190415 103158 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 103209 :$\n",
      "STATE is 5\n",
      "MSG 20190415 103209 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 103221 :$\n",
      "STATE is 5\n",
      "MSG 20190415 103221 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 103232 :$\n",
      "STATE is 5\n",
      "MSG 20190415 103232 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 103244 :$\n",
      "STATE is 5\n",
      "MSG 20190415 103244 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 103255 :$\n",
      "STATE is 5\n",
      "MSG 20190415 103255 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 103307 :$\n",
      "STATE is 5\n",
      "MSG 20190415 103307 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 103318 :$\n",
      "STATE is 5\n",
      "MSG 20190415 103318 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 103329 :$\n",
      "STATE is 5\n",
      "MSG 20190415 103329 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 103341 :$\n",
      "STATE is 5\n",
      "MSG 20190415 103341 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 103352 :$\n",
      "STATE is 5\n",
      "MSG 20190415 103352 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 103402 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 103405 BROADCAST\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 103405 NO CARRIER\n",
      "MSG 20190415 103405 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 103405 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:5\\r\\n'\n",
      "MSG 20190415 103409 +CSQ:5\n",
      "CSQ 20190415 103409 5\n",
      "STATE is 4\n",
      "MSG 20190415 103410 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 103410 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 103419 NO CARRIER\n",
      "MSG 20190415 103419 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 103419 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:2\\r\\n'\n",
      "MSG 20190415 103424 +CSQ:2\n",
      "CSQ 20190415 103424 2\n",
      "STATE is 4\n",
      "MSG 20190415 103425 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 103425 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 103437 NO CARRIER\n",
      "MSG 20190415 103437 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 103437 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:5\\r\\n'\n",
      "MSG 20190415 103442 +CSQ:5\n",
      "CSQ 20190415 103442 5\n",
      "STATE is 4\n",
      "MSG 20190415 103443 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 103443 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 103453 NO CARRIER\n",
      "MSG 20190415 103453 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 103453 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:4\\r\\n'\n",
      "MSG 20190415 103458 +CSQ:4\n",
      "CSQ 20190415 103458 4\n",
      "STATE is 4\n",
      "MSG 20190415 103459 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 103459 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 103511 NO CARRIER\n",
      "MSG 20190415 103511 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 103511 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:2\\r\\n'\n",
      "MSG 20190415 103515 +CSQ:2\n",
      "CSQ 20190415 103515 2\n",
      "STATE is 4\n",
      "MSG 20190415 103516 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 103516 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 103528 NO CARRIER\n",
      "MSG 20190415 103528 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 103528 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:1\\r\\n'\n",
      "MSG 20190415 103532 +CSQ:1\n",
      "CSQ 20190415 103532 1\n",
      "STATE is 4\n",
      "MSG 20190415 103533 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 103533 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'CONNECT 19200\\r\\n'\n",
      "MSG 20190415 103549 CONNECT 19200\n",
      "MSG 20190415 103549 UNIT CONNECTED\n",
      "STATE is 5\n",
      "MSG 20190415 103549 BROADCAST\n",
      "b'Welcome to the CPF Server \\n'\n",
      "MSG 20190415 103549 Welcome to the CPF Server\n",
      "STATE is 5\n",
      "MSG 20190415 103549 BROADCAST\n",
      "b'\\runknown command: [\\x00]\\n'\n",
      "unknown command: [\u0000]\n",
      "STATE is 5\n",
      "MSG 20190415 103550 BROADCAST\n",
      "b'\\r:$ :$ :$ '\n",
      ":$ :$ :$0415 103601 \n",
      "STATE is 5\n",
      "MSG 20190415 103601 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 103612 :$\n",
      "STATE is 5\n",
      "MSG 20190415 103612 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 103624 :$\n",
      "STATE is 5\n",
      "MSG 20190415 103624 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 103635 :$\n",
      "STATE is 5\n",
      "MSG 20190415 103635 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 103645 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 103700 :$\n",
      "STATE is 5\n",
      "MSG 20190415 103700 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 103710 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 103720 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190415 103726 BROADCAST\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190415 103726 NO CARRIER\n",
      "MSG 20190415 103726 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190415 103726 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:0\\r\\n'\n",
      "MSG 20190415 103730 +CSQ:0\n",
      "CSQ 20190415 103730 0\n",
      "STATE is 4\n",
      "MSG 20190415 103731 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190415 103731 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'CONNECT 19200\\r\\n'\n",
      "MSG 20190415 103747 CONNECT 19200\n",
      "MSG 20190415 103747 UNIT CONNECTED\n",
      "STATE is 5\n",
      "MSG 20190415 103747 BROADCAST\n",
      "b'Welcome to the CPF Server \\n'\n",
      "MSG 20190415 103747 Welcome to the CPF Server\n",
      "STATE is 5\n",
      "MSG 20190415 103747 BROADCAST\n",
      "b'\\runknown command: [\\x00]\\n'\n",
      "unknown command: [\u0000]\n",
      "STATE is 5\n",
      "MSG 20190415 103747 BROADCAST\n",
      "b'\\r:$ :$ :$ '\n",
      ":$ :$ :$0415 103759 \n",
      "STATE is 5\n",
      "MSG 20190415 103759 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 103810 :$\n",
      "STATE is 5\n",
      "MSG 20190415 103810 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 103821 :$\n",
      "STATE is 5\n",
      "MSG 20190415 103821 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 103833 :$\n",
      "STATE is 5\n",
      "MSG 20190415 103833 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 103844 :$\n",
      "STATE is 5\n",
      "MSG 20190415 103844 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 103856 :$\n",
      "STATE is 5\n",
      "MSG 20190415 103856 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 103907 :$\n",
      "STATE is 5\n",
      "MSG 20190415 103907 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 103919 :$\n",
      "STATE is 5\n",
      "MSG 20190415 103919 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 103930 :$\n",
      "STATE is 5\n",
      "MSG 20190415 103930 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 103942 :$\n",
      "STATE is 5\n",
      "MSG 20190415 103942 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 103956 :$\n",
      "STATE is 5\n",
      "MSG 20190415 103956 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 104007 :$\n",
      "STATE is 5\n",
      "MSG 20190415 104007 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 104019 :$\n",
      "STATE is 5\n",
      "MSG 20190415 104019 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 104030 :$\n",
      "STATE is 5\n",
      "MSG 20190415 104030 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 104042 :$\n",
      "STATE is 5\n",
      "MSG 20190415 104042 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 104053 :$\n",
      "STATE is 5\n",
      "MSG 20190415 104053 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 104107 :$\n",
      "STATE is 5\n",
      "MSG 20190415 104107 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 104118 :$\n",
      "STATE is 5\n",
      "MSG 20190415 104118 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 104130 :$\n",
      "STATE is 5\n",
      "MSG 20190415 104130 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190415 104141 :$\n",
      "STATE is 5\n",
      "MSG 20190415 104141 BROADCAST\n"
     ]
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-5-7f5327c8b324>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mdf\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mserial_state_machine\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;32m<ipython-input-4-0d9983afac53>\u001b[0m in \u001b[0;36mserial_state_machine\u001b[1;34m()\u001b[0m\n\u001b[0;32m     50\u001b[0m         \u001b[0mATTEMPTS\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     51\u001b[0m         \u001b[1;32mwhile\u001b[0m \u001b[0mSTATE\u001b[0m \u001b[1;33m>=\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 52\u001b[1;33m             \u001b[0min_message\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mser\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mreadline\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     53\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     54\u001b[0m             \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mc:\\program files (x86)\\python36-32\\lib\\site-packages\\serial\\serialwin32.py\u001b[0m in \u001b[0;36mread\u001b[1;34m(self, size)\u001b[0m\n\u001b[0;32m    288\u001b[0m                     \u001b[0mctypes\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mbyref\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_overlapped_read\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    289\u001b[0m                     \u001b[0mctypes\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mbyref\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mrc\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 290\u001b[1;33m                     True)\n\u001b[0m\u001b[0;32m    291\u001b[0m                 \u001b[1;32mif\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0mresult_ok\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    292\u001b[0m                     \u001b[1;32mif\u001b[0m \u001b[0mwin32\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mGetLastError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m!=\u001b[0m \u001b[0mwin32\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mERROR_OPERATION_ABORTED\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "df = serial_state_machine()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Load the CSV\n",
    "test_letter = 'S'\n",
    "#filename = '20190403T114819_csqlog.csv'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "df2 = pd.read_csv(filename)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 479 entries, 0 to 478\n",
      "Data columns (total 3 columns):\n",
      "date    479 non-null object\n",
      "csq     400 non-null float64\n",
      "cier    79 non-null float64\n",
      "dtypes: float64(2), object(1)\n",
      "memory usage: 9.4+ KB\n"
     ]
    }
   ],
   "source": [
    "df2.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmcAAAFNCAYAAABFbcjcAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3Xm81nP+//HHSx1Jh6K0nqhR2k51UpR1iohQWTJj7BONwW/QMGPJvow1JsxghMJXkhYSg8gylero6FS2UFRo0Z7S8vr98fmcy3VO13WuE9fV9Tn1vN9u1+1c12d9fd6fa3md9/v9+bzN3RERERGRaNgl2wGIiIiIyM+UnImIiIhEiJIzERERkQhRciYiIiISIUrORERERCJEyZmIiIhIhCg5E4kYM3vLzH6XpX1/Z2aHb8f9HWdmc7fX/tLJzBqZ2SQzW21mt5vZLmb2rJmtMLN3sxBPhd832/s8p5uZDTezgdmOIyoq8+dIElNyJhllZmviHlvM7Me412f+iu1OMbOzypnf0sw8bl/fmdk/zaxKBbe/W7h+Xpnpd5rZ47807opw96Pc/flMbNvM9jKzB83sm7Bc5prZvWa2dyb2l26p4g/P87q4c/64me0ezptiZuvLvCc7JNlPdTO7J9zPj2b2qZldbmYWt9jFwDx338PdrwOOBg4BGrj7kRU4liZmNsbMlprZSjObaWZ/+KVlk873jZl1MbNXw0RzhZnNNrNbzKxmOrafaWaWZ2ZDzex7M1tlZnPM7Hoz2y3bsSWiZFPKUnImGeXuuSUP4GvgpLhpz2Z495vj9t0B6A5cmOF9RpaZVQcmAvsTlMWewOHAOuDA7EVWMdsQ/7HhOT8YOAL4W9y8C+Lfk+4+I8F+DBgDHAYcC+wB9AMuA+6KW3Q/YE6Z11+6+48VPKTngE+BxkAd4HxgaQXXjY93FzNL23e5mXUF3gQmAM3dvRZwAlAFaJ1knarp2v+vZWZ1gSmAAwe5+55AT6ABwTkSiT5310OP7fIA5gHdy0yrAlwPfEnww/QsUCucVwMYDvwArAA+APYC7gM2A+uBNcB9CfbVEthUZtpgYHAFY92N4Ms9r8z0O4HH417/FvgQWEnwg3BQ3LzvgMMTrZvs2MJ5U4CzwucXEfxIDg6X+yK+DIFmwP+A1cBrwKPx8ZWJ/VJgAVC9nOOOxQxUBx4Gvg3XuwfICefVD/e3AlgGvBW3jcbA2PB8fglcFDevRniOVwDFwDXA3Aqek22KP3z9IDCybLmm2M8JBAlf/TLTjwQ2AfsSJFYbgQ3he/DG8P24KXx9bYp9WLh+y3KWOSJ8X6wI32OHxc2bAtwSzl8P5JV537QkSGR/AJYAQ4E9kpVTmf1OB+5JEf9FwFvh+2M5MJDgs3wzwT9h3wNPlOwTOK7seS7zXrszfF88F76XZwIFccseDHwUznsGGAUMTBLbveExWDnxl/e5nRKezynAKmA8P382W4bn+PzwvbgEuCpu3aTfZ+H8ruF2V4bl9AfgL2XeSy9k8nOkR+V4qOZMsu0qgtqJwwl+YDYC94fzLgCqAo0IahYuBX5y978C0/i5FuSvqXYSNk8eQ/DFWDJtiJkN+qWBh/+hv0zww1IbeAQYX8Gmn4THlmTZIwl+bGoDDwHxzaojCH6Ea4dxJG3qJahtesUrXrNzM9AOaAt0JPhhKamF+jtBrU8dghqJmwDCZuPxwCSgIcGP8rVm9ttwvdsJErsmQC/gvArGss3xm1kToAewVe1YCscA77n7d/ET3f1dgkS0m7ufAbwI3Bq+B28GLgcmhq/vKG8H7u4EidWjZnZ6gubzJgS1d9cBexMkP2PMbK+4xc4CziGo2SsVa+gWgrJuC7QIt1WucPsdw2NL5UigiOA9cB/wJ+B0gqSyOVAX2JbP18kECV0tgn9IHghj2o2gLB4lKItXCd47yXQHXgzLeCsV/Nz+ATiT4L1di6DWtEQVoBPBP0Y9gdvN7DfhvKTfZ2bWDBhH8E9ObYJynu3ugyn9Xuqb4c+RVAJKziTb/gRc7e6L3H09QULwu7BpaSOwD7C/u29y92nuvnYbtl2lpM8M8A3Bf/NjS2a6ez93H5BiG7Pj+t2sIPgBLtEbKHL3EWF8TxH8N318BWLblmP71N2HuftmghqQ/cyslpkdALQCbnH3n9x9IsEPVzK1CWrBKupM4EZ3X+ru3wO3AWfHxd8Q2Dfcd0kH+MOB3dz9rnD6Z8CTwO/D+acT/AitcPevCGpeKqqi8b8anquJBLV798bNezTufE5Ksn6dcvbzbTg/HfoAUwlrm8xselwfuHOBUe7+prtvcffxBE2ox8at/7i7f+ruG919U/yG3f0Td38rPAffESQ6vyW12uHfWLJnZoPD8lprZlfGLfulu//H3TeHCfOZBDVu8919FUEyeGaZfnrlecvd3wjf508DBeH0I4EN7v6v8FifJahZK+8YynufVORz+x93/yL8TI6Mi6XEje6+3t2nAZ8Q/BMD5X+fnQ287O4vhvtd4u4fJYkxk58jqQSUnEnWhF9YjQn+ay1JfmYQvC9rA0OAd4CRZrbAzO6oaIf+0GZ3r+VBn5lcgi/0cdsYZpuSbYTbeSBuXkNgfpnl5xPUhqWyLccWXyuyLvybG+5/ibtviJv/TTn7XEZQE5BSeG7qU/r44o/tdmAR8HbYKb8kyd0PaFImoR0A1A+3Wa9MjGXLrzwVjf/48Hw1cfe/lCmfP8Wdz0OTrL+0nP004Bf0C0skTHqvcvdWBGX9GUFzHQTleFaZcuxEcM5LJD3XZtbQzF4ws4VmtoqgtrUiSeWy8G/s+MMyrEWQ+Mf3LSu7/7Kfh/kETeMVvdik7Ps8N267C8osW977JtX7pCKf22SxQPC9srTs/Ap8nzUm6JZQEZn8HEkloORMsiZsdlgIHBWfALn7buEP1wZ3v8HdWxL899yXn/9zTNhkUc6+1hLUOnU1s9xUy1fQIrbuYLwvwTEBrAV2j5tXPy6e8o6tor4F9jGzanHTGpez/JtAz4pcsRaem+8ofXyxY3P3le5+mbvvB5wKDDSzwwh+MD4pcz73cPeTw20uLhPjvhU4zm2O/1d6EzjCzOrHTzSzIwkSnInp3qG7LyZoAmxiZjUIyvHxMuVYw93vj1+tnE3eQ/D+y/egQ/wFBP3cUsWxnCChOKUiYZd5XfbzsC/wI0G/t1KfBTPLoeJJ27cETYTxynvfvEn58af63P4iqb7PCM7p/slWL/M6k58jqQSUnEm2PQLcaWaNIegPYmYnhc+7m1nr8Eq0VQQdcTeH630P/CbRBhMJf9DPAua7+5o0xf4S0MHMTjOzqmZ2DsGX5Gvh/CLgjHBeF4LmlJJ4yju2ivqMoElloJnlhMnDceUsP4Tgh/IFMzvAAvuY2Y1mdnSC5Z8DbjSz2mE/nesIOmNjZr3MrGn4X/zKMPbNwPvh/MstuB1JVTNrZ2YlV1OOAK4zs5pmth/B7ShiLLilwCNpiv+XKunr86IFt2SpGiaeQ4EH3L1CtRT28+1YuiSZf2/4HqhiQX+ni4BZcf9I9DWzo8P51cPn9RNtK4E9CDqXrzKzfQlqXSrqKuBiM/urme0TxrovqROA54ArzWxfM9uDoBn8/8Jk4mNg7/AYcgia+yr6+/MusJuZXRSeizP4uRkxkbuBBhb0KS35XmlswS1YWpD6c/trJP0+A4YBJ5rZyeE53cfMSo6j7PfZr/ocSeWn5Eyy7W6C/3TfMrPVBD+KJV9AjQj6iK0GZhH8aI4I590PnGNmy83s7iTbrmLh/awI/vtuT9DPBwAze8rMHkiybkphP6xeBEnLMoJO/Se6+4pwkWsJOmOvILiaanjc6uUdW0X37wS1bd0Jrpi7FniB4KqvRMv/SNCpfz7BlXargckEV359mGCVGwj6Oc0mSDT/R3C+IOjrNjHcxrvAve4+xd03EnSSPjTczxLg3/zcLDSQoFnwa+AVgh+seI3D/aQj/l/E3bcQnNcpBB3T1wBPEVyMcWXyNbfSmODcz0kyf0+CRGElMJegD+IpYQxfEtRI3kxQXvMJOqVX9Dv7BoJ+SyuB0VSsgz/hvicQ9G07FpgbNqm9QtCs+Wg5q/6boFl2EkHz3Q+ESWFYc3QZwRWGCwhqZSvUPBye95MJEpDlBFfTvlzO8osJ7jeXAxSG3yv/Dfc5vwKf218j6feZu39B8A/ateFxTAfahOs9BhwUNmEOT8PnSCo588QXtIhIJWRmY4Ep7v6PbMeyrSy4Wew0oF3YKbxSM7MLgEYeXMkpIlJhSs5EKjEz60zQJPI1QY3CSOBAd5+d1cBEROQXi8xdnUXkF8kjaLLamyBB+6MSMxGRyk01ZyIiIiIRogsCRERERCJEyZmIiIhIhFTqPmd16tTxJk2aZDuMyFi7di01atTIdhg7DJVn+qlM00vlmX4q0/RTmf6ssLBwqbvvk2q5Sp2cNWnShOnTp2c7jMiYOHEiXbt2zXYYOwyVZ/qpTNNL5Zl+KtP0U5n+zMwqdBNrNWuKiIiIRIiSMxEREZEIUXImIiIiEiFKzkREREQiRMmZiIiISIQoORMRERGJECVnIiIiIhGi5ExEREQkQpSciYiIiESIkjMRERGRCFFyJiIiIhIhSs5EREQqmUZ5+2JmleJRWFiY9Rgq8miUt2+2T2tMpR74XEREZGe0aOE3nDhgTLbDqJCa9agUsY4b1CfbIcSo5kxEREQkQpSciYiIiERIxpIzM9vNzKaa2UdmNtvMbg6nNzWzD8zsczN73sx2DadXC1/PDec3yVRsIiIiIlGVyZqzDcBR7t4eKACOM7MuwF3A/e7eHFgO9AuX7wcsd/dmwP3hciIiIiI7lYwlZx5YE77MCR8OHAWMDKcPBUp64PUOXxPOP9rMLFPxiYiIiERRRvucmVkVMysCFgNvAF8AK9x9U7jIAqBR+LwR8A1AOH8lUDuT8YmIiIhEjbl75ndiVgsYDdwAPBk2XWJmjYHx7t7WzGYDPdx9QTjvC+Bgd19WZlv9gf4A9erV6zh8+PCMx19ZrFmzhtzc3GyHscNQeaafyjS9VJ7pV1nKtLCwkJr1mmU7jAqptTusWJftKFJb+f1cOnbsmNF9dOvWrdDdO6Vabrvc58zdV5jZRKALUMvMqoa1Y3nAonCxBUBjYIGZVQVqAj8k2NZjwGMAnTp18q5du2b+ACqJiRMnovJIH5Vn+qlM00vlmX6VpUy7detWKe4dBtC7A4ydke0oUhs36Eq2R4VVRWTyas19whozzKw60B34GHgbOC1c7FxgbPj8pfA14fy3PCqlJCIiIrKdZLLmrAEw1MyqECSBI9x9nJnNAYab2W3ADGBIuPwQ4Gkzm0tQY/b7DMYmIiIiEkkZS87cfSbQIcH0L4GDE0xfD/TNVDwiIiIilYFGCBARERGJECVnIiIiIhGi5ExEREQkQpSciYiIiESIkjMRERGRCFFyJiIiIhIhSs5EREREIkTJmYiIiEiEKDkTERERiRAlZyIiIiIRouRMREREJEKUnImIiIhEiJIzERERkQhRciYiIiISIUrORERERCJEyZmIiIhIhCg5ExEREYkQJWciIiIiEaLkbAeycuVKCgoKKCgooH79+jRq1Cj2+qeffqrwdp544gm+++67hPP+97//0blzZwoKCmjVqhW33norAG+99RZTpkzZ5pg//PBDXnvttZTLzZ8/n65du9K6dWvatGnDQw89FJu3bNkyjj76aJo3b06PHj1YuXIlALNnz+aQQw6hWrVqPPDAA6W2N2jQINq0aUObNm148MEHk+53/PjxtGjRgmbNmnHPPfdsNf/Pf/4ztWrVSrr+tGnTyM/Pp1mzZlxxxRWx6ddeey3t2rWjffv29OjRI2F5L168mK5du1KjRg0uv/zyUvOuvvpq8vLyyt13ia+++ooaNWqUKoN7772XNm3akJ+fz5lnnsmGDRu2Wu/tt9+mQ4cOVK1alTFjxpSad+WVV5Kfn09+fj4jR45MuN+HHnqItm3bUlBQwBFHHMEnn3wCwLBhw2Lvy4KCAsyMWbNmAfDMM8/Qtm1b2rVrR8+ePfnhhx8AGDBgAC1atKBdu3aceuqpsXNc3jGmOnciIlGl5GwHUrNmTYqKiigqKuKiiy7iiiuuiL3eddddK7yd8pKzc889lyFDhlBUVMSsWbM49dRTgV+WnG3atKnCyVlOTg4PPPAAc+bMYfLkydx///189tlnANx+++0cf/zxfP755xxxxBHcfffdANSpU4cHH3ywVFIEUFRUxNChQ5k+fTpFRUWMGjWKr776KmF8l156Ka+//jqzZ89m2LBhsX0CfPDBB6xZs6bcuC+66CKefPJJPv/8c2bPns0bb7wBBMnVzJkz+eijj+jRowe33XbbVuvuvvvu3H777dx1111bzevdu3eFy3vAgAEcf/zxsdfz58/nkUceobCwkOLiYtavX88LL7yw1XpNmjRh2LBhnH766aWmjx07llmzZvHRRx8xZcoU/vGPfyQsh3POOYfi4mKKioq44ooruPLKK2PTS96XTz75JM2bNyc/P5+ffvqJAQMG8M477zBz5kxatmzJv/71LwB69OjB7NmzmTlzJk2aNImd42THuHHjxnLPnYhIlCk520kMHTqUgw8+mIKCAi6++GK2bNnCpk2bOPvss2nbti35+fkMHjyY559/nqKiIn73u98lrHFbsmQJ9evXB6BKlSq0bt2aL774gscff5x77rmHgoICJk2axNixY+ncuTMdOnTg2GOPZfHixQAMHDiQP/3pTxxzzDGcccYZ3HLLLTz77LMUFBQkrYEBaNiwIQUFBQDsueeetGzZkoULFwJBsnDuuecCQfJYUstTr149OnXqRNWqVUtt6+OPP+aQQw6hevXq5OTkcOSRRzJ69Oit9jlnzhxatWrFfvvtR7Vq1Tj99NMZO3YsECRuf//737nzzjuTxvzNN9+wfv16DjroIMyMs88+OxbbnnvuGVtu3bp1mNlW6+fm5nLYYYex2267bTXvkEMOiZ2H8owcOZKWLVvSsmXLUtM3btzI+vXr2bRpE+vWraNhw4Zbrdu0aVPatm3LLruU/pqYM2cOXbt2pUqVKuTm5pKfn8/rr7++1frxx7h27dqEx/jcc89xxhlnAODuuDtr167F3Vm9enUsrh49esTOY5cuXViwYEG5xzhlypSk505EJOqUnO0EZs2axejRo5k0aRJFRUVs2rSJ4cOHU1hYyNKlSykuLmbWrFmcc845saSsJEkrW+N2+eWX07x5c0455RT+85//sGHDBvbff38uuOACrrrqKoqKijj00EM58sgjmTJlCjNmzOCUU07hvvvui21jxowZvPzyy7zwwgvccMMNnHnmmRQVFXHaaafxwQcfcNFFF5V7PF9++SWzZs3ioIMOAoJmzX322QeARo0a8e2335a7ftu2bZk4cSI//PADa9eu5dVXX+Wbb77ZarmlS5fSuHHj2Ou8vLxYQvjPf/6TU089lXr16iXdz8KFC5OuDz83TY4YMYKbbrqp3JgravTo0dxyyy0ArF69mvvuu4+BAweWWma//fbjsssuo3HjxjRo0IC6dety1FFHAXDdddcxfvz4cvfRvn17xo8fz48//siSJUt45513EpYfwODBg9l///257rrrtmpadndGjBgRS86qVavGQw89ROvWrWnYsCFz587lvPPO22qbTzzxRKyWLNkxpip7EZEoU3K2E3jzzTeZNm0anTp1oqCggHfeeYcvvviCZs2a8emnn3LZZZfx3//+l5o1a6bc1s0338y0adPo3r07w4YN44QTTki43Ndff82xxx5L27ZtGTRoELNnz47N6927d8LaIIDOnTvzyCOPJN3/qlWrOPXUU3nwwQfJzc1NuEyiGpp4+fn5DBgwgO7du3P88cfH+lWV5e4Jt71gwQLGjBnDxRdfXO5+kq1f4s4772TBggX07ds31nz3a5188snccMMNAFx//fVcddVV1KhRo9Qyy5YtY9y4cXz11VcsWrSIH374geHDhwNBE3HPnj3L3UfPnj3p3r07hxxyCGeeeSaHHHJIwvID+Mtf/sIXX3zBbbfdxh133FFq3qRJk9hrr71iNV4//fQTjz76KDNnzmThwoW0aNFiq+bLm2++mdzcXH7/+9+Xe4ypyl5EJMoSf6PKDsXd+eMf/xjrvB9v5syZvPrqqwwePJgXX3yRxx57LOX2mjVrRrNmzbjwwgupXbv2Vp2zAS655BKuvfZaevbsyZtvvlmq+a/sD2lF/fTTT5xyyimcd9559OrVKza9du3aLFmyhH322YeFCxdWqLmvf//+9O/fH4C//e1vNGvWjHnz5tGnTx8ALr30UvbZZx8+/PDD2DoLFiygYcOGfPjhh3z++efsv//+QJAwtmjRguLiYg4++GAATjnlFM4///xSNUol65f1hz/8gVNPPZXrr7/+F5RKclOnTmXMmDEMGDCAFStWsMsuu1CtWjVq1apF8+bNqVOnDhAkdJMmTYolPBVxww03xJLA008/nebNm5e7/B/+8Acuu+wyzj777Ni04cOHx2rNAAoLC8nJyaFp06ax7cbXtg0ZMoTXX3+dCRMmpDzG/Pz8CpW9iEgUKTnbCXTv3p3TTjuNyy67jDp16rBs2TLWrl1L9erV2W233ejbty9NmzaNNSfusccerF69OuG2XnnlFXr27ImZ8dlnn1GtWjX22GOPrdZZuXIljRo1wt0ZOnRo0tjK21c8d+e8886joKCAyy67rNS8Xr16MXToUK688kqGDh1K7969U25v8eLF1K1bl3nz5jF27FimTp0au6CixJtvvsn999/P/PnzqV+/PiNGjGDkyJG0aNEilhxu2rSJOnXq8OmnnwKUWh+CprqSWsunn3461in+888/jyU0L7300lZ9wtJh0qRJsecDBw6kTp06/PnPf+Z///sfkydP5scff2S33XZjwoQJHH744RXe7qZNm1i1ahV77703M2bM4OOPP+boo4/earn4Y3z55Zdp0aJFbN7mzZsZOXIkH3zwQWxaXl4excXFLFu2jNq1a/Pmm2/SqlUrIHjfDRo0iHfffbdUrWuyY9y4cSNz5szZ6tyJiFQGSs52Am3btuXGG2+ke/fubNmyhZycHB555BGqVKlCv379cHfMLHZV4Pnnn88FF1xA9erVmTp1aql+Z0899RRXXHEFu+++Ozk5Ofzf//0fu+yyC71796Zv376MGjWKhx9+mJtuuomTTz6ZvLw8Dj744KT9wI466ijuueceOnTowHXXXUfjxo158sknt2rafOedd3juuedo165d7MKAu+66ix49enDttddy+umn8+ijj9K0aVOef/55IKgt6dKlC6tWrWKXXXbh3nvv5bPPPmP33XenT58+rFixgl133ZVHH300YZNu1apVGTx4MMcccwybN2+mf//+pRKMivj3v//Neeedx/r16znxxBM55phjALjqqquYO3cuu+yyC02bNuXf//53wvXz8vJYt24dGzduZOTIkUyYMIEWLVowYMAARowYwapVq8jLy+Oiiy5i4MCBjB49muLi4litViKHHXYYvXr1ijXnduzYkX79+gFBn7PDDjuMnj17MnnyZPr27cvy5ct57bXXuOGGG5g5cyYbNmyIJXM1a9bk2WefpUqVKlut/8ADDzBx4kRycnKoXbs2Tz75JN9//z0Q3KZj//33Z999943F1bhxYwYOHMjhhx9OTk4OTZo0iSX2l1xyCVu2bIklgYcddhgPP/xw0mPMycn51edORCRbLFHfjMqiU6dOPn369GyHERkTJ06ka9eu2Q5jh6HyTD+VaXqpPNOvspSpmXHigDGpF4yA3h1g7IxsR5HauEF9EvZXTSczK3T3TqmW0wUBIiIiIhGi5ExEREQkQpSc7UC2x/BNZ511Fk2bNo1t94gjjtimGAcOHLjV/a7Keu211zjwwANp27YtHTt2ZOLEibF5yYZDev7552ndujW77LJLqU75GzZs4Nxzz40NI/Tuu+8m3e9tt91Gs2bNaNmyJW+++WapeZs2baJdu3axqzkTGTJkCM2bN6d58+Y888wzsenHHHMMBQUFtGnThosvvpjNmzdvtW6yoZIKCwvp0qUL+fn5tGvXLmmn9rvvvptWrVrRvn17jjnmmFJXKiaLK16yIbB++OEHevXqRbt27ejcuTNz5sxJuP65555L+/btadu2Laeffjpr165NGFfJzYi/+uorDjzwQAoKCsjPz+c///kPENy3rGfPnrRo0YI2bdpw3XXXpSwjgHnz5tG9e3dat25N69atk953TUSkMlBytgPZHsM3Adx///2x7b733nvpCL2UunXr8sorr1BcXMwTTzxR6vYLyYZDatu2LWPGjOHQQw8tta1HHnmEXXfdleLiYl577TUGDBiQsE/BzJkzGTVqFHPmzOGVV17hz3/+M1u2bInNHzRoEPn5+UljXrp0KXfccQfTpk1jypQpXH/99bEE58UXX6SoqIji4mIWLVqUcDSCZEMl5ebm8uyzzzJr1izGjx/PpZdemvDq1k6dOvHhhx/y0Ucf0atXL66++uqUccVLNgTWrbfeSufOnZk5cyZPPPHEVlfKlnjwwQf56KOPKC4upn79+rELHMrGVXKrloYNGzJ58mSKioqYNGkSt956K4sXL8bM+Pvf/86nn37Khx9+yNtvvx07x8nKCODss8/m2muvZc6cOUydOjV2mxARkcpIydlOIl3DNyUzcOBA+vXrx29/+1t+85vflLqS7pZbbqFFixYcc8wxfP755ym3deCBB9KgQQMgSLrWrFnDxo0byx0OqXXr1hxwwAFbbWvOnDmxK/zq169PjRo1mDFj656pY8eO5YwzzmDXXXeNXUVYMhbj/PnzeeONNzj//POTxvzqq69y3HHHUatWLWrXrs1RRx0VG9KoZBijzZs3s2HDhoQ3Q002VFKLFi1i91PLy8ujdu3aLF26dKv1jzrqKKpXrw6UHt6ovLjKHn+iIbDiy69NmzZ89tlnLFu2bKv1S45xy5YtrF+/PnaMZeNasmQJENxipFq1akBQu7llyxbcndzcXH7729/GlunQoUPsWJKV0cyZM6lSpUpslIPc3NzYPkVRqnP2AAAeZ0lEQVREKiMlZzuBdA7fBHDFFVfEmjXPOeec2PTPPvuMN954gylTpnDDDTewefNmpk6dGqs5GjlyJFOnTo0t//DDD/P444+XG/uIESPo3LkzOTk5v2hInvbt2zNmzBg2b97MF198wYwZMxI2eSXadkkSdPnll3PPPfeUe4f5VLF1796dunXrUqdOHU4++eRyY06m5J5eTZo0AZIPtTRkyJDY8EblxXX++efHmoCTDYHVvn17XnzxRQAmT57MggULSo1rGe+cc86hfv36fPnllwlHTxgyZAidO3eOvZ43bx7t2rVjv/32Y+DAgVsNhbV8+XLGjx8fS7qS+eyzz9hzzz3p06cPHTp04O9//3upWk8RkcomY8mZmTU2s7fN7GMzm21ml4XTbzKzhWZWFD56xq1zjZnNNbNPzaxHpmLb2aRz+CYo3aw5bNiw2PQTTzyRXXfdlbp167L33nuzZMkS3n33XU499VSqV69OzZo1Oemkk2LLX3LJJVxwwQVJ91NcXMzAgQNjTWS/ZEieCy+8kHr16tGxY0euvPLKpEMNJbt8esyYMTRu3Dh2b7VkUsX25ptvsmjRIlavXs0777xT7rYSWbhwIeeddx5PPfVUbLuJhloaOnQoxcXFDBgwIGVcTz75ZNLjKlnmuuuuY/HixRQUFPDII4/Qvn37pEM1DRs2jG+//Zb999+fF154IWFcffv2jU1r0qQJM2fO5PPPP2fIkCGlagQ3btzI7373O/7617+y3377lVs2mzZt4r333uOBBx5g6tSpfPLJJzz99NPlriMiEmWZrDnbBPzV3VsBXYBLzKx1OO9+dy8IH+MBwnm/B9oAxwH/MrMqGYxvp1EyfFNJQvXpp59y/fXXU7t2bWbOnMnhhx/O4MGD+dOf/vSr9lPSTAVQpUoVNm3aBPyyMQ2//vprTjnlFJ555pnYcD55eXnbPCRPTk4O//znPykqKmL06NEsX76c5s2bM3LkyFjtX1FRUcJt16lTh0mTJjFq1CiaNGnCWWedxeuvv865557LpEmTYuuPHz++QrFVr16dk046ibFjx25TWaxcuZITTjiBu+66KzbYeyKvvfYad999N2PHjo3VeFa0zEqGwAJKDYFVs2ZNhg4dSlFREU8++SRLly6N1dwlUqVKFU4//XRGjRqVMK6cnJyt1mnUqBEtW7bk/fffB4L3a79+/cjPz+fSSy8tp2SIHWPHjh1p0qQJOTk59OnTp9SwWyIilU3GkjN3/9bdPwyfrwY+BhqVs0pvYLi7b3D3r4C5wMGZim9n0r17d0aMGBGrmVi2bBlff/01S5Yswd3p27cvN998c+wHraJDKlXEkUceyahRo1i/fj2rVq1i3LhxKddZvnw5J5xwAvfeey9dunSJTW/cuHFsOCR35+mnn045VNPatWtZt24dEPS/ys3N5YADDuC0006LJasFBQX06tWL5557jp9++okvvviC+fPnc8ABB3D33XezYMEC5s2bxzPPPMOxxx7L0KFDOfTQQ2Pr9+zZk+OOO45XX32VFStWsGzZMiZMmMCxxx7L6tWrYxdXbNq0iVdffXWbhmrasGEDvXv3pl+/fuU2h06fPp1LLrmEl156qVRn+GRxlVUyBBZQagisFStWsHHjRgAeffRRunfvvtXYqFu2bOHLL78EgsTq5Zdfjh1jsrgWLFjA+vXrgeD9OHny5FifwWuuuYb169dz7733VqiMunTpwuLFi2N94d566y1at26dYi0RkejaLn3OzKwJ0AEoGUjvUjObaWZPmNle4bRGQHxnoAWUn8xJBcUP39SuXTuOPfZYvv/+e7755huOPPJICgoKuPDCC7njjjuAn4dvSnZBQHyfs4KCgoS3hihx8MEHc/LJJ9O+fXv69u3LkUceGZuXrM/ZP//5T7766ituvPHG2D5KfnhLhkNq1qwZrVq1ig2H9MILL5CXl8e0adPo0aMHJ5xwAgDfffcdHTp0oFWrVgwaNCjpOJ/t27enT58+tGrVip49e/Kvf/1rq47n5dlnn3245ppr6NSpE507d+aWW26hZs2arF69mpNOOik27FReXh4X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\n",
      "text/plain": [
       "<Figure size 720x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "bins = np.arange(7)-0.5\n",
    "\n",
    "fig = df2.csq.hist(figsize=(10,5), align='mid', bins=bins, edgecolor=\"black\")\n",
    "bins = np.arange(7)-0.5\n",
    "fig.set_xlabel(\"CSQ REPLY (RSSI)\")\n",
    "fig.set_ylabel(\"COUNT\")\n",
    "fig.set_title(f\"Test {test_letter}: Housing Closed, CPF Off, Serial Ground Connected\")\n",
    "#Determine Test Length\n",
    "date_str = f\"Test Start: {df2.date[0]}\\nTest End: {df2.date.iloc[-1]} \"\n",
    "plt.text(0,250,date_str);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#Plot CSQ over time\n",
    "import matplotlib.dates as mdates\n",
    "ax = df2.plot(kind='line',x='date',y='csq', figsize=(10,5))\n",
    "ax.xaxis.set_major_locator(plt.MaxNLocator(5))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
