
#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_v(uint8_t number, const char *method, char *value) {
    printf("Attempting to log Variant Sensor 0x%02x via %s with a value of %s\n",
        number, method, value);

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

    return 0;
}

int set_sensor_dbus_state(uint8_t number, const char *method, const char *value) {

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

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

	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;
}