package org.lidar.api;

import javax.comm.SerialPort;
import javax.jws.WebMethod;
import javax.jws.WebService;
import org.apache.commons.configuration.XMLConfiguration;
import org.lidar.Config;
import org.lidar.Serial;

/**
 * Laser API
 * @author Andrej Cimpersek
 */
@WebService()
public class Laser extends Serial {

    public Laser() {
        super("laser");
        openPort();
    }

    /**
     * Vkljuci laser, ki zacne delovati v skladu z nastavljenimi parametri.
     */
    @WebMethod()
    public boolean fire(String lockToken) {
        return sendCommand(lockToken, "$FIRE 01\r");
    }

    /**
     * Izkljuci laser.
     */
    @WebMethod()
    public boolean stop(String lockToken) {
        return sendCommand(lockToken, "$STOP 00\r");
    }

    /**
     * Shrani trenutno konfiguracijo parametrov v interni pomnilnik laserja, ki se bodo nalozili ob naslednjem zagonu napajanja.
     */
    @WebMethod()
    public boolean saveConfig(String lockToken) {
        return sendCommand(lockToken, "$SAVE 01\r");
    }

    /**
     * Mnozica vseh nacinov delovanja laserja.
     */
    public enum LaserMode {

        Continuous, Burst, ExternalTrigger
    };

    /**
     * Izbere nacin delovanja laserja. Nacini mode so nasteti v mnozici LaserMode.
     * @param mode Nacin delovanja laserja.
     */
    @WebMethod()
    public boolean setMode(String lockToken, LaserMode mode) {
        switch (mode) {
            case Continuous:
                return sendCommand(lockToken, "$MODE 01\r");
            case Burst:
                return sendCommand(lockToken, "$MODE 02\r");
            case ExternalTrigger:
                return sendCommand(lockToken, "$MODE 03\r");
        }

        return false;
    }

    /**
     * Omogoci oz. onemogoci Q-Switch opcijo.
     * @param enabled Omogoci oz. onemogoci..
     */
    @WebMethod()
    public boolean setQSwitch(String lockToken, boolean enabled) {
        if (enabled) {
            return sendCommand(lockToken, "$QSWITCH 01\r");
        } else {
            return sendCommand(lockToken, "$QSWITCH 00\r");
        }
    }

    /**
     * Zaklene oz. odklene tipkovnico na napajalniku laserja.
     * @param locked Zaklep oz. odklep.
     */
    @WebMethod()
    public boolean setKeypad(String lockToken, boolean enabled) {
        if (enabled) {
            return sendCommand(lockToken, "$KEYPAD 01\r");
        } else {
            return sendCommand(lockToken, "$KEYPAD 00\r");
        }
    }

    /**
     * Nastavi stevilo sunkov laserja, pulses, ki se bodo zaporedoma izbvrsili, ce je izbran nacin delovanje LaserMode.Continuous.
     * Dovoljeno obmocje 0 - 99.
     * @param pulses Stevilo sunkov laserja.
     */
    @WebMethod()
    public boolean setBurstPulseCount(String lockToken, byte pulses) {
        if (pulses < 0 && pulses > 99) {
            return false;
        }

        String p = "" + pulses;
        if (p.length() == 1) {
            p = "0" + p;
        }

        return sendCommand(lockToken, "$BURST " + p + "\r");
    }

    /**
     * Zazene Q-Switch na vsakih freq sunkov.
     * Dovoljeno obmocje je od 1 - 99.
     * @param freq Frekvenca sunkov.
     */
    @WebMethod()
    public boolean setQSwitchFrequency(String lockToken, byte freq) {
        if (freq < 0 && freq > 99) {
            return false;
        }

        String f = "" + freq;
        if (f.length() == 1) {
            f = "0" + f;
        }

        return sendCommand(lockToken, "$QFREQ " + f + "\r");
    }

    /**
     * Zakasnitev aktivacije v stevilu sunkov delay.
     * Dovoljeno obmocje je od 0 - 99.
     * @param delay Zakasnitev aktivacije.
     */
    public boolean setQSwitchDelay(String lockToken, byte delay) {
        if (delay < 0 && delay > 99) {
            return false;
        }

        String d = "" + delay;
        if (d.length() == 1) {
            d = "0" + d;
        }

        return sendCommand(lockToken, "$QDLY " + d + "\r");
    }

    /**
     * Nastavi energijo laserja, eneryLevel, pri posameznem sunku aktivcaije.
     * @param energyLevel Energija laserja.
     */
    @WebMethod()
    public boolean setEnergyLevel(String lockToken, byte energyLevel) {
        if (energyLevel < 1 && energyLevel > 20) {
            return false;
        }

        String e = "" + energyLevel;
        if (e.length() == 1) {
            e = "0" + e;
        }

        return sendCommand(lockToken, "$EPFN " + e + "\r");
    }

    /**
     * Nastavi frekvenco, s katero naj se prozi lase po aktivaciji. Frekvenca je izrazena v sunkih na sekundo, rate.
     * Dovoljene vrednosti so 1, 2, 5, 10 in 20.
     * @param rate Frekvenca s katero se prozi laser.
     */
    @WebMethod()
    public boolean setRepetitionRate(String lockToken, byte rate) {
        if (rate == 1 || rate == 2 || rate == 5 || rate == 10 || rate == 20) {
            String r = "" + rate;
            if (r.length() == 1) {
                r = "0" + r;
            }

            return sendCommand(lockToken, "$LPRF " + r + "\r");
        }

        return false;
    }
}
