{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## TESTS 20190410"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "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: `External 28VDC`\n",
    "* NAL Serial GND: `Connected to External B-`\n",
    "* CPF Power: `Off`\n",
    "* CPF Electronics: `In housing`\n",
    "\n",
    "\n",
    "\n",
    "### Log ###\n",
    "* `2019-04-10T13:39` Started test, just baselining repeat of tests A and B\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "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": 43,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "STATE is 0\n",
      "MSG 20190411 100522 SEND NO ECHO\n",
      "STATE is 1\n",
      "MSG 20190411 100522 SEND CBST\n",
      "b'OK\\r\\n'\n",
      "MSG 20190411 100522 OK\n",
      "STATE is 2\n",
      "MSG 20190411 100522 SEND CIER 0\n",
      "STATE is 3\n",
      "MSG 20190411 100525 SEND CSQ\n",
      "b'OK\\r\\n'\n",
      "MSG 20190411 100525 OK\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "b'OK\\r\\n'\n",
      "MSG 20190411 100525 OK\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "b'+CSQ:0\\r\\n'\n",
      "MSG 20190411 100525 +CSQ:0\n",
      "CSQ 20190411 100525 0\n",
      "STATE is 4\n",
      "MSG 20190411 100526 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190411 100526 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'CONNECT 19200\\r\\n'\n",
      "MSG 20190411 100538 CONNECT 19200\n",
      "MSG 20190411 100538 UNIT CONNECTED\n",
      "STATE is 5\n",
      "MSG 20190411 100538 BROADCAST\n",
      "b'Welcome to the CPF Server \\n'\n",
      "MSG 20190411 100538 Welcome to the CPF Server\n",
      "STATE is 5\n",
      "MSG 20190411 100538 BROADCAST\n",
      "b'\\r:$ :$ '\n",
      ":$ :$0190411 100550 \n",
      "STATE is 5\n",
      "MSG 20190411 100550 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 100601 :$\n",
      "STATE is 5\n",
      "MSG 20190411 100601 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 100612 :$\n",
      "STATE is 5\n",
      "MSG 20190411 100612 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 100624 :$\n",
      "STATE is 5\n",
      "MSG 20190411 100624 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 100640 :$\n",
      "STATE is 5\n",
      "MSG 20190411 100640 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 100652 :$\n",
      "STATE is 5\n",
      "MSG 20190411 100652 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 100703 :$\n",
      "STATE is 5\n",
      "MSG 20190411 100703 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 100715 :$\n",
      "STATE is 5\n",
      "MSG 20190411 100715 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 100726 :$\n",
      "STATE is 5\n",
      "MSG 20190411 100726 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 100738 :$\n",
      "STATE is 5\n",
      "MSG 20190411 100738 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 100752 :$\n",
      "STATE is 5\n",
      "MSG 20190411 100752 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 100803 :$\n",
      "STATE is 5\n",
      "MSG 20190411 100803 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 100815 :$\n",
      "STATE is 5\n",
      "MSG 20190411 100815 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 100826 :$\n",
      "STATE is 5\n",
      "MSG 20190411 100826 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 100837 :$\n",
      "STATE is 5\n",
      "MSG 20190411 100837 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 100848 :$\n",
      "STATE is 5\n",
      "MSG 20190411 100848 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 100902 :$\n",
      "STATE is 5\n",
      "MSG 20190411 100902 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190411 100905 BROADCAST\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190411 100905 NO CARRIER\n",
      "MSG 20190411 100905 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190411 100905 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:4\\r\\n'\n",
      "MSG 20190411 100910 +CSQ:4\n",
      "CSQ 20190411 100910 4\n",
      "STATE is 4\n",
      "MSG 20190411 100911 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190411 100911 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190411 100915 NO CARRIER\n",
      "MSG 20190411 100915 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190411 100915 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:5\\r\\n'\n",
      "MSG 20190411 100919 +CSQ:5\n",
      "CSQ 20190411 100919 5\n",
      "STATE is 4\n",
      "MSG 20190411 100920 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190411 100920 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'CONNECT 19200\\r\\n'\n",
      "MSG 20190411 100927 CONNECT 19200\n",
      "MSG 20190411 100927 UNIT CONNECTED\n",
      "STATE is 5\n",
      "MSG 20190411 100927 BROADCAST\n",
      "b'Welcome to the CPF Server \\n'\n",
      "MSG 20190411 100927 Welcome to the CPF Server\n",
      "STATE is 5\n",
      "MSG 20190411 100927 BROADCAST\n",
      "b'\\r:$ '\n",
      ":$G 20190411 100938 \n",
      "STATE is 5\n",
      "MSG 20190411 100938 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 100949 :$\n",
      "STATE is 5\n",
      "MSG 20190411 100949 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101001 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101001 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101012 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101012 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101023 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101023 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101035 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101035 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101046 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101046 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101058 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101058 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101109 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101109 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101120 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101120 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101132 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101132 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101143 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101143 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101155 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101155 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101206 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101206 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101217 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101217 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190411 101226 BROADCAST\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190411 101226 NO CARRIER\n",
      "MSG 20190411 101226 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190411 101226 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:1\\r\\n'\n",
      "MSG 20190411 101230 +CSQ:1\n",
      "CSQ 20190411 101230 1\n",
      "STATE is 4\n",
      "MSG 20190411 101231 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190411 101231 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190411 101246 NO CARRIER\n",
      "MSG 20190411 101246 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190411 101246 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:0\\r\\n'\n",
      "MSG 20190411 101250 +CSQ:0\n",
      "CSQ 20190411 101250 0\n",
      "STATE is 4\n",
      "MSG 20190411 101251 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190411 101251 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190411 101301 NO CARRIER\n",
      "MSG 20190411 101301 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190411 101301 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:0\\r\\n'\n",
      "MSG 20190411 101305 +CSQ:0\n",
      "CSQ 20190411 101305 0\n",
      "STATE is 4\n",
      "MSG 20190411 101306 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190411 101306 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190411 101319 NO CARRIER\n",
      "MSG 20190411 101319 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190411 101319 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:5\\r\\n'\n",
      "MSG 20190411 101324 +CSQ:5\n",
      "CSQ 20190411 101324 5\n",
      "STATE is 4\n",
      "MSG 20190411 101325 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190411 101325 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'CONNECT 19200\\r\\n'\n",
      "MSG 20190411 101332 CONNECT 19200\n",
      "MSG 20190411 101332 UNIT CONNECTED\n",
      "STATE is 5\n",
      "MSG 20190411 101332 BROADCAST\n",
      "b'Welcome to the CPF Server \\n'\n",
      "MSG 20190411 101333 Welcome to the CPF Server\n",
      "STATE is 5\n",
      "MSG 20190411 101333 BROADCAST\n",
      "b'\\r:$ :$ '\n",
      ":$ :$0190411 101346 \n",
      "STATE is 5\n",
      "MSG 20190411 101346 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101357 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101357 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101409 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101409 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101420 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101420 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101431 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101431 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101448 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101448 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101506 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101506 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101520 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101520 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190411 101530 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190411 101540 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190411 101550 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190411 101600 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101617 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101617 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101628 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101628 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101640 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101640 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101651 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101651 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101703 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101703 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101714 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101714 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101726 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101726 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101737 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101737 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101749 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101749 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101800 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101800 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101812 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101812 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101823 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101823 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101835 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101835 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101846 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101846 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101857 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101857 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101909 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101909 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101920 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101920 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101931 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101931 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101943 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101943 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 101954 :$\n",
      "STATE is 5\n",
      "MSG 20190411 101954 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 102006 :$\n",
      "STATE is 5\n",
      "MSG 20190411 102006 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 102017 :$\n",
      "STATE is 5\n",
      "MSG 20190411 102017 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 102028 :$\n",
      "STATE is 5\n",
      "MSG 20190411 102028 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 102040 :$\n",
      "STATE is 5\n",
      "MSG 20190411 102040 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 102052 :$\n",
      "STATE is 5\n",
      "MSG 20190411 102052 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 102104 :$\n",
      "STATE is 5\n",
      "MSG 20190411 102104 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 102115 :$\n",
      "STATE is 5\n",
      "MSG 20190411 102115 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 102126 :$\n",
      "STATE is 5\n",
      "MSG 20190411 102126 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 102138 :$\n",
      "STATE is 5\n",
      "MSG 20190411 102138 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 102156 :$\n",
      "STATE is 5\n",
      "MSG 20190411 102156 BROADCAST\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "b':$ '\n",
      "MSG 20190411 102207 :$\n",
      "STATE is 5\n",
      "MSG 20190411 102207 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 102219 :$\n",
      "STATE is 5\n",
      "MSG 20190411 102219 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 102230 :$\n",
      "STATE is 5\n",
      "MSG 20190411 102230 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 102241 :$\n",
      "STATE is 5\n",
      "MSG 20190411 102241 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 102253 :$\n",
      "STATE is 5\n",
      "MSG 20190411 102253 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 102304 :$\n",
      "STATE is 5\n",
      "MSG 20190411 102304 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 102316 :$\n",
      "STATE is 5\n",
      "MSG 20190411 102316 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190411 102326 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190411 102335 BROADCAST\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190411 102335 NO CARRIER\n",
      "MSG 20190411 102335 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190411 102335 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:3\\r\\n'\n",
      "MSG 20190411 102340 +CSQ:3\n",
      "CSQ 20190411 102340 3\n",
      "STATE is 4\n",
      "MSG 20190411 102341 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190411 102341 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'CONNECT 19200\\r\\n'\n",
      "MSG 20190411 102356 CONNECT 19200\n",
      "MSG 20190411 102356 UNIT CONNECTED\n",
      "STATE is 5\n",
      "MSG 20190411 102356 BROADCAST\n",
      "b'Welcome to the CPF Server \\n'\n",
      "MSG 20190411 102357 Welcome to the CPF Server\n",
      "STATE is 5\n",
      "MSG 20190411 102357 BROADCAST\n",
      "b'\\runknown command: [\\x00]\\n'\n",
      "unknown command: [\u0000]\n",
      "STATE is 5\n",
      "MSG 20190411 102357 BROADCAST\n",
      "b'\\r:$ :$ :$ '\n",
      ":$ :$ :$0411 102408 \n",
      "STATE is 5\n",
      "MSG 20190411 102408 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 102420 :$\n",
      "STATE is 5\n",
      "MSG 20190411 102420 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190411 102430 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190411 102440 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190411 102450 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190411 102457 BROADCAST\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190411 102458 NO CARRIER\n",
      "MSG 20190411 102458 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190411 102458 SEND CSQ\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "STATE is 3\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-43-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-42-af8af90f76b5>\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": 45,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "STATE is 0\n",
      "MSG 20190411 102934 SEND NO ECHO\n",
      "STATE is 1\n",
      "MSG 20190411 102934 SEND CBST\n",
      "b'OK\\r\\n'\n",
      "MSG 20190411 102934 OK\n",
      "STATE is 2\n",
      "MSG 20190411 102934 SEND CIER 0\n",
      "STATE is 3\n",
      "MSG 20190411 102937 SEND CSQ\n",
      "b'OK\\r\\n'\n",
      "MSG 20190411 102937 OK\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "b'OK\\r\\n'\n",
      "MSG 20190411 102937 OK\n",
      "STATE is 3\n",
      "STATE is 3\n",
      "MSG 20190411 102945 SEND CSQ\n",
      "b'+CSQ:5\\r\\n'\n",
      "MSG 20190411 102945 +CSQ:5\n",
      "CSQ 20190411 102945 5\n",
      "STATE is 4\n",
      "MSG 20190411 102946 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190411 102946 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'+CSQ:5\\r\\n'\n",
      "MSG 20190411 102950 +CSQ:5\n",
      "CSQ 20190411 102950 5\n",
      "STATE is 4\n",
      "MSG 20190411 102951 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190411 102951 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'CONNECT 19200\\r\\n'\n",
      "MSG 20190411 102957 CONNECT 19200\n",
      "MSG 20190411 102957 UNIT CONNECTED\n",
      "STATE is 5\n",
      "MSG 20190411 102957 BROADCAST\n",
      "b'Welcome to the CPF Server \\n'\n",
      "MSG 20190411 102958 Welcome to the CPF Server\n",
      "STATE is 5\n",
      "MSG 20190411 102958 BROADCAST\n",
      "b'\\runknown command: [\\x00]\\n'\n",
      "unknown command: [\u0000]\n",
      "STATE is 5\n",
      "MSG 20190411 102958 BROADCAST\n",
      "b'\\r:$ :$ :$ '\n",
      ":$ :$ :$0411 103009 \n",
      "STATE is 5\n",
      "MSG 20190411 103009 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103021 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103021 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103032 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103032 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103044 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103044 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103055 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103055 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103107 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103107 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103118 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103118 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103129 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103129 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103141 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103141 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103153 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103153 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103204 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103204 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103218 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103218 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190411 103228 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103242 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103242 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190411 103252 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190411 103302 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190411 103304 BROADCAST\n",
      "b'NO CARRIER\\r\\n'\n",
      "MSG 20190411 103304 NO CARRIER\n",
      "MSG 20190411 103304 NO CARRIER RXD\n",
      "STATE is 3\n",
      "MSG 20190411 103304 SEND CSQ\n",
      "STATE is 3\n",
      "b'+CSQ:3\\r\\n'\n",
      "MSG 20190411 103309 +CSQ:3\n",
      "CSQ 20190411 103309 3\n",
      "STATE is 4\n",
      "MSG 20190411 103310 DIALING\n",
      "b'OK\\r\\n'\n",
      "MSG 20190411 103310 OK\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "STATE is 4\n",
      "b'CONNECT 19200\\r\\n'\n",
      "MSG 20190411 103354 CONNECT 19200\n",
      "MSG 20190411 103354 UNIT CONNECTED\n",
      "STATE is 5\n",
      "MSG 20190411 103354 BROADCAST\n",
      "b'Welcome to the CPF Server \\n'\n",
      "MSG 20190411 103356 Welcome to the CPF Server\n",
      "STATE is 5\n",
      "MSG 20190411 103356 BROADCAST\n",
      "b'\\runknown command: [\\x00broadcast]\\n'\n",
      "unknown command: [\u0000broadcast]\n",
      "STATE is 5\n",
      "MSG 20190411 103356 BROADCAST\n",
      "b'\\r:$ :$ '\n",
      ":$ :$0190411 103407 \n",
      "STATE is 5\n",
      "MSG 20190411 103407 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103419 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103419 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103435 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103435 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103446 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103446 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103505 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103505 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103521 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103521 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103535 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103535 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103546 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103546 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103558 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103558 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103609 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103609 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103620 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103620 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103632 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103632 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103643 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103643 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103657 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103657 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103711 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103711 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103722 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103722 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103736 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103736 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103747 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103747 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103801 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103801 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103812 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103812 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103824 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103824 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103835 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103835 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103846 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103846 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103857 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103857 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103909 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103909 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103921 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103921 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103932 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103932 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103944 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103944 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 103955 :$\n",
      "STATE is 5\n",
      "MSG 20190411 103955 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 104006 :$\n",
      "STATE is 5\n",
      "MSG 20190411 104006 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 104018 :$\n",
      "STATE is 5\n",
      "MSG 20190411 104018 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 104029 :$\n",
      "STATE is 5\n",
      "MSG 20190411 104029 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 104041 :$\n",
      "STATE is 5\n",
      "MSG 20190411 104041 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 104052 :$\n",
      "STATE is 5\n",
      "MSG 20190411 104052 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 104104 :$\n",
      "STATE is 5\n",
      "MSG 20190411 104104 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 104115 :$\n",
      "STATE is 5\n",
      "MSG 20190411 104115 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 104127 :$\n",
      "STATE is 5\n",
      "MSG 20190411 104127 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 104143 :$\n",
      "STATE is 5\n",
      "MSG 20190411 104143 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 104159 :$\n",
      "STATE is 5\n",
      "MSG 20190411 104159 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190411 104209 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190411 104219 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190411 104230 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190411 104240 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 104253 :$\n",
      "STATE is 5\n",
      "MSG 20190411 104253 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 104305 :$\n",
      "STATE is 5\n",
      "MSG 20190411 104305 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 104316 :$\n",
      "STATE is 5\n",
      "MSG 20190411 104316 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 104330 :$\n",
      "STATE is 5\n",
      "MSG 20190411 104330 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 104341 :$\n",
      "STATE is 5\n",
      "MSG 20190411 104341 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190411 104351 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190411 104401 BROADCAST\n",
      "b':$ unknown command: [m]\\n'\n",
      "MSG 20190411 104410 :$ unknown command: [m]\n",
      "STATE is 5\n",
      "MSG 20190411 104410 BROADCAST\n",
      "b'\\r:$ :$ '\n",
      ":$ :$0190411 104422 \n",
      "STATE is 5\n",
      "MSG 20190411 104422 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 104433 :$\n",
      "STATE is 5\n",
      "MSG 20190411 104433 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 104444 :$\n",
      "STATE is 5\n",
      "MSG 20190411 104444 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 104455 :$\n",
      "STATE is 5\n",
      "MSG 20190411 104455 BROADCAST\n",
      "STATE is 5\n",
      "MSG 20190411 104506 BROADCAST\n",
      "b':$ :$ '\n",
      "MSG 20190411 104519 :$ :$\n",
      "STATE is 5\n",
      "MSG 20190411 104519 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 104531 :$\n",
      "STATE is 5\n",
      "MSG 20190411 104531 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 104542 :$\n",
      "STATE is 5\n",
      "MSG 20190411 104542 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 104554 :$\n",
      "STATE is 5\n",
      "MSG 20190411 104554 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 104605 :$\n",
      "STATE is 5\n",
      "MSG 20190411 104605 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 104621 :$\n",
      "STATE is 5\n",
      "MSG 20190411 104621 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 104632 :$\n",
      "STATE is 5\n",
      "MSG 20190411 104632 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 104644 :$\n",
      "STATE is 5\n",
      "MSG 20190411 104644 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 104655 :$\n",
      "STATE is 5\n",
      "MSG 20190411 104655 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 104706 :$\n",
      "STATE is 5\n",
      "MSG 20190411 104706 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 104717 :$\n",
      "STATE is 5\n",
      "MSG 20190411 104717 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 104729 :$\n",
      "STATE is 5\n",
      "MSG 20190411 104729 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 104740 :$\n",
      "STATE is 5\n",
      "MSG 20190411 104740 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 104751 :$\n",
      "STATE is 5\n",
      "MSG 20190411 104751 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 104803 :$\n",
      "STATE is 5\n",
      "MSG 20190411 104803 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 104814 :$\n",
      "STATE is 5\n",
      "MSG 20190411 104814 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 104825 :$\n",
      "STATE is 5\n",
      "MSG 20190411 104825 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 104837 :$\n",
      "STATE is 5\n",
      "MSG 20190411 104837 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 104849 :$\n",
      "STATE is 5\n",
      "MSG 20190411 104849 BROADCAST\n",
      "b':$ '\n",
      "MSG 20190411 104900 :$\n",
      "STATE is 5\n",
      "MSG 20190411 104900 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-45-bd942db66d28>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mdf1\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-44-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": [
    "df1 = serial_state_machine()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Load the CSV\n",
    "test_letter = 'O'\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": "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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
}
