#include "lamp_ntc.h"
#include <stddef.h>
typedef struct {uint16_t raw;int16_t centic;} point;
/* Vishay29049 Rev07May2025 material9 forward equation;1C nominal knots,
 * sorted raw ascending. Generated values are not manufacturer test results. */
static const point curve[]={
    {134u,12500},
    {138u,12400},
    {141u,12300},
    {145u,12200},
    {149u,12100},
    {152u,12000},
    {156u,11900},
    {161u,11800},
    {165u,11700},
    {169u,11600},
    {174u,11500},
    {178u,11400},
    {183u,11300},
    {188u,11200},
    {193u,11100},
    {198u,11000},
    {203u,10900},
    {209u,10800},
    {215u,10700},
    {221u,10600},
    {227u,10500},
    {233u,10400},
    {239u,10300},
    {246u,10200},
    {253u,10100},
    {260u,10000},
    {267u,9900},
    {275u,9800},
    {282u,9700},
    {290u,9600},
    {298u,9500},
    {307u,9400},
    {316u,9300},
    {325u,9200},
    {334u,9100},
    {343u,9000},
    {353u,8900},
    {363u,8800},
    {374u,8700},
    {385u,8600},
    {396u,8500},
    {407u,8400},
    {419u,8300},
    {431u,8200},
    {444u,8100},
    {457u,8000},
    {470u,7900},
    {484u,7800},
    {498u,7700},
    {513u,7600},
    {528u,7500},
    {544u,7400},
    {560u,7300},
    {576u,7200},
    {593u,7100},
    {611u,7000},
    {629u,6900},
    {647u,6800},
    {666u,6700},
    {686u,6600},
    {706u,6500},
    {727u,6400},
    {749u,6300},
    {771u,6200},
    {793u,6100},
    {816u,6000},
    {840u,5900},
    {865u,5800},
    {890u,5700},
    {916u,5600},
    {942u,5500},
    {969u,5400},
    {997u,5300},
    {1026u,5200},
    {1055u,5100},
    {1085u,5000},
    {1116u,4900},
    {1147u,4800},
    {1179u,4700},
    {1212u,4600},
    {1246u,4500},
    {1280u,4400},
    {1315u,4300},
    {1350u,4200},
    {1387u,4100},
    {1424u,4000},
    {1461u,3900},
    {1500u,3800},
    {1539u,3700},
    {1578u,3600},
    {1618u,3500},
    {1659u,3400},
    {1700u,3300},
    {1742u,3200},
    {1785u,3100},
    {1827u,3000},
    {1871u,2900},
    {1914u,2800},
    {1958u,2700},
    {2003u,2600},
    {2048u,2500},
    {2092u,2400},
    {2138u,2300},
    {2183u,2200},
    {2228u,2100},
    {2274u,2000},
    {2320u,1900},
    {2365u,1800},
    {2411u,1700},
    {2456u,1600},
    {2502u,1500},
    {2547u,1400},
    {2592u,1300},
    {2636u,1200},
    {2680u,1100},
    {2724u,1000},
    {2768u,900},
    {2811u,800},
    {2853u,700},
    {2895u,600},
    {2936u,500},
    {2977u,400},
    {3017u,300},
    {3056u,200},
    {3095u,100},
    {3133u,0},
    {3170u,-100},
    {3206u,-200},
    {3242u,-300},
    {3276u,-400},
    {3310u,-500},
    {3343u,-600},
    {3375u,-700},
    {3406u,-800},
    {3436u,-900},
    {3465u,-1000},
    {3494u,-1100},
    {3521u,-1200},
    {3548u,-1300},
    {3574u,-1400},
    {3599u,-1500},
    {3623u,-1600},
    {3646u,-1700},
    {3668u,-1800},
    {3689u,-1900},
    {3710u,-2000},
    {3730u,-2100},
    {3749u,-2200},
    {3767u,-2300},
    {3784u,-2400},
    {3801u,-2500},
    {3817u,-2600},
    {3832u,-2700},
    {3847u,-2800},
    {3861u,-2900},
    {3874u,-3000},
    {3887u,-3100},
    {3899u,-3200},
    {3910u,-3300},
    {3921u,-3400},
    {3931u,-3500},
    {3941u,-3600},
    {3950u,-3700},
    {3959u,-3800},
    {3967u,-3900},
    {3975u,-4000},
};
bool lamp_ntc_candidate_temperature(uint16_t raw,int32_t *out) {
    if(out==NULL || raw<curve[0].raw || raw>curve[165].raw) return false;
    unsigned lo=0u,hi=165u;
    while(hi-lo>1u) {
        const unsigned mid=(lo+hi)/2u;
        if(raw<curve[mid].raw) hi=mid; else lo=mid;
    }
    const uint32_t span=curve[hi].raw-curve[lo].raw;
    const uint32_t fraction=(uint32_t)(raw-curve[lo].raw)*100u;
    *out=(int32_t)curve[lo].centic-(int32_t)((fraction+span/2u)/span);
    return true;
}
