/* Official CoreSDKLib.dll harness: drive the vendor pipeline on the real * device and dump (a) the official rendered BMP, (b) temperature data, * (c) the Gray2Temperature LUT. This is the authoritative reference for * what the official app displays. * * Build: gcc official_harness.c -o official_harness.exe -ldl (loads dll * manually so we can use the vendor's own libusb0.dll from its folder). */ #define _WIN32_WINNT 0x0601 #include #include #include #include /* --- MAG API prototypes (from CoreSDKLib.dll exports, verified RVAs) --- * Initialize 0x22c0 (chan, ...) EnumCameras 0x2590 (chan) * NewChannel 0x1ee0 (chan) LinkCamera 0x2650 (chan, pid, ...) * StartProcessImage 0x2cd0 (chan, ...) GetTemperatureData 0x3fc0 (chan,...) */ typedef int (*MAG_Initialize_t)(int, int); typedef void (*MAG_Free_t)(void); typedef int (*MAG_IsInitialized_t)(int); typedef int (*MAG_EnumCameras_t)(int); typedef int (*MAG_NewChannel_t)(int); typedef int (*MAG_LinkCamera_t)(int, int, int); typedef void (*MAG_DisLinkCamera_t)(int); typedef int (*MAG_StartProcessImage_t)(int, void *, int, int); typedef int (*MAG_StopProcessImage_t)(int); typedef int (*MAG_IsProcessingImage_t)(int); typedef int (*MAG_GetOutputBMPdataRGB24_t)(int, unsigned char *, int, int); typedef int (*MAG_GetOutputBMPdata_t)(int, unsigned char *, int); typedef int (*MAG_GetTemperatureData_t)(int, int *, int, int); typedef int (*MAG_GetCamInfo_t)(int, void *); typedef int (*MAG_TriggerFFC_t)(int, int); typedef int (*MAG_SetFixPara_t)(int, void *, int); typedef int (*MAG_GetApproximateGray2TemperatureLUT_t)(int, float *); static HMODULE g_core; static MAG_Initialize_t fn_Initialize; static MAG_Free_t fn_Free; static MAG_IsInitialized_t fn_IsInitialized; static MAG_EnumCameras_t fn_EnumCameras; static MAG_NewChannel_t fn_NewChannel; static MAG_LinkCamera_t fn_LinkCamera; static MAG_DisLinkCamera_t fn_DisLinkCamera; static MAG_StartProcessImage_t fn_StartProcessImage; static MAG_StopProcessImage_t fn_StopProcessImage; static MAG_IsProcessingImage_t fn_IsProcessingImage; static MAG_GetOutputBMPdataRGB24_t fn_GetOutputBMPdataRGB24; static MAG_GetOutputBMPdata_t fn_GetOutputBMPdata; static MAG_GetTemperatureData_t fn_GetTemperatureData; static MAG_GetCamInfo_t fn_GetCamInfo; static MAG_TriggerFFC_t fn_TriggerFFC; static MAG_SetFixPara_t fn_SetFixPara; static MAG_GetApproximateGray2TemperatureLUT_t fn_GetApproximateGray2TemperatureLUT; #define LOAD(name) fn_##name = (MAG_##name##_t)GetProcAddress(g_core, "MAG_" #name); \ if (!fn_##name) { printf("missing export MAG_" #name "\n"); return 2; } int main(int argc, char **argv) { const char *dllpath = argc > 1 ? argv[1] : "C:\\Project\\MAG160C\\IR_Camera_SDK-1.0.1\\windows\\windows\\app\\CoreSDKLib.dll"; SetDllDirectoryA("C:\\Project\\MAG160C\\IR_Camera_SDK-1.0.1\\windows\\windows\\app"); g_core = LoadLibraryA(dllpath); if (!g_core) { printf("LoadLibrary failed: %lu\n", GetLastError()); return 1; } LOAD(Initialize); LOAD(Free); LOAD(IsInitialized); LOAD(EnumCameras); LOAD(NewChannel); LOAD(LinkCamera); LOAD(DisLinkCamera); LOAD(StartProcessImage); LOAD(StopProcessImage); LOAD(IsProcessingImage); LOAD(GetOutputBMPdataRGB24); LOAD(GetOutputBMPdata); LOAD(GetTemperatureData); LOAD(GetCamInfo); LOAD(TriggerFFC); LOAD(SetFixPara); LOAD(GetApproximateGray2TemperatureLUT); printf("CoreSDKLib loaded, isInit=%d\n", fn_IsInitialized(0)); int rc = fn_Initialize(0, 0); printf("MAG_Initialize(0,0) rc=%d\n", rc); /* official Windows sequence: NewChannel(0) first, then EnumCameras */ int chan = fn_NewChannel(0); printf("MAG_NewChannel(0) -> channel=%d\n", chan); rc = fn_EnumCameras(chan); printf("MAG_EnumCameras(chan) rc=%d\n", rc); rc = fn_LinkCamera(chan, 0x101, 0); printf("MAG_LinkCamera(chan,pid,0) rc=%d\n", rc); /* camera info */ unsigned char info[0x100] = {0}; rc = fn_GetCamInfo(chan, info); printf("MAG_GetCamInfo rc=%d\n", rc); rc = fn_StartProcessImage(chan, NULL, 0x10, 0); printf("MAG_StartProcessImage rc=%d\n", rc); Sleep(3000); fn_TriggerFFC(chan, 1); Sleep(2000); printf("after FFC(1): isProcessing=%d\n", fn_IsProcessingImage(chan)); /* temperature LUT (256 floats) */ float lut[256]; rc = fn_GetApproximateGray2TemperatureLUT(chan, lut); printf("Gray2TempLUT rc=%d lut[0]=%.3f lut[64]=%.3f lut[128]=%.3f lut[255]=%.3f\n", rc, lut[0], lut[64], lut[128], lut[255]); if (rc == 0) { FILE *f = fopen("official_g2t_lut.txt", "w"); for (int i = 0; i < 256; ++i) fprintf(f, "%d %.4f\n", i, lut[i]); fclose(f); printf("saved official_g2t_lut.txt\n"); } /* official BMP */ unsigned char bmp[160 * 120 * 3 + 64]; rc = fn_GetOutputBMPdataRGB24(chan, bmp, 160 * 120 * 3, 1); printf("GetOutputBMPdataRGB24 rc=%d first px RGB=%d,%d,%d\n", rc, bmp[0], bmp[1], bmp[2]); if (rc) { /* save as BMP file */ unsigned sz = 54 + 160 * 120 * 3; unsigned char hdr[54] = {0}; hdr[0] = 'B'; hdr[1] = 'M'; hdr[2] = sz; hdr[3] = sz >> 8; hdr[4] = sz >> 16; hdr[5] = sz >> 24; hdr[10] = 54; hdr[14] = 40; hdr[18] = 160; hdr[22] = 120; hdr[26] = 1; hdr[28] = 24; FILE *f = fopen("official_render.bmp", "wb"); fwrite(hdr, 1, 54, f); fwrite(bmp, 1, 160 * 120 * 3, f); fclose(f); printf("saved official_render.bmp\n"); } /* temperature data (19200 ints) */ static int tempdata[19200]; rc = fn_GetTemperatureData(chan, tempdata, 1, 1); printf("GetTemperatureData rc=%d t[0]=%d t[9600]=%d\n", rc, tempdata[0], tempdata[9600]); if (rc) { FILE *f = fopen("official_tempdata.bin", "wb"); fwrite(tempdata, 4, 19200, f); fclose(f); printf("saved official_tempdata.bin\n"); } printf("(inner temp export not present in this dll)\\n"); fn_StopProcessImage(chan); fn_DisLinkCamera(chan); fn_Free(); printf("done\n"); return 0; }