{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "29e43a9b-4fe9-4fa4-83fc-8bc7cc733914",
   "metadata": {},
   "source": [
    "# a morse code tree"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "85da8440-0286-4fc5-8009-a1dbbbeaf195",
   "metadata": {},
   "outputs": [],
   "source": [
    "# https://www.101computing.net/morse-code-using-a-binary-tree/"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "id": "18c38e4e-67f6-4814-a9ee-014af7b231dd",
   "metadata": {},
   "outputs": [],
   "source": [
    "# modified left and right pointers to dot and dash\n",
    "class Node:\n",
    "    def __init__(self, value, dot=None, dash=None):\n",
    "        self.value = value\n",
    "        self.dot = dot\n",
    "        self.dash = dash"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "id": "93595ce3-cbd6-4b58-ad8d-b25d89a14b11",
   "metadata": {},
   "outputs": [],
   "source": [
    "def getMorseCode(node, character, code):\n",
    "    if node==None:\n",
    "        return False\n",
    "    elif node.value==character:\n",
    "        # return to end program\n",
    "        return True\n",
    "    # keep traversing when the pointer is not pointing to null\n",
    "    else:  \n",
    "        if getMorseCode(node.dot,character,code)==True:\n",
    "          code.insert(0,\".\")\n",
    "          return True\n",
    "        elif getMorseCode(node.dash,character,code)==True:\n",
    "          code.insert(0,\"-\")\n",
    "          return True"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "id": "1da7f6e4-114b-4087-a777-65a21525a51b",
   "metadata": {},
   "outputs": [],
   "source": [
    "# printing tree utility \n",
    "# this segment is modified from Shubham Singh(SHUBHAMSINGH10)'s contribution \n",
    "\n",
    "# spacer\n",
    "COUNT = [10]\n",
    "\n",
    "# print a flat lying tree\n",
    "# speculation： this is a recursion that prints the right leaf until there is nothing left\n",
    "def print2DUtil_flat(root, space) :\n",
    "    # Base case\n",
    "    if (root == None) :\n",
    "        return\n",
    "    # Increase distance between levels\n",
    "    space += COUNT[0]\n",
    "    # Process right leaf/branch/child first\n",
    "    print2DUtil_flat(root.dash, space)\n",
    "    print()\n",
    "    for i in range(COUNT[0], space):\n",
    "        print(end = \" \")\n",
    "    print(root.value)\n",
    "    \n",
    "    #for i in range(COUNT[0], space):\n",
    "    #    print(end = \" \")\n",
    "    #print(root.letter) \n",
    "    #print(root.value)\n",
    "    # Process left child\n",
    "    print2DUtil_flat(root.dot, space)\n",
    "\n",
    "    # Wrapper over print2DUtil()\n",
    "def print2D(root) :\n",
    "    #Pass initial space count as 0\n",
    "    print(\"here is a tree that's laying on the ground: \")\n",
    "    print2DUtil_flat(root, 0)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "id": "c0e844a1-3d41-40e5-afde-9ff16de294d9",
   "metadata": {},
   "outputs": [],
   "source": [
    "#Let's initialise our binary tree:\n",
    "tree = Node(\"START\") #The root node of our binary tree\n",
    "\n",
    "# 1st Level\n",
    "tree.dot = Node(\"E\")\n",
    "tree.dash = Node(\"T\")\n",
    "\n",
    "# 2nd Level\n",
    "tree.dot.dot = Node(\"I\")\n",
    "tree.dot.dash = Node(\"A\")\n",
    "tree.dash.dot = Node(\"N\")\n",
    "tree.dash.dash = Node(\"M\")\n",
    "\n",
    "# 3rd Level\n",
    "tree.dot.dot.dot = Node(\"S\")\n",
    "tree.dot.dot.dash = Node(\"U\")\n",
    "tree.dot.dash.dot = Node(\"R\")\n",
    "tree.dot.dash.dash = Node(\"W\")\n",
    "\n",
    "tree.dash.dot.dot = Node(\"D\")\n",
    "tree.dash.dot.dash = Node(\"K\")\n",
    "tree.dash.dash.dot = Node(\"G\")\n",
    "tree.dash.dash.dash = Node(\"O\")\n",
    "\n",
    "# 4th Level\n",
    "tree.dot.dot.dot.dot = Node(\"H\")\n",
    "tree.dot.dot.dot.dash = Node(\"V\")\n",
    "tree.dot.dot.dash.dot = Node(\"F\")\n",
    "tree.dot.dot.dash.dash = Node(\"\")\n",
    "tree.dot.dash.dot.dot = Node(\"L\")\n",
    "tree.dot.dash.dot.dash = Node(\"\")\n",
    "tree.dot.dash.dash.dot = Node(\"P\")\n",
    "tree.dot.dash.dash.dash = Node(\"J\")\n",
    "\n",
    "tree.dash.dot.dot.dot = Node(\"B\")\n",
    "tree.dash.dot.dot.dash = Node(\"X\")\n",
    "tree.dash.dot.dash.dot = Node(\"C\")\n",
    "tree.dash.dot.dash.dash = Node(\"Y\")\n",
    "tree.dash.dash.dot.dot = Node(\"Z\")\n",
    "tree.dash.dash.dot.right = Node(\"Q\")\n",
    "tree.dash.dash.dash.dot = Node(\"\")\n",
    "tree.dash.dash.dash.dash = Node(\"\")\n",
    "\n",
    "# how to insert letters without entering one by one? use what structure?\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "id": "be1252af-f941-47c1-a717-dd04f53e0c68",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "here is a tree that's laying on the ground: \n",
      "\n",
      "                                        \n",
      "\n",
      "                              O\n",
      "\n",
      "                                        \n",
      "\n",
      "                    M\n",
      "\n",
      "                              G\n",
      "\n",
      "                                        Z\n",
      "\n",
      "          T\n",
      "\n",
      "                                        Y\n",
      "\n",
      "                              K\n",
      "\n",
      "                                        C\n",
      "\n",
      "                    N\n",
      "\n",
      "                                        X\n",
      "\n",
      "                              D\n",
      "\n",
      "                                        B\n",
      "\n",
      "START\n",
      "\n",
      "                                        J\n",
      "\n",
      "                              W\n",
      "\n",
      "                                        P\n",
      "\n",
      "                    A\n",
      "\n",
      "                                        \n",
      "\n",
      "                              R\n",
      "\n",
      "                                        L\n",
      "\n",
      "          E\n",
      "\n",
      "                                        \n",
      "\n",
      "                              U\n",
      "\n",
      "                                        F\n",
      "\n",
      "                    I\n",
      "\n",
      "                                        V\n",
      "\n",
      "                              S\n",
      "\n",
      "                                        H\n"
     ]
    }
   ],
   "source": [
    "# print morse code tree configuration\n",
    "print2D(tree)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "id": "c9e6e242-c742-416e-b2cb-550d4e7a8ff2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      "Enter a message to convert into Morse Code: (e.g. SOS) hwllo\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      ".... .-- .-.. .-.. --- \n"
     ]
    }
   ],
   "source": [
    "#Message Input\n",
    "message = input(\"Enter a message to convert into Morse Code: (e.g. SOS)\").upper()\n",
    "morseCode = \"\"\n",
    "\n",
    "#Convert the message, one character at a time!\n",
    "for character in message:\n",
    "    dotsdashes = []\n",
    "    getMorseCode(tree,character,dotsdashes)\n",
    "    code = \"\".join(dotsdashes)\n",
    "    morseCode = morseCode + code + \" \"\n",
    "print(morseCode)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "93252875-0f4f-40f8-af62-b027f916eb60",
   "metadata": {},
   "source": [
    "# todo \n",
    "modify the tree print out to show the dots and dashes \n",
    "take a user input in morse code, and use the binary tree to decode the message one character at a time\n",
    "translate the dot dash signals into other forms of pulsations: LED light, sound to be sent out via radio signal, ?FSK (written on the code memo)\n",
    "would be nice to emphasize the traversal aspect, can it be displayed / heard - traversing to the dot! traversing to the dash! make it procedural -> maybe console can be helpful "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ddeba74b-f6bc-4e06-ab2b-3b176a485bc9",
   "metadata": {},
   "outputs": [],
   "source": [
    "# reference project\n",
    "# https://microbit-micropython.readthedocs.io/en/latest/tutorials/radio.html\n",
    "# https://new.pythonforengineers.com/blog/audio-and-digital-signal-processingdsp-in-python/"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "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.10.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
