'use strict'; goog.provide('Blockly.Python.bluetooth'); goog.require('Blockly.Python'); Blockly.Python['bluetooth_setup'] = function(block) { let baudNum = block.getFieldValue('BAUD'); Blockly.Python.addSetup('bluetooth_serial_begin', 'Serial1.begin(' + baudNum + ');', false); let receivedDo = Blockly.Python.statementToCode(block, 'RECEIVED_DO'); let option = block.getFieldValue('OPTIONS'); var cmdvar = Blockly.Python.variableDB_.getName( block.getFieldValue('CMDVAR'), Blockly.Variables.NAME_TYPE); let code = ""; if (option === "string") { code = "while (Serial1.available()) {\n" + " delay(10)\n" + " char c = Serial1.read()\n" + " " + cmdvar + " += c\n" + "}\n" + receivedDo + "\n" + cmdvar + " = \"\"\n"; } else if (option === "number") { code = "if (Serial1.available() > 0) {\n" + " " + cmdvar + " = Serial1.read()\n" + "}\n" + receivedDo; } else if (option === "array") { var length = block.getFieldValue("LENGTH"); var argument0 = '{'; for (var i = 0; i < length - 1; i++) argument0 += '0,'; argument0 += "0}" var decl = 'int ' + cmdvar + '[' + length + '] = ' + argument0 + '\n'; Blockly.Python.addDeclaration('bluetooth_list', decl); code = "int n = " + 'sizeof(' + cmdvar + ')/sizeof(' + cmdvar + '[0])\n' + "while (Serial1.available() < n) { }\n" + "for (int b_n = 0; b_n < n; b_n++) {\n" + " " + cmdvar + "[b_n] = Serial1.read()\n" + "}\n" + receivedDo; } return code; }; Blockly.Python['bluetooth_text_getCommand'] = function(block) { var code = Blockly.Python.variableDB_.getName(block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); return [code, Blockly.Python.ORDER_ATOMIC]; }; Blockly.Python['bluetooth_number_getCommand'] = function(block) { var code = Blockly.Python.variableDB_.getName(block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); return [code, Blockly.Python.ORDER_ATOMIC]; }; Blockly.Python['bluetooth_list_getCommand'] = function(block) { var variab = Blockly.Python.variableDB_.getName(block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); var index = block.getFieldValue("INDEX"); var code = variab + '[' + index + ']'; return [code, Blockly.Python.ORDER_ATOMIC]; }; Blockly.Python['bluetooth_intercomms_send'] = function(block) { var baud = block.getFieldValue("BAUD"); Blockly.Python.addDeclaration("BT_Serial_sendState", "int BTserialSendState = 0;"); Blockly.Python.addSetup('serial1', "Serial1.begin(" + baud + ");"); var BT_Serial_SendData = 'void BTserialSendData() {\n' + ' int BTserialDataLength = BTserialDataPackage().length() + 1\n' + ' char BTserialDataBuf[BTserialDataLength]\n' + ' BTserialDataPackage().toCharArray(BTserialDataBuf, BTserialDataLength)\n' + ' if ( BTserialSendState == 0 ) {\n' + ' Serial1.write(BTserialDataBuf)\n' + ' }\n' + ' if ( (millis() / 100) % 4 == 3 && BTserialSendState == 0) {\n' + // Send data set to WiFi Module.\n' ' Serial1.write(BTserialDataBuf)\n' + ' BTserialSendState = 1\n' + ' } else if ( (millis() / 100) % 4 == 1) {\n' + ' BTserialSendState = 0\n' + ' }\n' + '}\n'; Blockly.Python.addFunction("BTSerialSendData", BT_Serial_SendData); var item_value = '' var BTserial_DataPackage = 'String BTserialDataPackage() { \n' + ' String data = ""\n' + ' data += "SOF"\n' // Set up a "SOF" initializer for data validation usage. for (var n = 0; n < this.itemCount_; n++) { item_value = Blockly.Python.valueToCode(this, 'ADD' + n, Blockly.Python.ORDER_NONE) || '0'; BTserial_DataPackage += ' data += "|"\n data += ' + item_value + '\n' } BTserial_DataPackage += ' data += "|"\n data += "\\r\\n"\n ' + ' return data\n}\n'; Blockly.Python.addFunction("BTSerialDataPackage", BTserial_DataPackage); var code = ""; code += "BTserialSendData()\n"; return code; }; Blockly.Python['bluetooth_intercomms_receive'] = function(block) { var baud = block.getFieldValue("BAUD"); var timeout = block.getFieldValue("TIMEOUT"); Blockly.Python.addSetup('serial1_trans', "Serial1.begin(" + baud + ")\n Serial1.setTimeout(" + timeout + ");"); Blockly.Python.addDeclaration("BTserialDataReceived", 'String BTserialDataReceived\n'); var BTserial_DataFilter = 'int BTserialDataFilter() {\n' + ' if (Serial1.available() > 0) {\n' + ' BTserialDataReceived = Serial1.readStringUntil("\\r\\n")\n' + ' }\n' + ' if (BTgetSerialDataValue(BTserialDataReceived, \'|\', 0) == "SOF") {\n' + ' return 1\n' + ' } else {\n' + ' return 0\n' + ' }\n' + '}\n' Blockly.Python.addFunction("BTserialDataFilter", BTserial_DataFilter); var BTserial_getDataValue = 'String BTgetSerialDataValue(String data, char separator, int index)\n' + '{\n' + ' int found = 0\n' + ' int strIndex[] = {0, -1}\n' + ' int maxIndex = data.length() - 1\n' + ' for (int i = 0; i <= maxIndex && found <= index; i++) {\n' + ' if (data.charAt(i) == separator || i == maxIndex) {\n' + ' found++\n' + ' strIndex[0] = strIndex[1] + 1\n' + ' strIndex[1] = (i == maxIndex) ? i + 1 : i\n' + ' }\n' + ' }\n' + ' return found > index ? data.substring(strIndex[0], strIndex[1]) : ""\n' + '}\n' Blockly.Python.addFunction("BTgetSerialDataValue", BTserial_getDataValue); var code = 'boolean BTserialReceiveCheck_ = BTserialDataFilter()\n' + 'if (!BTserialReceiveCheck_) {\n' + ' Serial.println("Error receiving data from Bluetooth Module.")\n' + ' return\n' + ' }\n' return code; }; Blockly.Python['bluetooth_intercomms_receive_getData'] = function(block) { var index = parseInt(block.getFieldValue("INDEX")) + 1; var type = block.getFieldValue("TYPE") var code = "BTgetSerialDataValue(BTserialDataReceived, '|', " + index + ")" + type; return [code, Blockly.Python.ORDER_ATOMIC]; }; /******************************** */ Blockly.Python['bluetooth_intercomms_send_old'] = function(block) { var checkbit = "#define SOP '<'\n" + "#define EOP '>'\n"; Blockly.Python.addDeclaration("wifi_dataTransfer_checkbit", checkbit); var baud = block.getFieldValue("BAUD") Blockly.Python.addSetup('mainwifi_setup', "Serial1.begin(" + baud + ");"); // var datavar = Blockly.Python.variableDB_.getName( // block.getFieldValue('dataVar'), Blockly.Variables.NAME_TYPE); var length = block.itemCount_; var dataLength = length + "+2"; var code = "unsigned char DataOut_[" + dataLength + "]\n" + "DataOut_[0] = SOP\n" for (let i = 1; i < length + 1; i++) { var data_item = Blockly.Python.valueToCode(block, "ADD" + (i - 1), Blockly.Python.ORDER_ATOMIC) || 0; code += "DataOut_[" + i + "] = " + data_item + "\n" } code += "DataOut_[" + length + "+1] = EOP\n" + "Serial1.write(DataOut_, " + dataLength + ")\n" + "delay(50)\n"; return code; }; Blockly.Python['bluetooth_intercomms_receive_old'] = function(block) { var checkbit = "#define SOP '<'\n" + "#define EOP '>'\n"; Blockly.Python.addDeclaration("wifi_dataTransfer_checkbit", checkbit); var length = block.getFieldValue("LENGTH"); var baud = block.getFieldValue("BAUD") Blockly.Python.addSetup('mainwifi_setup', "Serial1.begin(" + baud + ");"); var MsgReceiveStatus = "bool started = false\n" + "bool ended = false\n" + "int index_i\n"; Blockly.Python.addDeclaration("wifi_dataTransfer_MsgReceiveStatus", MsgReceiveStatus); Blockly.Python.addDeclaration("BT_interCommms_receive", "int BTIC_receive[" + length + "] = {0};"); var datavar = "BTIC_receive" var dataIn_function = "int handleDataIn() {\n" + " while (Serial1.available() > 0) {\n" + " int inChar = Serial1.read()\n" + " if(inChar == SOP) {\n" + " index_i = 0\n" + " started = true\n" + " ended = false\n" + " } else if(inChar == EOP) {\n" + " ended = true\n" + " break\n" + " }else if((index_i < " + length + ")&&started&&(!ended)) {\n" + " " + datavar + "[index_i] = inChar\n" + " index_i++\n" + " }\n" + " }\n" + " if(started && ended) {\n" + " return 1\n" + " } else {\n" + " return 0\n" + " }\n" + "}\n"; Blockly.Python.addFunction("mainwifi_dataIn_function", dataIn_function); var code = "boolean receiveMsgsuccess_ = handleDataIn()\n"; return code; }; Blockly.Python['bluetooth_intercomms_receive_getData_old'] = function(block) { var index = block.getFieldValue("INDEX"); var code = "BTIC_receive[" + index + "]"; return [code, Blockly.Python.ORDER_ATOMIC]; }; /******************************** */ Blockly.Python['bluetooth_at_slave'] = function(block) { var baud = block.getFieldValue("BAUD") var BT_at_slave_decl = 'int bluetoothATModeserialSendState = 0\n' + 'char c = \' \'\n'; Blockly.Python.addDeclaration("BT_at_slave_decl", BT_at_slave_decl); var BT_at_slave_setup = ' Serial.begin(' + baud + ')\n' + ' Serial1.begin(38400)\n' Blockly.Python.addSetup("BT_at_slave_setup", BT_at_slave_setup); var BT_at_slave_func = 'void bluetoothATModeInteractive() {\n' + ' while (Serial1.available() > 0) {\n' + ' c = Serial1.read()\n' + ' Serial.write(c)\n' + ' }\n' + ' while (Serial.available() > 0) {\n' + ' c = Serial.read()\n' + ' Serial1.write(c)\n' + ' }\n' + '}\n' Blockly.Python.addFunction("BT_at_slave_func", BT_at_slave_func); var code = ' bluetoothATModeInteractive()\n' + ' // Slave\n' + ' if ( (millis() / 1000) % 50 == 5 && bluetoothATModeserialSendState == 0) {\n' + ' Serial.println(" ____ _ _ _ _ ")\n' + ' Serial.println(" | __ ) | | _ _ ___ | |_ ___ ___ | |_ | |__ ")\n' + ' Serial.println(" | _ \\ | | | | | | / _ \\ | __| / _ \\ / _ \\ | __| | \'_ \\ ")\n' + ' Serial.println(" | |_) | | | | |_| | | __/ | |_ | (_) | | (_) | | |_ | | | |")\n' + ' Serial.println(" |____/ |_| \\__,_| \\___| \\__| \\___/ \\___/ \\__| |_| |_|")\n' + ' Serial.println("")\n' + ' Serial.println(" ____ _ ")\n' + ' Serial.println(" / ___| | | __ _ __ __ ___ ")\n' + ' Serial.println(" \\___ \\ | | / _` | \\ \\ / / / _ ")\n' + ' Serial.println(" ___) | | | | (_| | \\ V / | __/")\n' + ' Serial.println(" |____/ |_| \\__,_| \\_/ \\___|")\n' + ' Serial.println("")\n' + ' Serial.println("")\n' + ' Serial.println("1. Testing communication:")\n' + ' Serial.print("- ")\n' + ' Serial1.write("AT\\r\\n")\n' + ' bluetoothATModeserialSendState = 1\n' + ' } else if ( (millis() / 1000) % 50 == 6) {\n' + ' bluetoothATModeserialSendState = 0\n' + ' }\n' + ' if ( (millis() / 1000) % 50 == 7 && bluetoothATModeserialSendState == 0) {\n' + ' Serial.println("")\n' + ' Serial.println("2. Reset previous configuration:")\n' + ' Serial.print("- ")\n' + ' Serial1.write("AT+ORGL\\r\\n")\n' + ' bluetoothATModeserialSendState = 1\n' + ' } else if ( (millis() / 1000) % 50 == 8) {\n' + ' bluetoothATModeserialSendState = 0\n' + ' }\n' + ' if ( (millis() / 1000) % 50 == 10 && bluetoothATModeserialSendState == 0) {\n' + ' Serial.println("")\n' + ' Serial.println("3. Set up UART configuration: AT+UART=' + baud + ',0,0")\n' + ' Serial.print("- ")\n' + ' Serial1.write("AT+UART=' + baud + ',0,0\\r\\n")\n' + ' bluetoothATModeserialSendState = 1\n' + ' } else if ( (millis() / 1000) % 50 == 11) {\n' + ' bluetoothATModeserialSendState = 0\n' + ' }\n' + ' if ( (millis() / 1000) % 50 == 13 && bluetoothATModeserialSendState == 0) {\n' + ' Serial.println("")\n' + ' Serial.println("4. Set up pairing mode, prevent outside connection: AT+CMODE=0")\n' + ' Serial.print("- ")\n' + ' Serial1.write("AT+CMODE=0\\r\\n")\n' + ' bluetoothATModeserialSendState = 1\n' + ' } else if ( (millis() / 1000) % 50 == 14) {\n' + ' bluetoothATModeserialSendState = 0\n' + ' }\n' + ' if ( (millis() / 1000) % 50 == 16 && bluetoothATModeserialSendState == 0) {\n' + ' Serial.println("")\n' + ' Serial.println("5. Set up pairing mode, set as Slave Mode: AT+ROLE=0")\n' + ' Serial.print("- ")\n' + ' Serial1.write("AT+ROLE=0\\r\\n")\n' + ' bluetoothATModeserialSendState = 1\n' + ' } else if ( (millis() / 1000) % 50 == 17) {\n' + ' bluetoothATModeserialSendState = 0\n' + ' }\n' + ' if ( (millis() / 1000) % 50 == 18 && bluetoothATModeserialSendState == 0) {\n' + ' Serial.println("")\n' + ' Serial.println("6. Getting MAC address:")\n' + ' Serial.print("- ")\n' + ' Serial1.write("AT+ADDR\\r\\n")\n' + ' bluetoothATModeserialSendState = 1\n' + ' } else if ( (millis() / 1000) % 50 == 19) {\n' + ' bluetoothATModeserialSendState = 0\n' + ' }\n' + ' if ( (millis() / 1000) % 50 == 21 && bluetoothATModeserialSendState == 0) {\n' + ' Serial.println("")\n' + ' Serial.println("7. Done, reset bluetooth module to normal state.")\n' + ' Serial.print("- ")\n' + ' Serial1.write("AT+RESET\\r\\n")\n' + ' bluetoothATModeserialSendState = 1\n' + ' } else if ( (millis() / 1000) % 50 == 22) {\n' + ' bluetoothATModeserialSendState = 0\n' + ' }\n' return code; } Blockly.Python['bluetooth_at_master'] = function(block) { var baud = block.getFieldValue("BAUD"); var addr = block.getFieldValue("ADDR").replace(/:/g, ","); var BT_at_master_decl = 'int bluetoothATModeserialSendState = 0\n' + 'char c = \' \'\n' Blockly.Python.addDeclaration("BT_at_master_decl", BT_at_master_decl); var BT_at_master_setup = ' Serial.begin(' + baud + ')\n' + ' Serial1.begin(38400)\n'; Blockly.Python.addSetup("BT_at_master_setup", BT_at_master_setup); var BT_at_master_fun = 'void bluetoothATModeInteractive() {\n' + ' while (Serial1.available() > 0) {\n' + ' c = Serial1.read()\n' + ' Serial.write(c)\n' + ' }\n' + ' while (Serial.available() > 0) {\n' + ' c = Serial.read()\n' + ' Serial1.write(c)\n' + ' }\n' + '}\n'; Blockly.Python.addFunction("BT_at_master_fun", BT_at_master_fun) var code = ' bluetoothATModeInteractive()\n' + ' // Master\n' + ' if ( (millis() / 1000) % 50 == 5 && bluetoothATModeserialSendState == 0) {\n' + ' Serial.println(" ____ _ _ _ _ ")\n' + ' Serial.println(" | __ ) | | _ _ ___ | |_ ___ ___ | |_ | |__ ")\n' + ' Serial.println(" | _ \\ | | | | | | / _ \\ | __| / _ \\ / _ \\ | __| | \'_ \\ ")\n' + ' Serial.println(" | |_) | | | | |_| | | __/ | |_ | (_) | | (_) | | |_ | | | |")\n' + ' Serial.println(" |____/ |_| \\__,_| \\___| \\__| \\___/ \\___/ \\__| |_| |_|")\n' + ' Serial.println("")\n' + ' Serial.println(" __ __ _ ")\n' + ' Serial.println(" | \\/ | __ _ ___ | |_ ___ _ __ ")\n' + ' Serial.println(" | |\\/| | / _` | / __| | __| / _ \\ | \'__|")\n' + ' Serial.println(" | | | | | (_| | \\__ \\ | |_ | __/ | | ")\n' + ' Serial.println(" |_| |_| \\__,_| |___/ \\__| \\___| |_| ")\n' + ' Serial.println("")\n' + ' Serial.println("")\n' + ' Serial.println("1. Testing communication:")\n' + ' Serial.print("- ")\n' + ' Serial1.write("AT\\r\\n")\n' + ' bluetoothATModeserialSendState = 1\n' + ' } else if ( (millis() / 1000) % 50 == 6) {\n' + ' bluetoothATModeserialSendState = 0\n' + ' }\n' + ' if ( (millis() / 1000) % 50 == 7 && bluetoothATModeserialSendState == 0) {\n' + ' Serial.println("")\n' + ' Serial.println("2. Reset previous configuration:")\n' + ' Serial.print("- ")\n' + ' Serial1.write("AT+ORGL\\r\\n")\n' + ' bluetoothATModeserialSendState = 1\n' + ' } else if ( (millis() / 1000) % 50 == 8) {\n' + ' bluetoothATModeserialSendState = 0\n' + ' }\n' + ' if ( (millis() / 1000) % 50 == 10 && bluetoothATModeserialSendState == 0) {\n' + ' Serial.println("")\n' + ' Serial.println("3. Set up UART configuration: AT+UART=' + baud + ',0,0")\n' + ' Serial.print("- ")\n' + ' Serial1.write("AT+UART=' + baud + ',0,0\\r\\n")\n' + ' bluetoothATModeserialSendState = 1\n' + ' } else if ( (millis() / 1000) % 50 == 11) {\n' + ' bluetoothATModeserialSendState = 0\n' + ' }\n' + ' if ( (millis() / 1000) % 50 == 13 && bluetoothATModeserialSendState == 0) {\n' + ' Serial.println("")\n' + ' Serial.println("4. Set up pairing mode, prevent outside connection: AT+CMODE=0")\n' + ' Serial.print("- ")\n' + ' Serial1.write("AT+CMODE=0\\r\\n")\n' + ' bluetoothATModeserialSendState = 1\n' + ' } else if ( (millis() / 1000) % 50 == 14) {\n' + ' bluetoothATModeserialSendState = 0\n' + ' }\n' + ' if ( (millis() / 1000) % 50 == 16 && bluetoothATModeserialSendState == 0) {\n' + ' Serial.println("")\n' + ' Serial.println("5. Set up pairing mode, set as Master Mode: AT+ROLE=1")\n' + ' Serial.print("- ")\n' + ' Serial1.write("AT+ROLE=1\\r\\n")\n' + ' bluetoothATModeserialSendState = 1\n' + ' } else if ( (millis() / 1000) % 50 == 17) {\n' + ' bluetoothATModeserialSendState = 0\n' + ' }\n' + ' if ( (millis() / 1000) % 50 == 18 && bluetoothATModeserialSendState == 0) {\n' + ' Serial.println("")\n' + ' Serial.println("6. Binding slave device:")\n' + ' Serial.print("- ")\n' + ' Serial1.write("AT+BIND=' + addr + '\\r\\n")\n' + ' bluetoothATModeserialSendState = 1\n' + ' } else if ( (millis() / 1000) % 50 == 19) {\n' + ' bluetoothATModeserialSendState = 0\n' + ' }\n' + ' if ( (millis() / 1000) % 50 == 21 && bluetoothATModeserialSendState == 0) {\n' + ' Serial.println("")\n' + ' Serial.println("7. Done, reset bluetooth module to normal state.")\n' + ' Serial.print("- ")\n' + ' Serial1.write("AT+RESET\\r\\n")\n' + ' bluetoothATModeserialSendState = 1\n' + ' } else if ( (millis() / 1000) % 50 == 22) {\n' + ' bluetoothATModeserialSendState = 0\n' + ' }\n' return code; } Blockly.Python['bluetooth_at_interaction'] = function(block) { var dropdown_name = block.getFieldValue('bluetooth_at_interaction_baud'); Blockly.Python.addDeclaration('bluetooth_at_interaction_declare', 'char c = \' \'\n'); Blockly.Python.addSetup('bluetooth_at_interaction_setup', '' + 'Serial.begin(' + dropdown_name + ')\n' + 'Serial1.begin(' + dropdown_name + ')\n' + ''); Blockly.Python.addFunction('bluetooth_at_interaction_function', '' + 'void _bluetoothATmode() {\n' + ' if (Serial1.available())\n' + ' Serial.write(Serial1.read())\n' + ' if (Serial.available())\n' + ' Serial1.write(Serial.read())\n' + '}\n' + ''); var code = '_bluetoothATmode()\n'; return code; };