#include "sensorhandler.h"
#include "ipmid-api.h"
#include <stdio.h>
#include <string.h>
#include <stdint.h>

extern int updateSensorRecordFromSSRAESC(const void *);

void register_netfn_sen_functions()   __attribute__((constructor));


struct sensor_data_t {
    uint8_t sennum;
}  __attribute__ ((packed)) ;

unsigned char g_sensortype [][2] = {
    {0xc7, 58},
{0x01, 113},
{0xc7, 56},
{0x01, 114},
{0xc6, 54},
{0x07, 40},
{0xC1, 121},
{0xC2, 137},
{0x07, 36},
{0x07, 43},
{0xC1, 122},
{0xC1, 119},
{0x01, 12},
{0x01, 111},
{0x01, 116},
{0xC1, 127},
{0xC2, 134},
{0xC2, 130},
{0xc, 33},
{0xC1, 125},
{0x01, 115},
{0x22, 4},
{0xC2, 138},
{0x01, 108},
{0x01, 102},
{0xc, 46},
{0x7, 11},
{0xC1, 120},
{0x07, 39},
{0x07, 42},
{0x5, 21},
{0xC2, 131},
{0xc1, 48},
{0x12, 53},
{0xC1, 124},
{0x01, 117},
{0xC1, 126},
{0xf, 5},
{0x23, 0},
{0xC2, 139},
{0x07, 34},
{0x09, 146},
{0x02, 178},
{0xC2, 140},
{0xC1, 118},
{0xC2, 133},
{0x07, 38},
{0xC2, 143},
{0x01, 101},
{0xc3, 9},
{0x7, 10},
{0xc2, 51},
{0x01, 109},
{0xc, 32},
{0x7, 8},
{0xC1, 129},
{0x01, 112},
{0x01, 107},
{0x07, 37},
{0x07, 44},
{0x1f, 50},
{0xC2, 144},
{0xc7, 52},
{0xC2, 141},
{0x01, 106},
{0x01, 110},
{0x01, 103},
{0x9, 28},
{0x07, 35},
{0xc7, 55},
{0x03, 179},
{0x07, 41},
{0xc, 30},
{0x01, 100},
{0xC1, 128},
{0xC2, 135},
{0x01, 105},
{0x7, 47},
{0xC2, 145},
{0xc7, 57},
{0x01, 104},
{0x07, 45},
{0xC2, 132},
{0xc4, 49},
{0xC1, 123},
{0xC2, 142},
{0x01, 13},
{0xC2, 136},
{0xc, 31},
{0xff,0xff}
};


unsigned char findSensor(char sensor_number) {

    int i=0;

    // TODO : This function should actually call
    // a dbus object and have it return the data
    // it is not ready yet so use a Palmetto 
    // based lookup table for now.  The g_sensortype
    // can be removed once the dbus method exists
    while (g_sensortype[i][0] != 0xff) {
        if (g_sensortype[i][1] == sensor_number) {
            break;
        } else {
            i++;
        }

    }

    return g_sensortype[i][0];

}

ipmi_ret_t ipmi_sen_get_sensor_type(ipmi_netfn_t netfn, ipmi_cmd_t cmd, 
                             ipmi_request_t request, ipmi_response_t response, 
                             ipmi_data_len_t data_len, ipmi_context_t context)
{
    sensor_data_t *reqptr = (sensor_data_t*)request;
    ipmi_ret_t rc = IPMI_CC_OK;

    printf("IPMI GET_SENSOR_TYPE [0x%02X]\n",reqptr->sennum);

    // TODO Not sure what the System-event-sensor is suppose to return
    // need to ask Hostboot team
    unsigned char buf[] = {0x00,0x6F};

    buf[0] = findSensor(reqptr->sennum);

    *data_len = sizeof(buf);
    memcpy(response, &buf, *data_len);



    return rc;
}



// TODO: Saves the sensor information to a file in /tmp.  This
// will need to change to calling the correct method 
// once it exists in the stack.  
ipmi_ret_t ipmi_sen_set_sensor(ipmi_netfn_t netfn, ipmi_cmd_t cmd, 
                             ipmi_request_t request, ipmi_response_t response, 
                             ipmi_data_len_t data_len, ipmi_context_t context)
{
    FILE *fp;
    char string[16];
    sensor_data_t *reqptr = (sensor_data_t*)request;
    ipmi_ret_t rc = IPMI_CC_OK;
    unsigned short rlen;

    rlen = (unsigned short) *data_len;

    sprintf(string, "%s%02x", "/tmp/sen", reqptr->sennum);

    printf("IPMI SET_SENSOR [%s]\n",string);

    if ((fp = fopen(string, "wb")) != NULL) {
        fwrite(reqptr,rlen,1,fp);
        fclose(fp);
    } else {
        fprintf(stderr, "Error trying to write to sensor file %s\n",string);
        ipmi_ret_t rc = IPMI_CC_INVALID;        
    }

    updateSensorRecordFromSSRAESC(reqptr);

    *data_len=0;


    return rc;
}

ipmi_ret_t ipmi_sen_wildcard(ipmi_netfn_t netfn, ipmi_cmd_t cmd, 
                             ipmi_request_t request, ipmi_response_t response, 
                             ipmi_data_len_t data_len, ipmi_context_t context)
{
    ipmi_ret_t rc = IPMI_CC_OK;

    printf("IPMI S/E Wildcard Netfn:[0x%X], Cmd:[0x%X]\n",netfn,cmd);
    *data_len = 0;

    return rc;
}


void register_netfn_sen_functions()
{
    printf("Registering NetFn:[0x%X], Cmd:[0x%X]\n",NETFUN_SENSOR, IPMI_CMD_WILDCARD);
    ipmi_register_callback(NETFUN_SENSOR, IPMI_CMD_WILDCARD, NULL, ipmi_sen_wildcard);

    printf("Registering NetFn:[0x%X], Cmd:[0x%X]\n",NETFUN_SENSOR, IPMI_CMD_GET_SENSOR_TYPE);
    ipmi_register_callback(NETFUN_SENSOR, IPMI_CMD_GET_SENSOR_TYPE, NULL, ipmi_sen_get_sensor_type);

    printf("Registering NetFn:[0x%X], Cmd:[0x%X]\n",NETFUN_SENSOR, IPMI_CMD_SET_SENSOR);
    ipmi_register_callback(NETFUN_SENSOR, IPMI_CMD_SET_SENSOR, NULL, ipmi_sen_set_sensor);

    return;
}
