UNPKG

@mixly/arduino-avr

Version:
697 lines (648 loc) 31.6 kB
import { Profile } from 'mixly'; export const ir_recv = function (_, generator) { /*var xmlDom = Blockly.Xml.workspaceToDom(Mixly.Editor.blockEditor); var xmlText = Blockly.Xml.domToPrettyText(xmlDom); if (xmlText.indexOf("type=\"controls_tone\"") === -1 && xmlText.indexOf("type=\"controls_notone\"") === -1) { this.setWarningText(null); } else { this.setWarningText(Blockly.Msg.IR_AND_TONE_WARNING); }*/ var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC); var branch = generator.statementToCode(this, 'DO'); var branch2 = generator.statementToCode(this, 'DO2'); generator.definitions_['include_IRremote'] = '#include <IRremote.h>\n'; generator.definitions_['var_declare_irProtocolList'] = `const String IR_PROTOCOL_TYPE[] = { "UNKNOWN", "PULSE_DISTANCE", "PULSE_WIDTH", "DENON", "DISH", "JVC", "LG", "LG2", "NEC", "PANASONIC", "KASEIKYO", "KASEIKYO_JVC", "KASEIKYO_DENON", "KASEIKYO_SHARP", "KASEIKYO_MITSUBISHI", "RC5", "RC6", "SAMSUNG", "SHARP", "SONY", "ONKYO", "APPLE", "BOSEWAVE", "LEGO_PF", "MAGIQUEST", "WHYNTER" };`; generator.definitions_['var_declare_irrecv_' + dropdown_pin] = `IRrecv irrecv_${dropdown_pin}(${dropdown_pin});\n`; generator.setups_['setup_ir_recv_' + dropdown_pin] = `irrecv_${dropdown_pin}.enableIRIn();`; var code = `if (irrecv_${dropdown_pin}.decode()) { struct IRData *pIrData = &irrecv_${dropdown_pin}.decodedIRData; long ir_item = pIrData->decodedRawData; String irProtocol = IR_PROTOCOL_TYPE[pIrData->protocol]; Serial.print("IR TYPE:" + irProtocol + "\\tVALUE:"); Serial.println(ir_item, HEX); irrecv_${dropdown_pin}.resume(); ${branch} } else { ${branch2} }\n`; return code; }; export const ir_recv_enable = function (_, generator) { /*var xmlDom = Blockly.Xml.workspaceToDom(Mixly.Editor.blockEditor); var xmlText = Blockly.Xml.domToPrettyText(xmlDom); if (xmlText.indexOf("type=\"controls_tone\"") == -1 && xmlText.indexOf("type=\"controls_notone\"") == -1) { this.setWarningText(null); } else { this.setWarningText(Blockly.Msg.IR_AND_TONE_WARNING); }*/ generator.definitions_['include_IRremote'] = '#include <IRremote.h>'; var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC); var code = 'irrecv_' + dropdown_pin + '.enableIRIn();\n'; return code; } export const ir_send_nec = function (_, generator) { var pin = this.getFieldValue('PIN'); generator.definitions_['include_IRremote'] = '#include <IRremote.h>\n'; generator.definitions_['var_declare_ir_send_' + pin] = `IRsend irsend_${pin}(${pin});`; var data = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC) || '0'; var bits = generator.valueToCode(this, 'bits', generator.ORDER_ATOMIC) || '0'; var type = this.getFieldValue('TYPE'); var code = `irsend_${pin}.send${type}(${data},${bits});\n`; return code; } export const ir_recv_raw = function (_, generator) { /*var xmlDom = Blockly.Xml.workspaceToDom(Mixly.Editor.blockEditor); var xmlText = Blockly.Xml.domToPrettyText(xmlDom); if (xmlText.indexOf("type=\"controls_tone\"") == -1 && xmlText.indexOf("type=\"controls_notone\"") == -1) { this.setWarningText(null); } else { this.setWarningText(Blockly.Msg.IR_AND_TONE_WARNING); }*/ var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC); generator.definitions_['include_IRremote'] = '#include <IRremote.h>\n'; generator.definitions_['var_declare_ir_recv' + dropdown_pin] = 'IRrecv irrecv_' + dropdown_pin + '(' + dropdown_pin + ');\ndecode_results results_' + dropdown_pin + ';\n'; if (!generator.setups_['setup_serial_Serial']) { generator.setups_['setup_serial_Serial'] = 'Serial.begin(' + Profile.default.serial + ');'; } generator.setups_['setup_ir_recv_' + dropdown_pin] = 'irrecv_' + dropdown_pin + '.enableIRIn();\n'; var code = "if (irrecv_" + dropdown_pin + ".decode(&results_" + dropdown_pin + ")) {\n" code += ' ' + 'dumpRaw(&results_' + dropdown_pin + ');\n'; code += ' irrecv_' + dropdown_pin + '.resume();\n' code += '}\n'; var funcode = 'void dumpRaw(decode_results *results) {\n' + ' int count = results->rawlen;\n' + ' Serial.print("RawData (");\n' + ' Serial.print(count, DEC);\n' + ' Serial.print("): ");\n' + ' for (int i = 0; i < count; i++) {\n' + ' Serial.print(results->rawbuf[i]*MICROS_PER_TICK, DEC);\n' + ' if(i!=count-1){\n' + ' Serial.print(",");\n' + ' }\n' + ' }\n' + ' Serial.println("");\n' + '}\n'; generator.definitions_['dumpRaw'] = funcode; return code; }; export const ir_send_raw = function (_, generator) { var pin = this.getFieldValue('PIN'); generator.definitions_['include_IRremote'] = '#include <IRremote.h>\n'; generator.definitions_['var_declare_ir_send_' + pin] = `IRsend irsend_${pin}(${pin});`; var length = generator.valueToCode(this, 'length', generator.ORDER_ATOMIC) || '0'; var freq = generator.valueToCode(this, 'freq', generator.ORDER_ATOMIC) || '0'; var text = this.getFieldValue('TEXT'); var code = 'unsigned int buf_raw[' + length + ']={' + text + '};\n' code = code + `irsend_${pin}.sendRaw(buf_raw,${length},${freq});\n`; return code; } export const i2c_master_writer = function (_, generator) { generator.definitions_['include_Wire'] = '#include <Wire.h>'; generator.setups_['setup_wire_begin'] = 'Wire.begin();'; var device = generator.valueToCode(this, 'device', generator.ORDER_ATOMIC) || '0'; var value = generator.valueToCode(this, 'value', generator.ORDER_ATOMIC) || '0'; var code = "Wire.beginTransmission(" + device + ");\n"; code += "Wire.write(" + value + ");\n"; code += "Wire.endTransmission();\n"; return code; }; export const i2c_master_reader2 = function (_, generator) { generator.definitions_['include_Wire'] = '#include <Wire.h>\n'; //generator.setups_['setup_wire_begin'] ='Wire.begin();'; var code = "Wire.read()"; return [code, generator.ORDER_ATOMIC]; }; // YANG add slave write export const i2c_slave_write = function (_, generator) { generator.definitions_['include_Wire'] = '#include <Wire.h>'; generator.setups_['setup_wire_begin'] = 'Wire.begin();'; var value = generator.valueToCode(this, 'value', generator.ORDER_ATOMIC) || '0'; var code = "Wire.write(" + value + ");\n"; return code; }; export const RFID_init = function (_, generator) { var sda = this.getFieldValue('SDA'); generator.definitions_['include_SPI'] = '#include <SPI.h>'; generator.definitions_['include_RFID'] = '#include <RFID.h>'; generator.definitions_['var_declare_RFID'] = 'RFID rfid(' + sda + ',5);'; generator.definitions_['var_declare__i and tmp'] = 'unsigned char i,tmp;'; generator.definitions_['var_declare__status'] = 'unsigned char status;'; generator.definitions_['var_declare__strmax'] = 'unsigned char str[MAX_LEN];'; generator.definitions_['var_declare__RC_size'] = 'unsigned char RC_size;'; generator.definitions_['var_declare__blockAddr'] = 'unsigned char blockAddr; //选择操作的块地址0~63'; generator.definitions_['define_1'] = '//4字节卡序列号,第5字节为校验字节'; generator.definitions_['define_2'] = 'unsigned char serNum[5];'; generator.definitions_['define_3'] = '//写卡数据'; generator.definitions_['define_5'] = '//原扇区A密码,16个扇区,每个扇区密码6Byte'; generator.definitions_['define_6'] = 'unsigned char sectorKeyA[16][16] = {'; generator.definitions_['define_7'] = ' {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},'; generator.definitions_['define_8'] = ' {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},'; generator.definitions_['define_9'] = ' {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},};'; generator.definitions_['define_10'] = '//新扇区A密码,16个扇区,每个扇区密码6Byte'; generator.definitions_['define_11'] = 'unsigned char sectorNewKeyA[16][16] = {'; generator.definitions_['define_12'] = ' {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},'; generator.definitions_['define_13'] = ' {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},'; generator.definitions_['define_14'] = ' {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},};'; generator.setups_['setup_serial_Serial'] = 'Serial.begin(9600);'; generator.setups_['setup_output_2'] = 'SPI.begin();'; generator.setups_['setup_output_3'] = 'rfid.init();'; return ""; }; export const RFID_on = function (_, generator) { // Do while/until loop. var branch = generator.statementToCode(this, 'do_'); if (generator.INFINITE_LOOP_TRAP) { branch = generator.INFINITE_LOOP_TRAP.replace(/%1/g, '\'' + this.id + '\'') + branch; } return 'if(rfid.isCard()){\n' + branch + '}\n'; }; export const RFID_readcardnum = function (_, generator) { var funcName = 'RFID_readcardnum'; var code = 'String ' + funcName + '(){\n' + ' rfid.readCardSerial();\n' + ' String stringserNum = String(rfid.serNum[0], HEX)+String(rfid.serNum[1], HEX)+String(rfid.serNum[2], HEX)+String(rfid.serNum[3], HEX)+String(rfid.serNum[4], HEX);\n' + ' //选卡,返回卡容量(锁定卡片,防止多次读写)\n' + ' rfid.selectTag(rfid.serNum);\n' + ' return stringserNum;\n'//直接返回string + '}\n'; generator.definitions_[funcName] = code; return [funcName + '()', generator.ORDER_ATOMIC]; }; /* export const RFID_serialprintcardnum = function() { var funcName='RFID_serialprintcardnum'; var code='void'+ ' ' + funcName + '() {\n' +"\n"+' //找卡 ' +"\n"+' //读取卡序列号 ' +"\n"+' if (rfid.readCardSerial()) ' +"\n"+' {' +"\n"+' Serial.print("The card\'s number is : "); ' +"\n"+' Serial.print(rfid.serNum[0],HEX); ' +"\n"+' Serial.print(rfid.serNum[1],HEX); ' +"\n"+' Serial.print(rfid.serNum[2],HEX); ' +"\n"+' Serial.print(rfid.serNum[3],HEX); ' +"\n"+' Serial.print(rfid.serNum[4],HEX); ' +"\n"+' Serial.println(" "); ' +"\n"+' }' +"\n"+' //选卡,返回卡容量(锁定卡片,防止多次读写)' +"\n"+' rfid.selectTag(rfid.serNum);' + '\n}\n'; generator.definitions_[funcName] = code; return funcName+'();\n'; }; */ export const RFID_writecarddata = function (_, generator) { var address2 = generator.valueToCode(this, 'address1', generator.ORDER_ATOMIC); var data2 = this.getFieldValue('data1'); var funcName = 'RFID_writecarddata'; var code = 'void' + ' ' + funcName + '(int ad2){\n' + ' rfid.readCardSerial();\n' + ' //选卡,返回卡容量(锁定卡片,防止多次读写)\n' + ' rfid.selectTag(rfid.serNum);\n' + ' //写数据卡\n' + ' blockAddr = ad2;\n' + ' if(rfid.auth(PICC_AUTHENT1A, blockAddr, sectorKeyA[blockAddr/4], rfid.serNum) == MI_OK){\n' + ' //写数据\n' + ' status = rfid.write(blockAddr, sectorKeyA[blockAddr/4]);\n' + ' Serial.print("set the new card password, and can modify the data of the Sector: ");\n' + ' Serial.println(blockAddr/4,DEC);\n' + ' blockAddr=blockAddr-3;\n' + ' status=rfid.write(blockAddr,(unsigned char*)' + data2 + ');\n' + ' if(status == MI_OK){\n' + ' Serial.println("Write card OK!");\n' + ' }\n' + ' }\n' + '}\n'; generator.definitions_[funcName] = code; return funcName + '(' + address2 + ');\n'; } export const RFID_readcarddata = function (_, generator) { var address3 = generator.valueToCode(this, 'address', generator.ORDER_ATOMIC); var funcName = 'RFID_readcarddata' var code = 'String' + ' ' + funcName + '(int ad3){\n' + ' //读卡\n' + ' blockAddr =ad3;\n' + ' status = rfid.auth(PICC_AUTHENT1A, blockAddr, sectorNewKeyA[blockAddr/4], rfid.serNum);\n' + ' if(status == MI_OK){ //认证\n' + ' //读数据\n' + ' if(rfid.read(blockAddr, str) == MI_OK)\n' + ' {\n' + ' Serial.print("Read from the card ,the data is : ");\n' + ' Serial.println((char *)str);\n' + ' }\n' + ' }\n' + ' rfid.halt();\n' + ' String stringstr((char*)str);\n'//str是一个char数组,必须先转换成char*,才能继续转换成string + ' return stringstr;\n' + '}\n'; generator.definitions_[funcName] = code; return [funcName + '(' + address3 + ')', generator.ORDER_ATOMIC]; }; /* export const RFID_serialprintcarddata = function() { var address3 = generator.valueToCode(this, 'address', generator.ORDER_ATOMIC); var funcName='RFID_serialprintcarddata'; var code='void'+ ' ' + funcName + '(int ad3) {\n' +"\n"+'//读卡 ' +"\n"+' blockAddr =ad3; ' +"\n"+' status = rfid.auth(PICC_AUTHENT1A, blockAddr, sectorNewKeyA[blockAddr/4], rfid.serNum);' +"\n"+' if (status == MI_OK) //认证' +"\n"+' {' +"\n"+' //读数据' +"\n"+' if( rfid.read(blockAddr, str) == MI_OK)' +"\n"+' {' +"\n"+' Serial.print("Read from the card ,the data is : ");' +"\n"+' Serial.println((char *)str);' +"\n"+' } ' +"\n"+' } ' +"\n"+' rfid.halt();' + '\n}\n'; generator.definitions_[funcName] = code; return funcName+'('+address3+');\n'; }; */ export const RFID_off = function (_, generator) { var funcName = 'RFID_off'; var code = 'void' + ' ' + funcName + '() {\n' + "\n" + ' rfid.halt(); ' + '\n}\n'; generator.definitions_[funcName] = code; return funcName + '();\n'; }; export const RFID_in = function (_, generator) { // Do while/until loop. var funcName = 'RFID_readcardnum'; var code = 'String' + ' ' + funcName + '() {\n' + "\n" + ' rfid.readCardSerial(); ' + "\n" + ' String stringserNum=String(rfid.serNum[0], HEX)+String(rfid.serNum[1], HEX)+String(rfid.serNum[2], HEX)+String(rfid.serNum[3], HEX)+String(rfid.serNum[4], HEX);' + "\n" + ' //选卡,返回卡容量(锁定卡片,防止多次读写)' + "\n" + ' rfid.selectTag(rfid.serNum);' + "\n" + ' return stringserNum; '//直接返回string + '\n}\n'; generator.definitions_[funcName] = code; var argument0 = generator.valueToCode(this, 'uid_', generator.ORDER_NONE) || 'false'; var branch = generator.statementToCode(this, 'do_'); if (generator.INFINITE_LOOP_TRAP) { branch = generator.INFINITE_LOOP_TRAP.replace(/%1/g, '\'' + this.id + '\'') + branch; } /* fixed bug caused by parameter of strcmp() must be const char* author:zyc date:2018-12-7 */ if (argument0 != 'false') { if (argument0.indexOf('"') === 0) return 'if (' + 'strcmp(RFID_readcardnum().c_str(),' + argument0 + ')==0' + ') {\n' + branch + '}\n'; return 'if (' + 'strcmp(RFID_readcardnum().c_str(),' + argument0 + '.c_str())==0' + ') {\n' + branch + '}\n'; } return ''; }; // 初始化RFID export const MFRC522_init = function (_, generator) { var text_rfid_name = this.getFieldValue('rfid_name'); var value_PIN_SDA = generator.valueToCode(this, 'PIN_SDA', generator.ORDER_ATOMIC); var value_PIN_RST = generator.valueToCode(this, 'PIN_RST', generator.ORDER_ATOMIC); generator.definitions_['include_SPI'] = '#include <SPI.h>'; generator.definitions_['include_MFRC522'] = '#include <MFRC522.h>'; generator.definitions_['var_declare_' + text_rfid_name] = 'MFRC522 ' + text_rfid_name + '(' + value_PIN_SDA + ', ' + value_PIN_RST + ');'; generator.setups_['setup_spi'] = 'SPI.begin();'; generator.setups_['setup_mfc522_' + text_rfid_name] = text_rfid_name + '.PCD_Init();'; var code = ''; return code; }; // RFID侦测到信号 export const MFRC522_IsNewCard = function (_, generator) { var text_rfid_name = this.getFieldValue('rfid_name'); var statements_DO = generator.statementToCode(this, 'DO'); generator.definitions_['function_MFRC522_IsNewCard'] = 'boolean MFRC522_IsNewCard(MFRC522 *_name){\n' + ' if(!_name->PICC_IsNewCardPresent())\n' + ' return false;\n' + ' if(!_name->PICC_ReadCardSerial())\n' + ' return false;\n' + ' return true;\n' + '}\n'; var code = 'if(MFRC522_IsNewCard(&' + text_rfid_name + ')){\n' + (statements_DO != '' ? statements_DO : '') + ' ' + text_rfid_name + '.PICC_HaltA();\n' + ' ' + text_rfid_name + '.PCD_StopCrypto1();\n' + '}\n'; return code; }; // RFID读取卡号 export const MFRC522_ReadCardUID = function (_, generator) { var text_rfid_name = this.getFieldValue('rfid_name'); generator.definitions_['function_MFRC522_ReadCardUID'] = 'String MFRC522_ReadCardUID(MFRC522 *_name){\n' + ' String _CardUID = "";\n' + ' for (byte _i = 0; _i < _name->uid.size; _i++){\n' + ' if(_name->uid.uidByte[_i] < 0x10)\n' + ' _CardUID += "0";\n' + ' _CardUID += String(_name->uid.uidByte[_i], HEX);\n' + ' }\n' + ' return _CardUID;\n' + '}\n'; var code = 'MFRC522_ReadCardUID(&' + text_rfid_name + ')'; return [code, generator.ORDER_ATOMIC]; }; // RFID写卡 export const MFRC522_WriteCard = function (_, generator) { var text_rfid_name = this.getFieldValue('rfid_name'); var value_block = generator.valueToCode(this, 'block', generator.ORDER_ATOMIC); var value_buffer = generator.valueToCode(this, 'buffer', generator.ORDER_ATOMIC); var value_length = generator.valueToCode(this, 'length', generator.ORDER_ATOMIC); generator.definitions_['function_MFRC522_WriteCard'] = 'boolean MFRC522_WriteCard(MFRC522 *_name, byte _block, byte *_buffer, byte _length){\n' + ' MFRC522::MIFARE_Key _key;\n' + ' for(byte i = 0; i < 6; i++)\n' + ' _key.keyByte[i] = 0xFF;\n' + ' MFRC522::StatusCode _status;\n' + ' _status = _name->PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, _block, &_key, &(_name->uid));\n' + ' if(_status != MFRC522::STATUS_OK){\n' + ' Serial.print(F("PCD_Authenticate() failed: "));\n' + ' Serial.println(_name->GetStatusCodeName(_status));\n' + ' return false;\n' + ' }\n' + ' else{\n' + ' Serial.println(F("PCD_Authenticate() success;"));\n' + ' }\n' + ' _status = _name->MIFARE_Write(_block, _buffer, _length);\n' + ' if(_status != MFRC522::STATUS_OK){\n' + ' Serial.print(F("MIFARE_Write() failed: "));\n' + ' Serial.println(_name->GetStatusCodeName(_status));\n' + ' return false;\n' + ' }\n' + ' else{\n' + ' Serial.println(F("MIFARE_Write() success;"));\n' + ' }\n' + ' return true;\n' + '}\n' generator.setups_['setup_serial_Serial'] = 'Serial.begin(9600);'; var code = 'MFRC522_WriteCard(&' + text_rfid_name + ', ' + value_block + ', ' + value_buffer + ', ' + value_length + ');\n'; return code; }; // RFID读卡 export const MFRC522_ReadCard = function (_, generator) { var text_rfid_name = this.getFieldValue('rfid_name'); var value_block = generator.valueToCode(this, 'block', generator.ORDER_ATOMIC); var value_buffer = generator.valueToCode(this, 'buffer', generator.ORDER_ATOMIC); var value_length = generator.valueToCode(this, 'length', generator.ORDER_ATOMIC); generator.definitions_['function_MFRC522_ReadCard'] = 'boolean MFRC522_ReadCard(MFRC522 *_name, byte _block, byte *_buffer, byte _length){\n' + ' MFRC522::MIFARE_Key _key;\n' + ' for(byte i = 0; i < 6; i++)\n' + ' _key.keyByte[i] = 0xFF;\n' + ' MFRC522::StatusCode _status;\n' + ' _status = _name->PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, _block, &_key, &(_name->uid));\n' + ' if(_status != MFRC522::STATUS_OK){\n' + ' Serial.print(F("PCD_Authenticate() failed: "));\n' + ' Serial.println(_name->GetStatusCodeName(_status));\n' + ' return false;\n' + ' }\n' + ' else{\n' + ' Serial.println(F("PCD_Authenticate() success;"));\n' + ' }\n' + ' if(_length < 18){\n' + ' byte _Read_buffer[18];\n' + ' byte _Read_buffer_length = 18;\n' + ' _status = _name->MIFARE_Read(_block, _Read_buffer, &_Read_buffer_length);\n' + ' if(_status != MFRC522::STATUS_OK){\n' + ' Serial.print(F("MIFARE_Read() failed: "));\n' + ' Serial.println(_name->GetStatusCodeName(_status));\n' + ' return false;\n' + ' }\n' + ' else{\n' + ' Serial.println(F("MIFARE_Read() success;"));\n' + ' }\n' + ' for(byte _i = 0; _i < _length; _i++)\n' + ' _buffer[_i] = _Read_buffer[_i];\n' + ' }\n' + ' else{\n' + ' _status = _name->MIFARE_Read(_block, _buffer, &_length);\n' + ' if(_status != MFRC522::STATUS_OK){\n' + ' Serial.print(F("MIFARE_Read() failed: "));\n' + ' Serial.println(_name->GetStatusCodeName(_status));\n' + ' return false;\n' + ' }\n' + ' else{\n' + ' Serial.println(F("MIFARE_Read() success;"));\n' + ' }\n' + ' }\n' + ' return true;\n' + '}\n' generator.setups_['setup_serial_Serial'] = 'Serial.begin(9600);'; var code = 'MFRC522_ReadCard(&' + text_rfid_name + ', ' + value_block + ', ' + value_buffer + ', ' + value_length + ');\n'; return code; }; // IIC主机初始化 export const i2c_master_Init = function (_, generator) { generator.definitions_['include_Wire'] = '#include <Wire.h>'; generator.setups_['setup_wire_begin'] = 'Wire.begin();'; var code = ''; return code; }; // IIC从机初始化 export const i2c_slave_Init = function (_, generator) { generator.definitions_['include_Wire'] = '#include <Wire.h>'; var value_i2c_address = generator.valueToCode(this, 'i2c_address', generator.ORDER_ATOMIC); generator.setups_['setup_i2c'] = 'Wire.begin(' + value_i2c_address + ');'; var code = ''; return code; }; // IIC发送数据 export const i2c_begin_end_transmission = function (_, generator) { generator.definitions_['include_Wire'] = '#include <Wire.h>'; var value_i2c_address = generator.valueToCode(this, 'i2c_address', generator.ORDER_ATOMIC); var statements_transmission_data = generator.statementToCode(this, 'transmission_data'); var code = 'Wire.beginTransmission(' + value_i2c_address + ');\n' + statements_transmission_data + 'Wire.endTransmission();\n'; return code; }; // IIC写入数据 export const i2c_write = function (_, generator) { generator.definitions_['include_Wire'] = '#include <Wire.h>'; var value_i2c_write_data = generator.valueToCode(this, 'i2c_write_data', generator.ORDER_ATOMIC); var code = 'Wire.write(' + value_i2c_write_data + ');\n'; return code; }; export const i2c_slave_write_array = function (_, generator) { generator.definitions_['include_Wire'] = '#include <Wire.h>'; generator.setups_['setup_wire_begin'] = 'Wire.begin();'; var array = generator.valueToCode(this, 'array', generator.ORDER_ATOMIC); var length = generator.valueToCode(this, 'length', generator.ORDER_ATOMIC) || '1'; var code = "Wire.write(" + array + "," + length + ");\n"; return code; }; export const i2c_available = function (_, generator) { generator.definitions_['include_Wire'] = '#include <Wire.h>\n'; var workspace = this.workspace; var blocks = workspace.getAllBlocks(); var y = 0; for (y = 0; y < blocks.length; y++) { if (blocks[y].type == 'i2c_slave_Init') break; } if (y == blocks.length) generator.setups_['setup_wire_begin'] = 'Wire.begin();'; var code = "Wire.available()"; return [code, generator.ORDER_ATOMIC]; }; // 从机接收字节数 export const i2c_howmany = function (_, generator) { generator.definitions_['include_Wire'] = '#include <Wire.h>\n'; generator.setups_['setup_wire_begin'] = 'Wire.begin();'; var code = "howMany"; return [code, generator.ORDER_ATOMIC]; }; // IIC读取数据 export const i2c_read = function (_, generator) { var code = "Wire.read()"; return [code, generator.ORDER_ATOMIC]; }; // SPI export const spi_transfer = function (_, generator) { generator.definitions_['include_SPI'] = '#include <SPI.h>'; generator.setups_['setup_spi'] = 'SPI.begin();'; var pin = generator.valueToCode(this, 'pin', generator.ORDER_ATOMIC); var value = generator.valueToCode(this, 'value', generator.ORDER_ATOMIC); generator.setups_['setup_output_' + pin] = 'pinMode(' + pin + ', OUTPUT);'; var code = "digitalWrite(" + pin + ", LOW);\n"; code += "SPI.transfer(" + value + ");\n"; code += "digitalWrite(" + pin + ", HIGH);\n"; return code; }; // SPI 初始化从机 export const spi_begin_slave = function (_, generator) { generator.definitions_['include_SPI'] = '#include <SPI.h>'; generator.setups_['setup_spi'] = 'pinMode(12, OUTPUT);' + '\n SPCR |= _BV(SPE);'; var code = ''; return code; }; // 寄存器读写 export const i2c_master_writerReg = function (_, generator) { generator.definitions_['include_Wire'] = '#include <Wire.h>'; generator.setups_['setup_wire_begin'] = 'Wire.begin();'; var device = generator.valueToCode(this, 'device', generator.ORDER_ATOMIC) || '0'; var regadd = generator.valueToCode(this, 'regadd', generator.ORDER_ATOMIC) || '0'; var value = generator.valueToCode(this, 'value', generator.ORDER_ATOMIC) || '0'; var code = "Wire.beginTransmission(" + device + ");\n"; code += "Wire.write(" + regadd + ");\n"; code += "Wire.write(" + value + ");\n"; code += "Wire.endTransmission();\n"; return code; }; export const i2c_master_readerReg = function (_, generator) { generator.definitions_['include_Wire'] = '#include <Wire.h>\n'; generator.setups_['setup_wire_begin'] = 'Wire.begin();'; var device = generator.valueToCode(this, 'device', generator.ORDER_ATOMIC) || '0'; var regadd = generator.valueToCode(this, 'regadd', generator.ORDER_ATOMIC) || '0'; var bytes = generator.valueToCode(this, 'bytes', generator.ORDER_ATOMIC) || '0'; var code = "Wire.beginTransmission(" + device + ");\n"; code += "Wire.write(" + regadd + ");\n"; code += "Wire.requestFrom(" + device + ", " + bytes + ");\n"; code += "Wire.endTransmission();\n"; return code; }; export const i2c_slave_onreceive = function (_, generator) { generator.definitions_['include_Wire'] = '#include <Wire.h>\n'; var value_onReceive_length = generator.valueToCode(this, 'onReceive_length', generator.ORDER_ATOMIC); var statements_i2c_onReceive_data = generator.statementToCode(this, 'DO'); generator.definitions_['function_receiveEvent'] = 'void receiveEvent(int ' + value_onReceive_length + ')' + '\n{' + ' ' + statements_i2c_onReceive_data + '\n}\n' generator.setups_['setup_i2c_receiveEvent'] = 'Wire.onReceive(receiveEvent);'; var code = ''; return code; } export const i2c_slave_onrequest = function (_, generator) { generator.definitions_['include_Wire'] = '#include <Wire.h>\n'; generator.setups_['setup_i2c_slave'] = 'Wire.setClock(400000);'; generator.setups_['setup_i2c_onRequest'] = 'Wire.onRequest(i2cRequestEvent);'; var funcName = 'i2cRequestEvent'; var branch = generator.statementToCode(this, 'DO'); var code2 = 'void' + ' ' + funcName + '() {\n' + branch + '}\n'; generator.definitions_[funcName] = code2; return ''; } export const i2c_master_reader = function (_, generator) { generator.definitions_['include_Wire'] = '#include <Wire.h>\n'; var device = generator.valueToCode(this, 'device', generator.ORDER_ATOMIC) || '0'; var bytes = generator.valueToCode(this, 'bytes', generator.ORDER_ATOMIC) || '0'; var code = "Wire.requestFrom(" + device + ", " + bytes + ");\n"; return code; }; export const spi_begin_master = function (_, generator) { var value_spi_slave_pin = generator.valueToCode(this, 'spi_slave_pin', generator.ORDER_ATOMIC); generator.definitions_['include_SPI'] = '#include <SPI.h>'; generator.setups_['setup_spi'] = 'SPI.begin();'; generator.setups_['setup_spi_divider'] = 'SPI.setClockDivider(SPI_CLOCK_DIV8);'; generator.setups_['setup_spi_pin_' + value_spi_slave_pin] = 'digitalWrite(' + value_spi_slave_pin + ', HIGH);'; var code = ''; return code; }; export const spi_transfer_Init = function (_, generator) { var value_slave_pin = generator.valueToCode(this, 'slave_pin', generator.ORDER_ATOMIC); var statements_transfer_data = generator.statementToCode(this, 'transfer_data'); var code = 'digitalWrite(' + value_slave_pin + ', LOW);\n' + statements_transfer_data + 'digitalWrite(' + value_slave_pin + ', HIGH);\n'; return code; }; export const spi_transfer_1 = function (_, generator) { var value_transfer_data = generator.valueToCode(this, 'transfer_data', generator.ORDER_ATOMIC); var code = 'SPI.transfer(' + value_transfer_data + ');\n'; return code; }; export const spi_transfer_2 = function (_, generator) { var value_transfer_data = generator.valueToCode(this, 'transfer_data', generator.ORDER_ATOMIC); var code = 'SPI.transfer(' + value_transfer_data + ')'; return [code, generator.ORDER_ATOMIC]; }; export const spi_slave_interrupt = function (_, generator) { var statements_slave_interrupt_data = generator.statementToCode(this, 'slave_interrupt_data'); generator.definitions_['function_ISR'] = 'ISR(SPI_STC_vect)' + '\n{' + '\n' + statements_slave_interrupt_data + '\n}\n' generator.setups_['setup_spi_interrupt'] = 'SPI.attachInterrupt();'; var code = ''; return code; }; export const spi_slave_receive = function (_, generator) { generator.definitions_['function_SPI_SlaveReceive'] = 'char SPI_SlaveReceive()' + '\n{' + '\n while(!(SPSR&(1<<SPIF)));' + '\n return SPDR;' + '\n}\n' var code = 'SPI_SlaveReceive()'; return [code, generator.ORDER_ATOMIC]; };