
#include <stdio.h>
#include <string.h>
#include <stdint.h>


unsigned char g_sensortype [][2] = {
    {0xC3, 0x01},
    {0x07, 0x02},
    {0x0F, 0x05},
    {0x0c, 0x1F},
    {0xFF ,0xff}
};

uint8_t find_sensor(uint8_t sensor_number) {

    int i=0;
    uint8_t rc; 

    while (g_sensortype[i][0] != 0xff) {
        if (g_sensortype[i][1] == sensor_number) {
            break;
        } else {
            i++;
        }
    }

    rc = g_sensortype[i][0];

    if (rc == 0xFF)  {
        rc = 0;
    }
    return rc;
}

char g_results_method[64];
char g_results_value[64];


int set_sensor_dbus_state_s(unsigned char number, const char *member, const char *value) {
    printf("Attempting to log 0x%02x via %s with a value of %s\n",
        number, member, value);

    strcpy(g_results_method, member);
    strcpy(g_results_value, value);

    return 0;
}

int set_sensor_dbus_state_y(unsigned char number, char const* member, uint8_t value) {
    
    char val[2];


    printf("Attempting to log Variant Sensor 0x%02x via %s with a value of 0x%02x\n",
        number, member, value);


    snprintf(val, 2, "%d", value);

    strcpy(g_results_method, member);
    strcpy(g_results_value, val);

    return 0;
}


extern int updateSensorRecordFromSSRAESC(const void *record);



// DIMM Present
uint8_t testrec_sensor1[]      = {0x1F, 0xa9, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

// DIMM Not present
uint8_t testrec_sensor2[]      = {0x1F, 0xa9, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00};

// DIMM Not present
uint8_t testrec_procfailed[]   = {0x02, 0xa9, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00};

// Virtual Sensor 5, setting a Value of 0h
uint8_t testrec_bootprogress[] = {0x05, 0xa9, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00};

// Virtual Sensor setting a boot count 
uint8_t testrec_bootcount[]    = {0x01, 0x09, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

// Invalid sensor number
uint8_t testrec_invalidnumber[]= {0x35, 0xa9, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00};


int check_results(int rc, const char *method, const char *value) {
    if (strcmp(g_results_method, method)) { 
        printf("ERROR: Method Failed, expect %s found %s\n", method, g_results_method);
        return -1;
    }
    if (strcmp(g_results_value, value)) {
        printf("ERROR: Value failed, expected %s found %s\n", value, g_results_value);
        return -2;
    }

    return 0;
}

void testprep(void) {
    memset(g_results_method, 0, sizeof(g_results_method));
    memset(g_results_value, 0, sizeof(g_results_value));
}


int main() {

    testprep(); check_results(updateSensorRecordFromSSRAESC(testrec_bootprogress), "setValue", "FW Progress, Docking station attachment");
    testprep(); check_results(updateSensorRecordFromSSRAESC(testrec_sensor1), "setPresent", "True");
    testprep(); check_results(updateSensorRecordFromSSRAESC(testrec_sensor2), "setPresent", "False");
    testprep(); check_results(updateSensorRecordFromSSRAESC(testrec_procfailed), "setFault", "False");
    testprep(); check_results(updateSensorRecordFromSSRAESC(testrec_bootcount), "setValue", "3");
    testprep(); check_results(updateSensorRecordFromSSRAESC(testrec_invalidnumber), "", "");

	return 0;
}