int sendChange(const Camera::Parameter & p, const Stop & s) { DPRINT("Sending stop change %s: %s\n", p.c_str(), s.getPrettyString().c_str()); if (p == "Shutterspeed") { if (s != Stop::AUTO) pslr_set_shutter(theHandle, stopAsRationalShuttertime(s)); updateExposureIfNecessary(shutterIsAuto, s); } if (p == "Aperture") { if(updateExposureIfNecessary(apertureIsAuto, s)) return 0; return pslr_set_aperture(theHandle, stopAsRationalAperture(s)); } if (p == "ISO") { updateExposureIfNecessary(isoIsAuto, s); return pslr_set_iso(theHandle, s.asISO(), pslr_get_model_extended_iso_min(theHandle), pslr_get_model_extended_iso_max(theHandle)); } if (p == "Exposure Compensation") return pslr_set_ec(theHandle, stopAsRationalExposureCompensation(s)); if (p == "Flash Exposure Compensation") return pslr_set_flash_exposure_compensation(theHandle, stopAsRationalExposureCompensation(s)); if (p == "JPEG Sharpness") return pslr_set_jpeg_sharpness(theHandle, s.asInt()); if (p == "JPEG Contrast") return pslr_set_jpeg_contrast(theHandle, s.asInt()); if (p == "JPEG Saturation") return pslr_set_jpeg_saturation(theHandle, s.asInt()); if (p == "JPEG Hue") return pslr_set_jpeg_hue(theHandle, s.asInt()); return -1; }
int servermode_socket(int servermode_timeout) { int socket_desc, c , read_size; struct sockaddr_in server , client; char client_message[2000]; char *arg; char buf[2100]; pslr_handle_t camhandle=NULL; pslr_status status; char C; float F = 0; pslr_rational_t shutter_speed = {0, 0}; uint32_t iso = 0; uint32_t auto_iso_min = 0; uint32_t auto_iso_max = 0; //Create socket socket_desc = socket(AF_INET , SOCK_STREAM , 0); if (socket_desc == -1) { fprintf(stderr, "Could not create socket"); } int enable = 1; if (setsockopt(socket_desc, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(int)) < 0) { fprintf(stderr, "setsockopt(SO_REUSEADDR) failed"); } DPRINT("Socket created\n"); //Prepare the sockaddr_in structure server.sin_family = AF_INET; server.sin_addr.s_addr = INADDR_ANY; server.sin_port = htons( 8888 ); //Bind if ( bind(socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0) { fprintf(stderr, "bind failed. Error"); return 1; } DPRINT("bind done\n"); //Listen listen(socket_desc , 3); //Accept and incoming connection DPRINT("Waiting for incoming connections...\n"); c = sizeof(struct sockaddr_in); while ( true ) { fd_set rfds; struct timeval tv; int retval; FD_ZERO(&rfds); FD_SET(socket_desc, &rfds); tv.tv_sec = servermode_timeout; tv.tv_usec = 0; retval = select(socket_desc+1, &rfds, NULL, NULL, &tv); if (retval == -1) { DPRINT("select error\n"); exit(1); } else if (retval) { client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c); if (client_sock < 0) { fprintf(stderr, "accept failed"); return 1; } DPRINT("Connection accepted\n"); } else { DPRINT("Timeout\n"); close(socket_desc); exit(0); } //Receive a message from client while ( (read_size = recv(client_sock , client_message , 2000 , 0)) > 0 ) { client_message[read_size]='\0'; strip( client_message ); DPRINT(":%s:\n",client_message); if ( !strcmp(client_message, "stopserver" ) ) { if ( camhandle ) { camera_close(camhandle); } write_socket_answer("0\n"); exit(0); } else if ( !strcmp(client_message, "disconnect" ) ) { if ( camhandle ) { camera_close(camhandle); } write_socket_answer("0\n"); } else if ( (arg = is_string_prefix( client_message, "echo")) != NULL ) { sprintf( buf, "0 %.100s\n", arg); write_socket_answer(buf); } else if ( (arg = is_string_prefix( client_message, "usleep")) != NULL ) { int microseconds = atoi(arg); usleep(microseconds); write_socket_answer("0\n"); } else if ( !strcmp(client_message, "connect") ) { if ( camhandle ) { write_socket_answer("0\n"); } else if ( (camhandle = camera_connect( NULL, NULL, -1, buf )) ) { write_socket_answer("0\n"); } else { write_socket_answer(buf); } } else if ( !strcmp(client_message, "update_status") ) { if ( check_camera(camhandle) ) { if ( !pslr_get_status(camhandle, &status) ) { sprintf( buf, "%d\n", 0); } else { sprintf( buf, "%d\n", 1); } write_socket_answer(buf); } } else if ( !strcmp(client_message, "get_camera_name") ) { if ( check_camera(camhandle) ) { sprintf(buf, "%d %s\n", 0, pslr_camera_name(camhandle)); write_socket_answer(buf); } } else if ( !strcmp(client_message, "get_lens_name") ) { if ( check_camera(camhandle) ) { sprintf(buf, "%d %s\n", 0, get_lens_name(status.lens_id1, status.lens_id2)); write_socket_answer(buf); } } else if ( !strcmp(client_message, "get_current_shutter_speed") ) { if ( check_camera(camhandle) ) { sprintf(buf, "%d %d/%d\n", 0, status.current_shutter_speed.nom, status.current_shutter_speed.denom); write_socket_answer(buf); } } else if ( !strcmp(client_message, "get_current_aperture") ) { if ( check_camera(camhandle) ) { sprintf(buf, "%d %s\n", 0, format_rational( status.current_aperture, "%.1f")); write_socket_answer(buf); } } else if ( !strcmp(client_message, "get_current_iso") ) { if ( check_camera(camhandle) ) { sprintf(buf, "%d %d\n", 0, status.current_iso); write_socket_answer(buf); } } else if ( !strcmp(client_message, "get_bufmask") ) { if ( check_camera(camhandle) ) { sprintf(buf, "%d %d\n", 0, status.bufmask); write_socket_answer(buf); } } else if ( !strcmp(client_message, "get_auto_bracket_mode") ) { if ( check_camera(camhandle) ) { sprintf(buf, "%d %d\n", 0, status.auto_bracket_mode); write_socket_answer(buf); } } else if ( !strcmp(client_message, "get_auto_bracket_picture_count") ) { if ( check_camera(camhandle) ) { sprintf(buf, "%d %d\n", 0, status.auto_bracket_picture_count); write_socket_answer(buf); } } else if ( !strcmp(client_message, "focus") ) { if ( check_camera(camhandle) ) { pslr_focus(camhandle); sprintf(buf, "%d\n", 0); write_socket_answer(buf); } } else if ( !strcmp(client_message, "shutter") ) { if ( check_camera(camhandle) ) { pslr_shutter(camhandle); sprintf(buf, "%d\n", 0); write_socket_answer(buf); } } else if ( (arg = is_string_prefix( client_message, "delete_buffer")) != NULL ) { int bufno = atoi(arg); if ( check_camera(camhandle) ) { pslr_delete_buffer(camhandle,bufno); sprintf(buf, "%d\n", 0); write_socket_answer(buf); } } else if ( (arg = is_string_prefix( client_message, "get_preview_buffer")) != NULL ) { int bufno = atoi(arg); if ( check_camera(camhandle) ) { uint8_t *pImage; uint32_t imageSize; if ( pslr_get_buffer(camhandle, bufno, PSLR_BUF_PREVIEW, 4, &pImage, &imageSize) ) { sprintf(buf, "%d %d\n", 1, imageSize); write_socket_answer(buf); } else { sprintf(buf, "%d %d\n", 0, imageSize); write_socket_answer(buf); write_socket_answer_bin(pImage, imageSize); } } } else if ( (arg = is_string_prefix( client_message, "get_buffer")) != NULL ) { int bufno = atoi(arg); if ( check_camera(camhandle) ) { uint32_t imageSize; if ( pslr_buffer_open(camhandle, bufno, PSLR_BUF_DNG, 0) ) { sprintf(buf, "%d\n", 1); write_socket_answer(buf); } else { imageSize = pslr_buffer_get_size(camhandle); sprintf(buf, "%d %d\n", 0, imageSize); write_socket_answer(buf); uint32_t current = 0; while (1) { uint32_t bytes; uint8_t buf[65536]; bytes = pslr_buffer_read(camhandle, buf, sizeof (buf)); if (bytes == 0) { break; } write_socket_answer_bin( buf, bytes); current += bytes; } pslr_buffer_close(camhandle); } } } else if ( (arg = is_string_prefix( client_message, "set_shutter_speed")) != NULL ) { if ( check_camera(camhandle) ) { // TODO: merge with pktriggercord-cli shutter speed parse if (sscanf(arg, "1/%d%c", &shutter_speed.denom, &C) == 1) { shutter_speed.nom = 1; sprintf(buf, "%d %d %d\n", 0, shutter_speed.nom, shutter_speed.denom); } else if ((sscanf(arg, "%f%c", &F, &C)) == 1) { if (F < 2) { F = F * 10; shutter_speed.denom = 10; shutter_speed.nom = F; } else { shutter_speed.denom = 1; shutter_speed.nom = F; } sprintf(buf, "%d %d %d\n", 0, shutter_speed.nom, shutter_speed.denom); } else { shutter_speed.nom = 0; sprintf(buf,"1 Invalid shutter speed value.\n"); } if (shutter_speed.nom) { pslr_set_shutter(camhandle, shutter_speed); } write_socket_answer(buf); } } else if ( (arg = is_string_prefix( client_message, "set_iso")) != NULL ) { if ( check_camera(camhandle) ) { // TODO: merge with pktriggercord-cli shutter iso if (sscanf(arg, "%d-%d%c", &auto_iso_min, &auto_iso_max, &C) != 2) { auto_iso_min = 0; auto_iso_max = 0; iso = atoi(arg); } else { iso = 0; } if (iso==0 && auto_iso_min==0) { sprintf(buf,"1 Invalid iso value.\n"); } else { pslr_set_iso(camhandle, iso, auto_iso_min, auto_iso_max); sprintf(buf, "%d %d %d-%d\n", 0, iso, auto_iso_min, auto_iso_max); } write_socket_answer(buf); } } else { write_socket_answer("1 Invalid servermode command\n"); } } if (read_size == 0) { DPRINT("Client disconnected\n"); fflush(stdout); } else if (read_size == -1) { fprintf(stderr, "recv failed\n"); } } return 0; }