/**
 * @license Licensed under the Apache License, Version 2.0 (the "License"):
 *          http://www.apache.org/licenses/LICENSE-2.0
 */

/**
 * @fileoverview Code generator for the Arduino serial blocks.
 *     Arduino Serial library docs: https://www.arduino.cc/en/Reference/Serial
 *
 * TODO: There are more functions that can be added:
 *       http://arduino.cc/en/Reference/Serial
 */
'use strict';

goog.provide('Blockly.Python.serial');

goog.require('Blockly.Python');


/**
 * Code generator of block for writing to the serial com.
 * Arduino code: loop { Serial.print(X); }
 * @param {!Blockly.Block} block Block to generate the code from.
 * @return {string} Completed code.
 */
Blockly.Python['serial_print'] = function(block) {
    var serialId = block.getFieldValue('SERIAL_ID');
    var content = Blockly.Python.valueToCode(
        block, 'CONTENT', Blockly.Python.ORDER_ATOMIC) || '0';
    var checkbox_name = (block.getFieldValue('NEW_LINE') == 'TRUE');

    var serialPins = Blockly.Python.Boards.selected.serialPins[serialId];
    for (var i = 0; i < serialPins.length; i++) {
        Blockly.Python.reservePin(block, serialPins[i][1],
            Blockly.Python.PinTypes.SERIAL, 'SERIAL ' + serialPins[i][0]);
    }

    if (checkbox_name) {
        var code = serialId + '.println(' + content + ')\n';
    } else {
        var code = serialId + '.print(' + content + ')\n';
    }
    return code;
};

/**
 * Code generator for block for setting the serial com speed.
 * Arduino code: setup{ Serial.begin(X); }
 * @param {!Blockly.Block} block Block to generate the code from.
 * @return {array} Completed code.
 */
Blockly.Python['serial_setup'] = function(block) {
    var serialId = block.getFieldValue('SERIAL_ID');
    var serialSpeed = block.getFieldValue('SPEED');
    var serialSetupCode = serialId + '.begin(' + serialSpeed + ');';
    Blockly.Python.addSetup('serial_' + serialId, serialSetupCode, true);
    var code = '';
    return code;
};


/**
 * Code generator of block for writing to the UART com.
 * Arduino code: loop { Serial1.write(X); }
 * @param {!Blockly.Block} block Block to generate the code from.
 * @return {string} Completed code.
 */
Blockly.Python['serial1_write'] = function(block) {
    var serialId = block.getFieldValue('SERIAL_ID');
    var content = Blockly.Python.valueToCode(
        block, 'CONTENT', Blockly.Python.ORDER_ATOMIC) || '0';
    var code = serialId + '.write(' + content + ')\n';
    return code;
};

/**
 * Code generator of block for reading from the UART com.
 * Arduino code: loop { Serial1.read(X); }
 * @param {!Blockly.Block} block Block to generate the code from.
 * @return {string} Completed code.
 */
Blockly.Python['serial1_read'] = function(block) {
    var serialId = block.getFieldValue('SERIAL_ID');
    var code = serialId + '.read()\n';
    return code;
};

/**
 * Code generator of block for reading from the UART com.
 * Arduino code: loop { Serial1.read(X); }
 * @param {!Blockly.Block} block Block to generate the code from.
 * @return {string} Completed code.
 */
Blockly.Python['serial1_available'] = function(block) {
    var serialId = block.getFieldValue('SERIAL_ID');
    var code = serialId + '.available()\n';
    return [code, Blockly.Python.ORDER_ATOMIC];
};