/*---------------------------------------------------------------------------------------------------------------------------------------------------
 * irmpharedLib.h
 *
 * Copyright (c) 2009-2019 Frank Meyer - frank(at)fli4l.de
 * Copyright (c) 2009-2019 René Staffen - r.staffen(at)gmx.de
 *
 * 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.
 *---------------------------------------------------------------------------------------------------------------------------------------------------
 */


#include "irmp.h"
#include "irmp.c"


#ifndef IRMP_DLLEXPORT

#if defined WIN32 && defined _MSC_VER
# define IRMP_DLLEXPORT __declspec(dllexport)
#else
# define IRMP_DLLEXPORT
#endif
#endif // !IRMP_DLLEXPORT

#include "irmp-main-SharedLib.h"



static uint32_t s_endSample = 0;

uint32_t IRMP_GetSampleRate(void) {
    return F_INTERRUPTS;
}


void IRMP_Reset(void) {
    IRMP_PIN = 0xff;
    IRMP_DATA data;
    int i;
    for (i = 0; i < (int)(( F_INTERRUPTS )); i++)  // long pause of 1s
    {
        (void)irmp_ISR();
    }
    (void)irmp_get_data(&data);
    time_counter = 0;
    s_startBitSample = 0;
    s_curSample = 0;
    s_endSample = 0;
}


uint32_t IRMP_AddSample(const uint8_t i_sample) {
    IRMP_PIN = i_sample;
    uint_fast8_t r = irmp_ISR();
    if (r) {
        s_endSample = s_curSample;
        return 1;
    }
    s_curSample++;
    return 0;
}


uint32_t IRMP_GetData(IRMP_DataExt* o_data) {

    IRMP_DATA d;
    if (irmp_get_data(&d))
    {  
        o_data->address      = d.address;
        o_data->command      = d.command;
        o_data->protocol     = d.protocol;
        o_data->protocolName = IRMP_GetProtocolName(d.protocol);
        o_data->flags        = d.flags;
        o_data->startSample  = s_startBitSample;
        o_data->endSample    = s_endSample;
        return TRUE;
    }
    return FALSE;
}


IRMP_DataExt IRMP_Detect(const uint8_t* i_buff, uint32_t i_len) {
    IRMP_DataExt ret = { 0 };
    while (s_curSample < i_len) {
        if (IRMP_AddSample(i_buff[s_curSample])) {
            IRMP_GetData(&ret);
            return ret;
        }
    }
    return ret;
}


const char* IRMP_GetProtocolName(uint32_t i_protocol) {
    if (i_protocol < IRMP_N_PROTOCOLS) {
        return irmp_protocol_names[i_protocol];
    }
    else {
        return "unknown";
    }
}

