Advertisement
coccodrilloo

Telegram with Microbit

Feb 1st, 2023
640
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.89 KB | None | 0 0
  1. from microbit import *
  2. import music
  3.  
  4. WORD_LIMIT = 20
  5.  
  6. EOL = "\n"
  7. WORDS_PER_MINUTE = 10
  8. DOT_TIME = 1200/WORDS_PER_MINUTE
  9. DASH_TIME = DOT_TIME * 3
  10. MARK_SPACE =  DOT_TIME
  11. SIGNAL_SPACE = DOT_TIME * 3
  12. WORD_SPACE = DOT_TIME * 7
  13.  
  14.  
  15. DOT_TIME_MIN =  DOT_TIME/4
  16. DOT_TIME_MAX = DASH_TIME/2
  17.  
  18. DASH_TIME_MIN = DOT_TIME_MAX
  19. DASH_TIME_MAX = DASH_TIME + (DOT_TIME * 2)
  20.  
  21. SIGNAL_SPACE_MIN = SIGNAL_SPACE * 3
  22. SIGNAL_SPACE_MAX = WORD_SPACE * 3
  23. WORD_SPACE_MIN = SIGNAL_SPACE_MAX
  24.  
  25.  
  26. DOT = "."  
  27. DASH = "-"  
  28. SPACE = " "
  29. WORD = "|"
  30.  
  31.  
  32. mark_has_begun = False
  33. mark_start_time = running_time()
  34. space_has_begun = False
  35. space_start_time = running_time()
  36. message = list()
  37.  
  38.  
  39. is_serial_receive_mode = False
  40.  
  41. def not_at_max_message_length():
  42.    
  43.     global message
  44.     return message.count(SPACE) < WORD_LIMIT
  45.  
  46. def clear_extra_space():
  47.    
  48.     global message
  49.     if len(message) == 1 and message[0] == SPACE:
  50.         message.clear()
  51.  
  52. def display_dot_dash():
  53.    
  54.     mark_interval = running_time() - mark_start_time
  55.  
  56.     if mark_interval < DOT_TIME_MAX:
  57.         display.set_pixel(2,2,9)
  58.     elif mark_interval >= DASH_TIME_MIN and mark_interval < DASH_TIME_MAX:
  59.         display.set_pixel(1,2,9)
  60.         display.set_pixel(2,2,9)
  61.         display.set_pixel(3,2,9)
  62.     elif mark_interval >= DASH_TIME_MAX:
  63.         display.show(Image.NO)
  64.  
  65. def process_mark_time():
  66.    
  67.     global mark_has_begun, mark_start_time
  68.     if not mark_has_begun: return
  69.  
  70.     clear_extra_space()
  71.  
  72.     mark_interval = running_time() - mark_start_time
  73.  
  74.     if mark_interval > DOT_TIME_MIN and mark_interval < DOT_TIME_MAX:
  75.         message.append(DOT)
  76.         space_start_time = running_time()
  77.     elif mark_interval > DASH_TIME_MIN and mark_interval < DASH_TIME_MAX:
  78.         message.append(DASH)
  79.         space_start_time = running_time()
  80.  
  81.     mark_has_begun = False
  82.    
  83. def message_has_first_mark():
  84.    
  85.     return len(message) > 0 and message[0] != SPACE
  86.  
  87. def process_space_time():
  88.    
  89.     global space_has_begun, space_start_time, mark_start_time
  90.     if not message_has_first_mark(): return
  91.  
  92.     if not space_has_begun:
  93.         space_start_time = running_time()
  94.         return  
  95.  
  96.     space_interval = running_time() - space_start_time
  97.     if space_interval > SIGNAL_SPACE_MIN and space_interval < SIGNAL_SPACE_MAX:
  98.  
  99.         if len(message) > 0 and not message[len(message)-1] == SPACE and not message[len(message)-1] == SPACE:
  100.             message.append(SPACE)        
  101.     if space_interval > WORD_SPACE_MIN:
  102.  
  103.         if len(message) > 0 and not message[len(message)-1] == WORD:
  104.             message.append(WORD)
  105.  
  106.     space_has_begun = False
  107.  
  108. def encode_keyed_morse_code():
  109.    
  110.     global mark_has_begun, mark_start_time, message, space_start_time, space_has_begun
  111.  
  112.     button_pressed = button_a.is_pressed() or (pin1.read_digital() == 1)
  113.     if len(message) == 0: space_has_begun = False
  114.  
  115.     if button_pressed:
  116.         if not mark_has_begun:
  117.             mark_start_time = running_time()
  118.             mark_has_begun = True
  119.  
  120.         display_dot_dash()
  121.         music.pitch(800,duration=-1,wait=False)
  122.  
  123.         if not_at_max_message_length():
  124.             process_space_time()
  125.     else:
  126.         display.clear()
  127.         music.stop()
  128.  
  129.         if not space_has_begun:
  130.             space_start_time = running_time()
  131.             space_has_begun = True
  132.         if not_at_max_message_length():
  133.             process_mark_time()
  134.  
  135. def display_character(character):
  136.    
  137.     if character == DASH:
  138.         display.set_pixel(1,2,9)
  139.         display.set_pixel(2,2,9)
  140.         display.set_pixel(3,2,9)
  141.         music.pitch(800,duration=int(round(DASH_TIME)),wait=True)
  142.         display.clear()
  143.         sleep(MARK_SPACE)
  144.  
  145.     if character == DOT:
  146.         display.set_pixel(2,2,9)
  147.         music.pitch(800,duration=int(round(DOT_TIME)),wait=True)
  148.         display.clear()
  149.         sleep(MARK_SPACE)
  150.  
  151.     if character == SPACE:
  152.         display.clear()
  153.         sleep(WORD_SPACE)
  154.  
  155.  
  156. def process_incoming_serial_data():
  157.    
  158.     global message, is_serial_receive_mode, mark_has_begun
  159.     parsed_data = ""
  160.    
  161.     while uart.any() is True and not "\n" in parsed_data:
  162.         parsed_data += str(uart.readline(), "utf-8", "ignore")
  163.         sleep(10)
  164.  
  165.     if parsed_data:
  166.         process_message_list = parsed_data.rstrip('\n').split(',')
  167.         try:
  168.             is_serial_receive_mode = ("1" == process_message_list[0])
  169.             if not is_serial_receive_mode or ("1" == process_message_list[2]):
  170.                 mark_has_begun = False
  171.  
  172.             if process_message_list[2]:
  173.                 message.clear()
  174.  
  175.             if (process_message_list[1] == "1") and is_serial_receive_mode:
  176.                 saw_word = False
  177.  
  178.                 for message_string in process_message_list[3:]:
  179.                     if "\n" in message_string:
  180.                         break
  181.  
  182.                     if len(message_string) == 0:
  183.                         if not saw_word: display_character(WORD)
  184.                         saw_word = True
  185.                     else:
  186.                         for character in message_string:
  187.                             display_character(character)
  188.                             saw_word = False
  189.  
  190.                         display_character(SPACE)
  191.  
  192.  
  193.         except IndexError:
  194.             return
  195.  
  196.  
  197. uart.init(baudrate=9600)
  198. uart.write(EOL+",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"+EOL)
  199. last_message_length = 0
  200.  
  201. while True:
  202.     if not is_serial_receive_mode: encode_keyed_morse_code()
  203.     process_incoming_serial_data()
  204.     if last_message_length != len(message) and not is_serial_receive_mode:
  205.         for character in message:
  206.             if character == SPACE:
  207.                 uart.write(",")
  208.             elif character == WORD:
  209.                 uart.write(", ,")
  210.             else:
  211.                 uart.write(character)
  212.  
  213.         uart.write(EOL)        
  214.         last_message_length = len(message)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement