// Path: src/se/bitcraze/crazyflie/lib/crtp/CrtpPort.java
// public enum CrtpPort {
//     CONSOLE(0),
//     PARAMETERS(2),
//     COMMANDER(3),
//     MEMORY(4),
//     LOGGING(5),
//     COMMANDER_GENERIC(7),
//     DEBUGDRIVER(14),
//     LINKCTRL(15),
//     ALL(255),
//     UNKNOWN(-1); //FIXME
// 
//     private byte mNumber;
// 
//     private CrtpPort(int number) {
//         this.mNumber = (byte) number;
//     }
// 
//     /**
//      * Get the number associated with this port.
//      *
//      * @return the number of the port
//      */
//     public byte getNumber() {
//         return mNumber;
//     }
// 
//     /**
//      * Get the port with a specific number.
//      *
//      * @param number
//      *            the number of the port.
//      * @return the port or <code>null</code> if no port with the specified number exists.
//      */
//     public static CrtpPort getByNumber(byte number) {
//         for (CrtpPort p : CrtpPort.values()) {
//             if (p.getNumber() == number) {
//                 return p;
//             }
//         }
//         return null;
//     }
// }


import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import se.bitcraze.crazyflie.lib.crtp.CrtpPort;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
/**
 *    ||          ____  _ __
 * +------+      / __ )(_) /_______________ _____  ___
 * | 0xBC |     / __  / / __/ ___/ ___/ __ `/_  / / _ \
 * +------+    / /_/ / / /_/ /__/ /  / /_/ / / /_/  __/
 *  ||  ||    /_____/_/\__/\___/_/   \__,_/ /___/\___/
 *
 * Copyright (C) 2015 Bitcraze AB
 *
 * Crazyflie Nano Quadcopter Client
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 *
 */

package se.bitcraze.crazyflie.lib.toc;





/**
 *  Access to TOC cache. To turn off the cache functionality don't supply any directories.
 *
 *  Heavily based on toccache.py
 *
 *
 */
public class TocCache {

    final Logger mLogger = LoggerFactory.getLogger("TocCache");
    private List<File> mCacheFiles = new ArrayList<File>();
    private File mCacheDir = null;
    private static final String PARAM_CACHE_DIR = "paramCache";
    private static final String LOG_CACHE_DIR = "logCache";
    private ObjectMapper mMapper = new ObjectMapper(); // can reuse, share globally

    public TocCache(File cacheDir) {
        this.mCacheDir = cacheDir;
        //TODO: should it be possible to change the name of the dirs?
        addExistingCacheFiles(LOG_CACHE_DIR);
        addExistingCacheFiles(PARAM_CACHE_DIR);
    }

    private void addExistingCacheFiles(String cachePath) {
        if (cachePath != null) {
            //use cache dir if it's not null
            File cachePathFile = (mCacheDir != null) ? new File(mCacheDir, cachePath) : new File(cachePath);
            if(cachePathFile.exists()) {
                this.mCacheFiles.addAll(Arrays.asList(cachePathFile.listFiles(jsonFilter)));
            }
        }
    }

    FilenameFilter jsonFilter = new FilenameFilter() {
        public boolean accept(File dir, String name) {
            return name.endsWith(".json");
        }
    };

    /**
     * Try to get a hit in the cache, return None otherwise
     *
     * @param crc CRC code of the TOC
     * @param port CrtpPort of the TOC
     */
// Path: src/se/bitcraze/crazyflie/lib/crtp/CrtpPort.java
// public enum CrtpPort {
//     CONSOLE(0),
//     PARAMETERS(2),
//     COMMANDER(3),
//     MEMORY(4),
//     LOGGING(5),
//     COMMANDER_GENERIC(7),
//     DEBUGDRIVER(14),
//     LINKCTRL(15),
//     ALL(255),
//     UNKNOWN(-1); //FIXME
// 
//     private byte mNumber;
// 
//     private CrtpPort(int number) {
//         this.mNumber = (byte) number;
//     }
// 
//     /**
//      * Get the number associated with this port.
//      *
//      * @return the number of the port
//      */
//     public byte getNumber() {
//         return mNumber;
//     }
// 
//     /**
//      * Get the port with a specific number.
//      *
//      * @param number
//      *            the number of the port.
//      * @return the port or <code>null</code> if no port with the specified number exists.
//      */
//     public static CrtpPort getByNumber(byte number) {
//         for (CrtpPort p : CrtpPort.values()) {
//             if (p.getNumber() == number) {
//                 return p;
//             }
//         }
//         return null;
//     }
// }


// Path: src/se/bitcraze/crazyflie/lib/toc/TocCache.java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import se.bitcraze.crazyflie.lib.crtp.CrtpPort;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;

/**
 *    ||          ____  _ __
 * +------+      / __ )(_) /_______________ _____  ___
 * | 0xBC |     / __  / / __/ ___/ ___/ __ `/_  / / _ \
 * +------+    / /_/ / / /_/ /__/ /  / /_/ / / /_/  __/
 *  ||  ||    /_____/_/\__/\___/_/   \__,_/ /___/\___/
 *
 * Copyright (C) 2015 Bitcraze AB
 *
 * Crazyflie Nano Quadcopter Client
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 *
 */

package se.bitcraze.crazyflie.lib.toc;





/**
 *  Access to TOC cache. To turn off the cache functionality don't supply any directories.
 *
 *  Heavily based on toccache.py
 *
 *
 */
public class TocCache {

    final Logger mLogger = LoggerFactory.getLogger("TocCache");
    private List<File> mCacheFiles = new ArrayList<File>();
    private File mCacheDir = null;
    private static final String PARAM_CACHE_DIR = "paramCache";
    private static final String LOG_CACHE_DIR = "logCache";
    private ObjectMapper mMapper = new ObjectMapper(); // can reuse, share globally

    public TocCache(File cacheDir) {
        this.mCacheDir = cacheDir;
        //TODO: should it be possible to change the name of the dirs?
        addExistingCacheFiles(LOG_CACHE_DIR);
        addExistingCacheFiles(PARAM_CACHE_DIR);
    }

    private void addExistingCacheFiles(String cachePath) {
        if (cachePath != null) {
            //use cache dir if it's not null
            File cachePathFile = (mCacheDir != null) ? new File(mCacheDir, cachePath) : new File(cachePath);
            if(cachePathFile.exists()) {
                this.mCacheFiles.addAll(Arrays.asList(cachePathFile.listFiles(jsonFilter)));
            }
        }
    }

    FilenameFilter jsonFilter = new FilenameFilter() {
        public boolean accept(File dir, String name) {
            return name.endsWith(".json");
        }
    };

    /**
     * Try to get a hit in the cache, return None otherwise
     *
     * @param crc CRC code of the TOC
     * @param port CrtpPort of the TOC
     */
    public Toc fetch(int crc, CrtpPort port) {