eddy_em: (Default)
eddy_em ([personal profile] eddy_em) wrote2012-06-19 12:36 pm
Entry tags:

УРА!

Таки нашел я нормальную библиотеку для чертовой камеры U16M.
Нашел я ее, как ни странно, на сайте разработчиков (предлагающих на главной купить это дело за 100 баксов), а между тем, исходники-то — вот они.
Сразу предупреждаю: файлы apogee-devel… не помогут (там вообще хрен знает что), зато в директории old-versions лежит файлик apogee-driver-source-3.7.0.tgz, который я и использовал.




Так как "сама по себе" эта библиотека устанавливаться "не хочет" (ей, видите ли, swig подавай, да и вообще как-то там все через одно место), я взял cmake'овский файлик из старой библиотеки и подправил его с учетом "обновок":


cmake_minimum_required(VERSION 2.4.7)

set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake_modules/")
set(BIN_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/bin")
set(INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/include")

set(APOGEE_VERSION "2.2")
set(APOGEE_SOVERSION "2")

Include (CheckCXXSourceCompiles)
include (MacroOptionalFindPackage)
include (MacroLogFeature)
include (MacroBoolTo01)
include (CheckIncludeFiles)

find_package(USB REQUIRED)
find_package(CURL REQUIRED)

include_directories( ${CMAKE_CURRENT_BINARY_DIR})
include_directories( ${CMAKE_SOURCE_DIR})
include_directories( ${CMAKE_SOURCE_DIR}/ApogeeNet)
include_directories( ${CMAKE_SOURCE_DIR}/ApogeeUsb)
include_directories( ${CMAKE_SOURCE_DIR}/FpgaRegs)

set(AltaCommon_SRCS
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAF6303E.cpp                                            
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAI11000ML.cpp                                          
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAF4202.cpp                                             
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAI2020C.cpp                                            
   ${CMAKE_SOURCE_DIR}/ApnCamData_CCD5520.cpp                                             
   ${CMAKE_SOURCE_DIR}/ApnCamData.cpp                                                     
   ${CMAKE_SOURCE_DIR}/ApnCamData_CCD4710ALT.cpp                                          
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAI4020C.cpp                                            
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAF1301E.cpp                                            
   ${CMAKE_SOURCE_DIR}/ApnCamData_CCD4240B.cpp                                            
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAI4020CLB.cpp                                          
   ${CMAKE_SOURCE_DIR}/ApnCamData_ASCENT0402ME3.cpp                                       
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAI11000CL.cpp                                          
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAF09000.cpp                                            
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAI2001CL.cpp                                           
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAF16801E.cpp                                           
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAI2001ML.cpp                                           
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAI4020M.cpp                                            
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAF16803.cpp                                            
   ${CMAKE_SOURCE_DIR}/ApnCamData_CCD4720B.cpp                                            
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAF1301EB.cpp                                           
   ${CMAKE_SOURCE_DIR}/ApnCamData_CCD5710F.cpp                                            
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAI2020CL.cpp                                           
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAF1001EB.cpp                                           
   ${CMAKE_SOURCE_DIR}/ApnCamData_CCD7700.cpp                                             
   ${CMAKE_SOURCE_DIR}/ApnCamData_CCD4240.cpp                                             
   ${CMAKE_SOURCE_DIR}/ApnCamData_S101401107.cpp                                          
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAF1001E.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAI4020MLB.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_CCD4710B.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_ASCENT16000.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAF0401E.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAI2001M.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAF1401E.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAI11000C.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAF0261E.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_CCD5520B.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_CCD5710B.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_CCD5710.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAI11000M.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAF1602EB.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAI2020MLB.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAF0261EB.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAI4020CL.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_ASCENT4000.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAF3200EB.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAF10011105.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_CCD3011.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_ASCENT2000.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAF1001ENS.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAF6303EB.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_ASCENT0402ME2.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAI4020ML.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAI2020ML.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_ASCENT340.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAF0401EB.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_CCD7700B.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_ASCENT0402ME4.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAF3200E.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_ASCENT0402ME.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_TH7899.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_CCD3011B.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAI2020M.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAF1602E.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_CCD4720.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAF09000X.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_CCD4710.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAI2020CLB.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAF09000H.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_S101401109.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAF16803D9.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_CCD4240D9.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAF16801ED7D9.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAF8300.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAF09000D7D9.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_CCD4710DD.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAF16801ED9.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAF1001EBD9.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAF6302.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAI16000MLD9.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_CCD7700D9.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAF09000XD7D9.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAF16803D7D9.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAI16000CL.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_CCD3011D9.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAI16000ML.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_F3041D9.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAI16000CLD9.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_F3041.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAF0401ENSD.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAF8300C.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_S101401108.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_CCD4710D9.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_CCD230_42.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAF6303EBD9.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamData_KAF09000D9.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamTable.cpp
   )

add_definitions("-O2 -g -fpic -DWall -DLINUX -DALTA_STANDALONE -DHAVE_STRERROR")

########### libapogeeAltaU ###########
set(AltaU_SRCS
   ${CMAKE_SOURCE_DIR}/libapogee.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamera.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamera_USB.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamera_Linux.cpp
   ${CMAKE_SOURCE_DIR}/ApogeeUsb/ApogeeUsbLinux.cpp
   ${CMAKE_SOURCE_DIR}/ApogeeUsb/alta2firmware.cpp
   ${CMAKE_SOURCE_DIR}/ApogeeUsb/ascentfirmware.cpp
   ${CMAKE_SOURCE_DIR}/ApogeeUsb/ApogeeUsbUpload.cpp
   ${CMAKE_SOURCE_DIR}/ApnFilterWheel.cpp
   ${AltaCommon_SRCS}
   )
   
add_library(apogeeu SHARED ${AltaU_SRCS})

set_target_properties(apogeeu PROPERTIES VERSION ${APOGEE_VERSION} SOVERSION ${APOGEE_SOVERSION})

target_link_libraries(apogeeu ${LIBUSB_LIBRARIES})

install(TARGETS apogeeu LIBRARY DESTINATION lib${LIB_POSTFIX} )

 ########### libapogeeAltaE ###########
set(AltaE_SRCS
   ${CMAKE_SOURCE_DIR}/libapogee.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamera.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamera_NET.cpp
   ${CMAKE_SOURCE_DIR}/ApnCamera_Linux.cpp
   ${CMAKE_SOURCE_DIR}/ApogeeNet/ApogeeNet.cpp
   ${CMAKE_SOURCE_DIR}/ApogeeNet/ApogeeNetLinux.c
   ${AltaCommon_SRCS}
   )
   
add_library(apogeee SHARED ${AltaE_SRCS})

set_target_properties(apogeee PROPERTIES VERSION ${APOGEE_VERSION} SOVERSION ${APOGEE_SOVERSION})

target_link_libraries(apogeee ${LIBUSB_LIBRARIES} ${CURL_LIBRARIES})

install(TARGETS apogeee LIBRARY DESTINATION lib${LIB_POSTFIX} )

install( FILES libapogee.h DESTINATION ${INCLUDE_INSTALL_DIR}/libapogee COMPONENT Devel)


Запустил cmake . && make && su -c "make install" и — вуаля! Библиотечка скомпилировалась и даже устанавилась!!!
Далее свой многострадальный TEST.c:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <math.h>
#include "libapogee.h"

int main(){
	if(ApnGlueOpen(1)){
		printf("Can't open, exit\n");
		return 0;
	}
	char *sensor, *camera;
	ApnGlueGetName(&sensor, &camera);
	printf("camera: %s, sensor: %s\n", camera, sensor);
	double temp;
	int stat = ApnGlueGetTemp(&temp);
	printf("stat = %d, temp=%g\n", stat, temp);
	int roih, roiw, osh, osw, binh, binw, shutter;
	double mintemp;
	ApnGlueSetFan(0);
	//ApnGlueSetFan(3);
	ApnGlueGetMaxValues (NULL, &roiw, &roih, &osw, &osh, &binw, &binh,
		&shutter, &mintemp);
	printf("roiw=%d, roih=%d, osw=%d, osh=%d, binw=%d, binh=%d, mintemp=%g\n",
		roiw, roih, osw, osh, binw, binh, mintemp);
	//ApnGlueSetTemp(-30.);
	/*int s = 0;
	do{
		stat = ApnGlueGetTemp(&temp);
		printf("%ds: stat = %d, temp=%g\n", s++, stat, temp);
		sleep(1);
	}while(stat != 2 || fabs(temp+30) > 0.2);*/
	int imW, imH;
	char  whynot[256];
	unsigned short *buf = NULL;
	if(ApnGlueSetExpGeom (1000, 1000, 0, 0, 0, 0, 1000, 1000, &imW, &imH, whynot))
		printf("ERR set geom: %s\n", whynot);
	else do{
		double exptime = 0.03;
		int L = imW*imH;
		buf = (unsigned short*) calloc(L, sizeof(unsigned short));
		if(ApnGlueStartExp(&exptime, 1)){
			printf("Can't expose\n");
			break;
		}
		printf("Start exp [%dx%d]: %g seconds ", imW, imH, exptime);
		while(!ApnGlueExpDone()){
			stat = ApnGlueGetTemp(&temp);
			printf("stat = %d, temp=%g\n", stat, temp);
			fflush(stdout); sleep(1);}
		printf(" done\nGet image\n");
		if(ApnGlueReadPixels(buf, L, whynot)){
			printf("Error read: %s\n", whynot);
			break;
		}
		printf("buf(%d, %d) = %hu\n", imW/2, imH/2, buf[L/2]);
	}while(0);
	free(buf);
	ApnGlueSetTemp(0);
	ApnGlueSetFan(0);
}

я скомпилировал с этой библиотекой (надо будет чуть дописать прокладку между плюсами и сями, чтобы иметь возможность пользоваться всеми функциями библиотеки, а не парой-тройкой, как по умолчанию):

gcc TEST.c -lm -lapogeeu -o TEST && ./TEST 

И (о чудо!) она заработала и даже считала мне данные с матрицы, да еще как! Данные-таки менялись в зависимости от освещенности камеры.
Я счастлив. Буду дописывать прокладки, как появится время. А сейчас Гриша хочет замерить глубину посадки матрицы (чтобы заказать крепеж для камеры), так что надо будет из моей старой утилитки для работы с матрицей FLI выковярять функцию записи фитсов и пока в минимальном режиме попробовать поработать (надо-то всего лишь поперемещать камеру по оптической скамье, периодически делая съемки сходящегося пучка от оптики, проецирующей изображение освещенной диафрагмы, и из простейшей линейной аппроксимации расстояние/диаметр изображения вывести глубину посадки матрицы).


Кстати, да: оказалось, что предыдущие версии не работали, как я ни бился (и не заработали бы), т.к. на самом деле у камеры сенсор KAF16803D9, а эти говнюки писали, что там KAF16803, без "D9" (оказывается, вещи-то совершенно разные и инициализируются по-разному).