summaryrefslogtreecommitdiff
path: root/camlibs/konica/konica.c
diff options
context:
space:
mode:
Diffstat (limited to 'camlibs/konica/konica.c')
-rw-r--r--camlibs/konica/konica.c262
1 files changed, 190 insertions, 72 deletions
diff --git a/camlibs/konica/konica.c b/camlibs/konica/konica.c
index d434c5999..556c5ed13 100644
--- a/camlibs/konica/konica.c
+++ b/camlibs/konica/konica.c
@@ -158,6 +158,7 @@ k_return_status_t k_erase_image (konica_data_t *konica_data, gulong image_id)
guchar *rb = NULL;
guint rbs;
+ g_return_val_if_fail (konica_data != NULL, K_PROGRAM_ERROR);
if (!konica_data->image_id_long) {
sb[6] = image_id;
sb[7] = image_id >> 8;
@@ -256,6 +257,7 @@ k_return_status_t k_erase_all (
guchar *rb = NULL;
guint rbs;
+ g_return_val_if_fail (konica_data != NULL, K_PROGRAM_ERROR);
g_return_val_if_fail (
number_of_images_not_erased != NULL,
K_PROGRAM_ERROR);
@@ -312,6 +314,7 @@ k_return_status_t k_set_protect_status (
guchar *rb = NULL;
guint rbs;
+ g_return_val_if_fail (konica_data != NULL, K_PROGRAM_ERROR);
if (!konica_data->image_id_long) {
if (protected) sb[8] = 0x01;
sb[6] = image_id;
@@ -387,6 +390,7 @@ k_return_status_t k_get_image (
guchar *rb = NULL;
guint rbs;
+ g_return_val_if_fail (konica_data != NULL, K_PROGRAM_ERROR);
g_return_val_if_fail (image_buffer != NULL, K_PROGRAM_ERROR);
g_return_val_if_fail (*image_buffer == NULL, K_PROGRAM_ERROR);
g_return_val_if_fail (image_buffer_size != NULL, K_PROGRAM_ERROR);
@@ -483,6 +487,7 @@ k_return_status_t k_get_image_information (
guchar *rb = NULL;
guint rbs;
+ g_return_val_if_fail (konica_data != NULL, K_PROGRAM_ERROR);
g_return_val_if_fail (image_id != NULL, K_PROGRAM_ERROR);
g_return_val_if_fail (exif_size != NULL, K_PROGRAM_ERROR);
g_return_val_if_fail (protected != NULL, K_PROGRAM_ERROR);
@@ -562,6 +567,7 @@ k_return_status_t k_get_preview (
guchar *rb = NULL;
guint rbs;
+ g_return_val_if_fail (konica_data != NULL, K_PROGRAM_ERROR);
g_return_val_if_fail (image_buffer != NULL, K_PROGRAM_ERROR);
g_return_val_if_fail (*image_buffer == NULL, K_PROGRAM_ERROR);
g_return_val_if_fail (image_buffer_size != NULL, K_PROGRAM_ERROR);
@@ -626,6 +632,7 @@ k_return_status_t k_get_io_capability (
guchar *rb = NULL;
guint rbs;
+ g_return_val_if_fail (konica_data != NULL, K_PROGRAM_ERROR);
g_return_val_if_fail (bit_rate_300 != NULL, K_PROGRAM_ERROR);
g_return_val_if_fail (bit_rate_600 != NULL, K_PROGRAM_ERROR);
g_return_val_if_fail (bit_rate_1200 != NULL, K_PROGRAM_ERROR);
@@ -786,7 +793,7 @@ k_return_status_t k_get_information (
guchar *rb = NULL;
guint rbs;
- g_return_val_if_fail (model != NULL, K_PROGRAM_ERROR);
+ g_return_val_if_fail (konica_data != NULL, K_PROGRAM_ERROR); g_return_val_if_fail (model != NULL, K_PROGRAM_ERROR);
g_return_val_if_fail (*model == NULL, K_PROGRAM_ERROR);
g_return_val_if_fail (serial_number != NULL, K_PROGRAM_ERROR);
g_return_val_if_fail (*serial_number == NULL, K_PROGRAM_ERROR);
@@ -939,6 +946,7 @@ k_return_status_t k_get_status (
guchar *rb = NULL;
guint rbs;
+ g_return_val_if_fail (konica_data != NULL, K_PROGRAM_ERROR);
g_return_val_if_fail (self_test_result != NULL, K_PROGRAM_ERROR);
g_return_val_if_fail (power_level != NULL, K_PROGRAM_ERROR);
g_return_val_if_fail (power_source != NULL, K_PROGRAM_ERROR);
@@ -1077,6 +1085,7 @@ k_return_status_t k_get_date_and_time (
guchar *rb = NULL;
guint rbs;
+ g_return_val_if_fail (konica_data != NULL, K_PROGRAM_ERROR);
g_return_val_if_fail (year != NULL, K_PROGRAM_ERROR);
g_return_val_if_fail (month != NULL, K_PROGRAM_ERROR);
g_return_val_if_fail (day != NULL, K_PROGRAM_ERROR);
@@ -1140,7 +1149,8 @@ k_return_status_t k_get_preferences (
guchar *rb = NULL;
guint rbs;
- g_return_val_if_fail (shutoff_time != NULL, K_PROGRAM_ERROR);
+ g_return_val_if_fail (konica_data != NULL, K_PROGRAM_ERROR);
+ g_return_val_if_fail (shutoff_time != NULL, K_PROGRAM_ERROR);
g_return_val_if_fail (self_timer_time != NULL, K_PROGRAM_ERROR);
g_return_val_if_fail (beep != NULL, K_PROGRAM_ERROR);
g_return_val_if_fail (slide_show_interval != NULL, K_PROGRAM_ERROR);
@@ -1196,6 +1206,7 @@ k_return_status_t k_set_io_capability (
guchar *rb = NULL;
guint rbs;
+ g_return_val_if_fail (konica_data != NULL, K_PROGRAM_ERROR);
switch (bit_rate) {
case 300:
sb[4] = (1 << 0);
@@ -1325,6 +1336,7 @@ k_return_status_t k_set_preference (
guchar *rb = NULL;
guint rbs;
+ g_return_val_if_fail (konica_data != NULL, K_PROGRAM_ERROR);
switch (preference) {
case K_PREFERENCE_RESOLUTION:
sb[4] = 0x00;
@@ -1395,6 +1407,7 @@ k_return_status_t k_reset_preferences (konica_data_t *konica_data)
guchar *rb = NULL;
guint rbs;
+ g_return_val_if_fail (konica_data != NULL, K_PROGRAM_ERROR);
l_return_status = l_send_receive (konica_data, sb, 4, &rb, &rbs);
if (l_return_status != L_SUCCESS) {
g_free (rb);
@@ -1451,16 +1464,14 @@ k_return_status_t k_take_picture (
guchar *rb = NULL;
guint rbs;
+ g_return_val_if_fail (konica_data != NULL, K_PROGRAM_ERROR);
g_return_val_if_fail (image_id != NULL, K_PROGRAM_ERROR);
g_return_val_if_fail (exif_size != NULL, K_PROGRAM_ERROR);
g_return_val_if_fail (protected != NULL, K_PROGRAM_ERROR);
g_return_val_if_fail (information_buffer != NULL, K_PROGRAM_ERROR);
g_return_val_if_fail (*information_buffer == NULL, K_PROGRAM_ERROR);
- g_return_val_if_fail (information_buffer_size != NULL, K_PROGRAM_ERROR); l_return_status = l_send_receive_receive (
- konica_data,
- sb, 6,
- information_buffer, information_buffer_size,
- &rb, &rbs, 60000);
+ g_return_val_if_fail (information_buffer_size != NULL, K_PROGRAM_ERROR);
+ l_return_status = l_send_receive_receive (konica_data, sb, 6, information_buffer, information_buffer_size, &rb, &rbs, 60000);
if (l_return_status != L_SUCCESS) {
g_free (rb);
return K_RETURN_STATUS (l_return_status);
@@ -1483,32 +1494,145 @@ k_return_status_t k_take_picture (
}
-k_return_status_t k_put_localization_data (
- konica_data_t *konica_data,
- guchar *data,
- gulong data_size)
+k_return_status_t k_localization_tv_output_format_set (konica_data_t *konica_data, k_tv_output_format tv_output_format)
+{
+ /************************************************/
+ /* Command for various localization issues. */
+ /* Here: Setting of tv output format. */
+ /* */
+ /* 0x00: Byte 0 of command identifier */
+ /* 0x92: Byte 1 of command identifier */
+ /* 0x00: Reserved */
+ /* 0x00: Reserved */
+ /* 0x01: Byte 0 of localization type identifier */
+ /* 0x00: transmission of */
+ /* localization data */
+ /* 0x01: setting of tv output */
+ /* format */
+ /* 0x02: setting of date format */
+ /* 0x00: Byte 1 of localization type identifier */
+ /* 0xXX: Byte 0 of tv output format */
+ /* 0x00: NTSC */
+ /* 0x01: PAL */
+ /* 0x02: None */
+ /* 0x00: Byte 1 of tv output format */
+ /* */
+ /* Return values: */
+ /* 0x00: Byte 0 of command identifier */
+ /* 0x92: Byte 1 of command identifier */
+ /* 0xXX: Byte 0 of return status */
+ /* 0xXX: Byte 1 of return status */
+ /************************************************/
+ guchar sb[] = {0x00, 0x92, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00};
+ l_return_status_t l_return_status;
+ k_return_status_t k_return_status;
+ guchar *rb = NULL;
+ guint rbs;
+
+ g_return_val_if_fail (konica_data != NULL, K_PROGRAM_ERROR);
+ switch (tv_output_format) {
+ case K_TV_OUTPUT_FORMAT_NTSC:
+ sb[6] = 0x00;
+ break;
+ case K_TV_OUTPUT_FORMAT_PAL:
+ sb[6] = 0x01;
+ break;
+ case K_TV_OUTPUT_FORMAT_HIDE:
+ sb[6] = 0x02;
+ break;
+ default:
+ return (K_PROGRAM_ERROR);
+ }
+ l_return_status = l_send_receive (konica_data, sb, 8, &rb, &rbs);
+ if (l_return_status != L_SUCCESS) {
+ g_free (rb);
+ return K_RETURN_STATUS (l_return_status);
+ }
+ k_return_status = return_status_translation (rb[2], rb[3]);
+ g_free (rb);
+ return (k_return_status);
+}
+
+
+k_return_status_t k_localization_date_format_set (konica_data_t *konica_data, k_date_format_t date_format)
+{
+ /************************************************/
+ /* Command for various localization issues. */
+ /* Here: Setting of date format. */
+ /* */
+ /* 0x00: Byte 0 of command identifier */
+ /* 0x92: Byte 1 of command identifier */
+ /* 0x00: Reserved */
+ /* 0x00: Reserved */
+ /* 0x02: Byte 0 of localization type identifier */
+ /* 0x00: transmission of */
+ /* localization data */
+ /* 0x01: setting of tv output */
+ /* format */
+ /* 0x02: setting of date format */
+ /* 0x00: Byte 1 of localization type identifier */
+ /* 0xXX: Byte 0 of date format */
+ /* 0x00: month/day/year */
+ /* 0x01: day/month/year */
+ /* 0x02: year/month/day */
+ /* 0x00: Byte 1 of date format */
+ /* */
+ /* Return values: */
+ /* 0x00: Byte 0 of command identifier */
+ /* 0x92: Byte 1 of command identifier */
+ /* 0xXX: Byte 0 of return status */
+ /* 0xXX: Byte 1 of return status */
+ /************************************************/
+ guchar sb[] = {0x00, 0x92, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00};
+ l_return_status_t l_return_status;
+ k_return_status_t k_return_status;
+ guchar *rb = NULL;
+ guint rbs;
+
+ g_return_val_if_fail (konica_data != NULL, K_PROGRAM_ERROR);
+ switch (date_format) {
+ case K_DATE_FORMAT_MONTH_DAY_YEAR:
+ sb[6] = 0x00;
+ break;
+ case K_DATE_FORMAT_DAY_MONTH_YEAR:
+ sb[6] = 0x01;
+ break;
+ case K_DATE_FORMAT_YEAR_MONTH_DAY:
+ sb[6] = 0x02;
+ break;
+ default:
+ return (K_PROGRAM_ERROR);
+ }
+ l_return_status = l_send_receive (konica_data, sb, 8, &rb, &rbs);
+ if (l_return_status != L_SUCCESS) {
+ g_free (rb);
+ return K_RETURN_STATUS (l_return_status);
+ }
+ k_return_status = return_status_translation (rb[2], rb[3]);
+ g_free (rb);
+ return (k_return_status);
+}
+
+
+k_return_status_t k_localization_data_put (konica_data_t *konica_data, guchar *data, gulong data_size)
{
/************************************************/
- /* Command to send a localization file to the */
- /* camera. */
+ /* Command for various localization issues. */
+ /* Here: Transmission of localization data. */
/* */
/* 0x00: Byte 0 of command identifier */
/* 0x92: Byte 1 of command identifier */
/* 0x00: Reserved */
/* 0x00: Reserved */
- /* 0xXX: Byte 0 of transmission status */
- /* 0x00: packet attached */
- /* 0x01: all packets transmitted */
- /* 0x02: end of transmission */
- /* 0x00: Byte 1 of transmission status */
- /* 0xXX: Byte 0 of language */
- /* 0x00: English */
- /* 0x01: French */
- /* 0x00: Byte 1 of language */
- /* */
- /* In case of transmission status 0x00 0x00, */
- /* the following bytes are attached. */
- /* */
+ /* 0x00: Byte 0 of localization type identifier */
+ /* 0x00: transmission of */
+ /* localization data */
+ /* 0x01: setting of tv output */
+ /* format */
+ /* 0x02: setting of date format */
+ /* 0x00: Byte 1 of localization type identifier */
+ /* 0x00: Byte 0 of ? */
+ /* 0x00: Byte 1 of ? */
/* 0xXX: Byte 0 of number of bytes of packet */
/* 0xXX: Byte 1 of number of bytes of packet */
/* 0xXX: Byte 3 of memory address where to */
@@ -1532,41 +1656,52 @@ k_return_status_t k_put_localization_data (
/************************************************/
l_return_status_t l_return_status;
k_return_status_t k_return_status;
- guchar sb[1040];
guchar *rb = NULL;
guint rbs;
gulong i, j;
guint packet_size = 1024;
+ guchar sb[16 + packet_size];
g_return_val_if_fail (konica_data != NULL, K_PROGRAM_ERROR);
+ g_return_val_if_fail (data_size >= 512, K_PROGRAM_ERROR);
g_return_val_if_fail (data != NULL, K_PROGRAM_ERROR);
- g_return_val_if_fail (data_size >= 112, K_PROGRAM_ERROR);
- /****************************************/
- /* Write data to the camera's memory. */
- /****************************************/
- for (i = 0; i < packet_size + 16; i++) sb[i] = 0;
sb[0] = 0x00;
sb[1] = 0x92;
sb[2] = 0x00;
sb[3] = 0x00;
sb[4] = 0x00;
sb[5] = 0x00;
- sb[6] = data[52];
+ sb[6] = 0x00;
sb[7] = 0x00;
sb[8] = packet_size;
sb[9] = packet_size >> 8;
- for (i = 0; i <= 65536; i+= packet_size) {
+ sb[10] = 0x00;
+ sb[11] = 0x00;
+ sb[12] = 0x00;
+ sb[13] = 0x00;
+ sb[14] = 0x00;
+ sb[15] = 0x00;
+ i = 0;
+ while (TRUE) {
+ /* Set up the packet. */
sb[10] = i >> 16;
sb[11] = i >> 24;
sb[12] = i;
sb[13] = i >> 8;
- sb[14] = 0x00;
- sb[15] = 0x00;
- if (i + packet_size > 65536) sb[14] = 1;
- for (j = 0; j < packet_size; j++) {
- if ((i + j) < data_size) sb[16 + j] = data[i + j];
- else sb[16 + j] = 0xFF;
- }
+ for (j = 0; j < packet_size; j++) {
+ if ((i + j) < data_size) sb[16 + j] = data[i + j];
+ else sb[16 + j] = 0xFF;
+ }
+ /********************************************************/
+ /* We could wait until the camera sends us */
+ /* K_ERROR_LOCALIZATION_DATA_EXCESS, but it does that */
+ /* not until the 70000th byte or so. However, as we can */
+ /* provoke the message with sb[14] = 0x01, we do so as */
+ /* soon as we exceed the 65535th byte to shorten the */
+ /* transmission time. We can't do that before or the */
+ /* camera reports K_ERROR_LOCALIZATION_DATA_CORRUPT. */
+ /********************************************************/
+ if (i + packet_size > 65536) sb[14] = 0x01;
if (konica_data->debug_flag)
printf ("-> Sending packet starting at "
"memory address %i.\n", (gint) i);
@@ -1580,38 +1715,20 @@ k_return_status_t k_put_localization_data (
}
k_return_status = return_status_translation (rb[2], rb[3]);
g_free (rb);
- if (k_return_status != K_SUCCESS)
- if (k_return_status != K_ERROR_LOCALIZATION_DATA_EXCESS)
- return (k_return_status);
- }
- /****************************************/
- /* Send the information that all */
- /* packets have been transmitted. */
- /****************************************/
- if (konica_data->debug_flag) printf ("-> Sending 1.\n");
- sb[4] = 1;
- l_return_status = l_send_receive (konica_data, sb, 8, &rb, &rbs);
- if (l_return_status != L_SUCCESS) {
- g_free (rb);
- return K_RETURN_STATUS (l_return_status);
- }
- k_return_status = return_status_translation (rb[2], rb[3]);
- g_free (rb);
- if (k_return_status != K_SUCCESS) return (k_return_status);
- /****************************************/
- /* Send the information that the */
- /* localization is done. */
- /****************************************/
- if (konica_data->debug_flag) printf ("-> Sending 2.\n");
- sb[4] = 2;
- l_return_status = l_send_receive (konica_data, sb, 8, &rb, &rbs);
- if (l_return_status != L_SUCCESS) {
- g_free (rb);
- return K_RETURN_STATUS (l_return_status);
+ switch (k_return_status) {
+ case K_SUCCESS:
+ /* Everything is fine. Continue sending packets. However, make sure we don't loop forever. */
+ if (i > 131072) return (K_PROGRAM_ERROR);
+ break;
+ case K_ERROR_LOCALIZATION_DATA_EXCESS:
+ /* The camera does no longer want to receive localization data. We are done. */
+ return (K_SUCCESS);
+ default:
+ /* Something went wrong. */
+ return (k_return_status);
+ }
+ i += packet_size;
}
- k_return_status = return_status_translation (rb[2], rb[3]);
- g_free (rb);
- return (k_return_status);
}
@@ -1642,6 +1759,7 @@ k_return_status_t k_cancel (
guchar *rb = NULL;
guint rbs;
+ g_return_val_if_fail (konica_data != NULL, K_PROGRAM_ERROR);
g_return_val_if_fail (command != NULL, K_PROGRAM_ERROR);
l_return_status = l_send_receive (
konica_data,