// Path: heartbeat-log/src/main/java/com/heartbeat/log/Logger.java
// public final class Logger {
//     private static Level defaultPackageLevel = Level.INFO;
//     private static PrintStream stream = System.out;
//     //TODO: Appender  system
//     //TODO: Tag-level checks.
// 
//     private Logger() {
//     }
// 
//     public static Level getLevel() {
//         return defaultPackageLevel;
//     }
// 
//     public static void setLevel(Level defaultPackageLevel) {
//         Logger.defaultPackageLevel = defaultPackageLevel;
//     }
// 
//     public static final void trace(String tag, String message) {
//         print(Level.TRACE, tag, message);
// 
//     }
// 
//     public static final void trace(String tag, String message, Object... args) {
//         print(Level.TRACE, tag, message, args);
// 
//     }
// 
//     public static final void debug(String tag, String message) {
//         print(Level.DEBUG, tag, message);
// 
//     }
// 
//     public static final void debug(String tag, String message, Object... args) {
//         print(Level.DEBUG, tag, message, args);
// 
//     }
// 
//     public static final void info(String tag, String message) {
//         print(Level.INFO, tag, message);
// 
//     }
// 
//     public static final void info(String tag, String message, Object... args) {
//         print(Level.INFO, tag, message, args);
//     }
// 
//     public static final void warn(String tag, String message) {
//         print(Level.WARNING, tag, message);
//     }
// 
//     public static final void warn(String tag, String message, Object... args) {
//         print(Level.WARNING, tag, message, args);
//     }
// 
//     public static final void error(String tag, String message) {
//         print(Level.ERROR, tag, message);
//     }
// 
//     public static final void error(String tag, String message, Object... args) {
//         print(Level.ERROR, tag, message, args);
//     }
// 
//     public static final void error(String tag, String message, Exception ex) {
//         print(Level.ERROR, tag, message);
//         ex.printStackTrace(getStream());
//     }
// 
//     public static final void error(String tag, String message, Exception ex, Object... args) {
//         print(Level.ERROR, tag, message, args);
//         ex.printStackTrace(getStream());
//     }
// 
// 
//     private static final void print(Level level, String tag, String message) {
//         if (level.ordinal() < defaultPackageLevel.ordinal())
//             return;
//         StringBuilder builder = getBuilderWithDate(level, tag);
//         builder.append(message);
//         getStream().println(builder.toString());
//     }
// 
// 
//     private static final void print(Level level, String tag, String message, Object... args) {
//         if (level.ordinal() < defaultPackageLevel.ordinal())
//             return;
//         StringBuilder builder = getBuilderWithDate(level, tag);
//         builder.append(format(message, args));
//         getStream().println(builder.toString());
//     }
// 
//     private static final StringBuilder getBuilderWithDate(Level level, String tag) {
//         StringBuilder builder = new StringBuilder();
//         Calendar now = Calendar.getInstance();
//         builder.append('[');
//         builder.append(now.get(Calendar.YEAR));
//         builder.append('-');
//         builder.append(now.get(Calendar.MONTH));
//         builder.append('-');
//         builder.append(now.get(Calendar.DAY_OF_MONTH));
//         builder.append(' ');
//         builder.append(now.get(Calendar.HOUR_OF_DAY));
//         builder.append(':');
//         builder.append(now.get(Calendar.MINUTE));
//         builder.append(':');
//         builder.append(now.get(Calendar.SECOND));
//         builder.append(',');
//         builder.append(now.get(Calendar.MILLISECOND));
//         builder.append("]\t");
//         builder.append(level.name());
//         builder.append(" \t");
//         builder.append(tag);
//         builder.append(": \t");
//         return builder;
//     }
// 
//     public static PrintStream getStream() {
//         return stream;
//     }
// 
//     public static void setStream(PrintStream stream) {
//         Logger.stream = stream;
//     }
// 
//     public enum Level {
//         TRACE,
//         DEBUG,
//         INFO,
//         WARNING,
//         ERROR
//     }
// }


import com.heartbeat.log.Logger;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
package com.heartbeat.pin;



/**
 * A high performance writer class which opens a {@link FileChannel} to the pin.
 * It uses  {@link ByteBuffer} with the size 1 and reuses it for every write.
 */
public class PinWriter {
    private static final String TAG = PinWriter.class.getName();
    private final Pin pin;
    private ByteBuffer TRUE = ByteBuffer.wrap("1".getBytes());
    private ByteBuffer FALSE = ByteBuffer.wrap("0".getBytes());

    private final FileOutputStream os;
    private final FileChannel fch;

    /**
     * Creates a outputstream and file channel for the pin.
     *
     * @param pin
     * @throws IOException
     */
    public PinWriter(Pin pin) throws IOException {
        this.pin = pin;
        os = new FileOutputStream(pin.getPath());
        fch = os.getChannel();
    }

    /**
     * Writes the value.
     * Writes "1" for true, writes "0" for false.
     *
     * @param value value
     * @throws IOException
     */
    public void write(boolean value) throws IOException {
        fch.write(value ? TRUE : FALSE);
        if (value)
            TRUE.position(0);
        else
            FALSE.position(0);
        fch.position(0);
        os.flush();
    }

    /**
     * Closes reader , releases file channel and output stream.
     */
    public void close() {
        if (fch != null && fch.isOpen()) {
            try {
                fch.close();
            } catch (IOException e) {
// Path: heartbeat-log/src/main/java/com/heartbeat/log/Logger.java
// public final class Logger {
//     private static Level defaultPackageLevel = Level.INFO;
//     private static PrintStream stream = System.out;
//     //TODO: Appender  system
//     //TODO: Tag-level checks.
// 
//     private Logger() {
//     }
// 
//     public static Level getLevel() {
//         return defaultPackageLevel;
//     }
// 
//     public static void setLevel(Level defaultPackageLevel) {
//         Logger.defaultPackageLevel = defaultPackageLevel;
//     }
// 
//     public static final void trace(String tag, String message) {
//         print(Level.TRACE, tag, message);
// 
//     }
// 
//     public static final void trace(String tag, String message, Object... args) {
//         print(Level.TRACE, tag, message, args);
// 
//     }
// 
//     public static final void debug(String tag, String message) {
//         print(Level.DEBUG, tag, message);
// 
//     }
// 
//     public static final void debug(String tag, String message, Object... args) {
//         print(Level.DEBUG, tag, message, args);
// 
//     }
// 
//     public static final void info(String tag, String message) {
//         print(Level.INFO, tag, message);
// 
//     }
// 
//     public static final void info(String tag, String message, Object... args) {
//         print(Level.INFO, tag, message, args);
//     }
// 
//     public static final void warn(String tag, String message) {
//         print(Level.WARNING, tag, message);
//     }
// 
//     public static final void warn(String tag, String message, Object... args) {
//         print(Level.WARNING, tag, message, args);
//     }
// 
//     public static final void error(String tag, String message) {
//         print(Level.ERROR, tag, message);
//     }
// 
//     public static final void error(String tag, String message, Object... args) {
//         print(Level.ERROR, tag, message, args);
//     }
// 
//     public static final void error(String tag, String message, Exception ex) {
//         print(Level.ERROR, tag, message);
//         ex.printStackTrace(getStream());
//     }
// 
//     public static final void error(String tag, String message, Exception ex, Object... args) {
//         print(Level.ERROR, tag, message, args);
//         ex.printStackTrace(getStream());
//     }
// 
// 
//     private static final void print(Level level, String tag, String message) {
//         if (level.ordinal() < defaultPackageLevel.ordinal())
//             return;
//         StringBuilder builder = getBuilderWithDate(level, tag);
//         builder.append(message);
//         getStream().println(builder.toString());
//     }
// 
// 
//     private static final void print(Level level, String tag, String message, Object... args) {
//         if (level.ordinal() < defaultPackageLevel.ordinal())
//             return;
//         StringBuilder builder = getBuilderWithDate(level, tag);
//         builder.append(format(message, args));
//         getStream().println(builder.toString());
//     }
// 
//     private static final StringBuilder getBuilderWithDate(Level level, String tag) {
//         StringBuilder builder = new StringBuilder();
//         Calendar now = Calendar.getInstance();
//         builder.append('[');
//         builder.append(now.get(Calendar.YEAR));
//         builder.append('-');
//         builder.append(now.get(Calendar.MONTH));
//         builder.append('-');
//         builder.append(now.get(Calendar.DAY_OF_MONTH));
//         builder.append(' ');
//         builder.append(now.get(Calendar.HOUR_OF_DAY));
//         builder.append(':');
//         builder.append(now.get(Calendar.MINUTE));
//         builder.append(':');
//         builder.append(now.get(Calendar.SECOND));
//         builder.append(',');
//         builder.append(now.get(Calendar.MILLISECOND));
//         builder.append("]\t");
//         builder.append(level.name());
//         builder.append(" \t");
//         builder.append(tag);
//         builder.append(": \t");
//         return builder;
//     }
// 
//     public static PrintStream getStream() {
//         return stream;
//     }
// 
//     public static void setStream(PrintStream stream) {
//         Logger.stream = stream;
//     }
// 
//     public enum Level {
//         TRACE,
//         DEBUG,
//         INFO,
//         WARNING,
//         ERROR
//     }
// }


// Path: heartbeat-pin/src/main/java/com/heartbeat/pin/PinWriter.java
import com.heartbeat.log.Logger;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

package com.heartbeat.pin;



/**
 * A high performance writer class which opens a {@link FileChannel} to the pin.
 * It uses  {@link ByteBuffer} with the size 1 and reuses it for every write.
 */
public class PinWriter {
    private static final String TAG = PinWriter.class.getName();
    private final Pin pin;
    private ByteBuffer TRUE = ByteBuffer.wrap("1".getBytes());
    private ByteBuffer FALSE = ByteBuffer.wrap("0".getBytes());

    private final FileOutputStream os;
    private final FileChannel fch;

    /**
     * Creates a outputstream and file channel for the pin.
     *
     * @param pin
     * @throws IOException
     */
    public PinWriter(Pin pin) throws IOException {
        this.pin = pin;
        os = new FileOutputStream(pin.getPath());
        fch = os.getChannel();
    }

    /**
     * Writes the value.
     * Writes "1" for true, writes "0" for false.
     *
     * @param value value
     * @throws IOException
     */
    public void write(boolean value) throws IOException {
        fch.write(value ? TRUE : FALSE);
        if (value)
            TRUE.position(0);
        else
            FALSE.position(0);
        fch.position(0);
        os.flush();
    }

    /**
     * Closes reader , releases file channel and output stream.
     */
    public void close() {
        if (fch != null && fch.isOpen()) {
            try {
                fch.close();
            } catch (IOException e) {
                Logger.error(TAG, "Can not close Reader FileChannel %s", e, pin.getCode());