*/
@@ -31,7 +33,8 @@
static int encoder_dev_fd = -1;
static char perror_buffer[128];
-static struct {
+static struct
+{
uint32_t valve_divide_value;
uint32_t camera_a_divide_value;
uint32_t camera_b_divide_value;
@@ -48,6 +51,7 @@ int encoder_dev_init()
{
encoder_dev_fd = open(ENCODER_DEV_PATH, O_RDWR);
ON_ERROR_RET(encoder_dev_fd, "", "", -1);
+ encoder_dev_set_divide(100, 100, 100, 100, 100);
return 0;
}
@@ -55,22 +59,33 @@ int encoder_dev_init()
* @brief Set the two divider in the hareware encoder unit.
* @param valve_divide the frequency division factor between the encoder signal and valve output
* Set ENCODER_DEV_DIVIDE_NOT_TO_SET to skip changing the division facter
- * @param camera_divide the frequency division factor between the encoder signal and camera triggle signal
+ * @param camera_a_divide the frequency division factor between the encoder signal and camera a triggle signal
+ * Set ENCODER_DEV_DIVIDE_NOT_TO_SET to skip changing the division facter
+ * @param camera_b_divide the frequency division factor between the encoder signal and camera b triggle signal
+ * Set ENCODER_DEV_DIVIDE_NOT_TO_SET to skip changing the division facter
+ * @param camera_c_divide the frequency division factor between the encoder signal and camera c triggle signal
+ * Set ENCODER_DEV_DIVIDE_NOT_TO_SET to skip changing the division facter
+ * @param camera_d_divide the frequency division factor between the encoder signal and camera d triggle signal
* Set ENCODER_DEV_DIVIDE_NOT_TO_SET to skip changing the division facter
- *
* @return 0 - success, other - error
*/
-int encoder_dev_set_divide(int valve_divide,
- int camera_a_divide,
- int camera_b_divide,
- int camera_c_divide,
- int camera_d_divide)
+int encoder_dev_set_divide(int valve_divide,
+ int camera_a_divide,
+ int camera_b_divide,
+ int camera_c_divide,
+ int camera_d_divide)
{
- encoder_dev_divide_value_structure.valve_divide_value = valve_divide;
- encoder_dev_divide_value_structure.camera_a_divide_value = camera_a_divide;
- encoder_dev_divide_value_structure.camera_b_divide_value = camera_b_divide;
- encoder_dev_divide_value_structure.camera_c_divide_value = camera_c_divide;
- encoder_dev_divide_value_structure.camera_d_divide_value = camera_d_divide;
+ if (valve_divide != ENCODER_DEV_DIVIDE_NOT_TO_SET)
+ encoder_dev_divide_value_structure.valve_divide_value = valve_divide;
+ if (camera_a_divide != ENCODER_DEV_DIVIDE_NOT_TO_SET)
+ encoder_dev_divide_value_structure.camera_a_divide_value = camera_a_divide;
+ if (camera_b_divide != ENCODER_DEV_DIVIDE_NOT_TO_SET)
+ encoder_dev_divide_value_structure.camera_b_divide_value = camera_b_divide;
+ if (camera_c_divide != ENCODER_DEV_DIVIDE_NOT_TO_SET)
+ encoder_dev_divide_value_structure.camera_c_divide_value = camera_c_divide;
+ if (camera_d_divide != ENCODER_DEV_DIVIDE_NOT_TO_SET)
+ encoder_dev_divide_value_structure.camera_d_divide_value = camera_d_divide;
+
ssize_t size = write(encoder_dev_fd, &encoder_dev_divide_value_structure, sizeof(encoder_dev_divide_value_structure));
int res = -(size != sizeof(encoder_dev_divide_value_structure));
ON_ERROR_RET(res, "size=", "", -1);
@@ -95,7 +110,18 @@ int encoder_dev_virtual_trig(int count)
* @param mode ENCODER_TRIG_MODE_EXTERNEL for externally trig, or ENCODER_TRIG_MODE_INTERNEL for internally trig
* @return 0 - success, other - error
*/
-int encoder_dev_set_trigmod(int mode)
+int encoder_dev_set_trigmod(encoder_dev_trig_mode_enum mode)
+{
+ int res = ioctl(encoder_dev_fd, _IOW('D', mode, int));
+ ON_ERROR_RET(res, "", "", -1);
+ return 0;
+}
+
+/**
+ * @brief Set the clr signal to internal or both external and internal.
+ * @return 0 - success, other - error
+ */
+int encoder_dev_set_clrmod(encoder_dev_clear_mode_enum mode)
{
int res = ioctl(encoder_dev_fd, _IOW('D', mode, int));
ON_ERROR_RET(res, "", "", -1);
@@ -127,3 +153,4 @@ int encoder_dev_deinit()
ON_ERROR_RET(res, "", "", -1);
return 0;
}
+
diff --git a/source/linux_driver/encoder_drv_test/encoder_dev.h b/source/linux_driver/encoder_drv_test/encoder_dev.h
index 1faa19b..fbc5b8e 100644
--- a/source/linux_driver/encoder_drv_test/encoder_dev.h
+++ b/source/linux_driver/encoder_drv_test/encoder_dev.h
@@ -1,16 +1,19 @@
/**
* @file encoder_dev.h
* @brief Manage the hardware encoder unit
- * @author miaow (3703781@qq.com)
- * @version 1.0
- * @date 2022/06/11
+ * @author miaow, lzy (3703781@qq.com)
+ * @version 0.11
+ * @date 2022/04/26
+ * @mainpage github.com/NanjingForestryUniversity
*
- * @copyright Copyright (c) 2022 miaow
+ * @copyright Copyright (c) 2023 miaow, lyz
*
* @par Changelog:
*
*
Date
Version
Author
Description
- *
2022/06/11
0.9
Miaow
Write this module
+ *
2022/06/11
0.9
Miaow
Write this module
+ *
2022/04/11
0.10
lyz
Add seprate dividers up to 4 cameras
+ *
2023/04/26
0.11
Miaow
Add Clear mode
*
*/
#ifndef __ENCODER_DEV_H
@@ -22,8 +25,17 @@
#define ENCODER_DEV_DIVIDE_NOT_TO_SET 0
-#define ENCODER_TRIG_MODE_EXTERNEL 100
-#define ENCODER_TRIG_MODE_INTERNEL 101
+typedef enum
+{
+ ENCODER_TRIG_MODE_EXTERNEL = 100,
+ ENCODER_TRIG_MODE_INTERNEL = 101
+} encoder_dev_trig_mode_enum;
+
+typedef enum
+{
+ ENCODER_CLEAR_MODE_BOTH = 200,
+ ENCODER_CLEAR_MODE_INTERNAL = 201
+} encoder_dev_clear_mode_enum;
int encoder_dev_set_divide(int valve_divide,
int camera_a_divide,
@@ -31,7 +43,8 @@ int encoder_dev_set_divide(int valve_divide,
int camera_c_divide,
int camera_d_divide);
int encoder_dev_flush(void);
-int encoder_dev_set_trigmod(int mode);
+int encoder_dev_set_trigmod(encoder_dev_trig_mode_enum mode);
+int encoder_dev_set_clrmod(encoder_dev_clear_mode_enum mode);
int encoder_dev_virtual_trig(int count);
int encoder_dev_init(void);
int encoder_dev_deinit(void);
diff --git a/source/linux_driver/encoder_drv_test/main.c b/source/linux_driver/encoder_drv_test/main.c
index 39420db..306374a 100644
--- a/source/linux_driver/encoder_drv_test/main.c
+++ b/source/linux_driver/encoder_drv_test/main.c
@@ -12,13 +12,28 @@ int main(int argc, char *argv[])
unsigned int a = 100, b = 100, c = 100, d = 100;
unsigned int divider = 0;
char which[32] = {0};
+ char clear_mode[32] = {0};
encoder_dev_init();
encoder_dev_set_trigmod(ENCODER_TRIG_MODE_EXTERNEL);
- encoder_dev_set_divide(500, 200, 100, 500, 50);
+ encoder_dev_set_divide(100, 100, 100, 100, 100);
signal(SIGINT, (sig_t)sig_handler);
while (1)
{
-
+ while (strcmp(clear_mode, "i") && strcmp(clear_mode, "ei"))
+ {
+ printf("clear mode(i/ei)? ");
+ scanf("%s", clear_mode);
+ }
+
+ if (strcmp(clear_mode, "i"))
+ {
+ encoder_dev_set_clrmod(ENCODER_CLEAR_MODE_INTERNAL);
+ }
+ else
+ {
+ encoder_dev_set_clrmod(ENCODER_CLEAR_MODE_BOTH);
+ }
+
while (strcmp(which, "a") && strcmp(which, "b") && strcmp(which, "c") && strcmp(which, "d") && strcmp(which, "all"))
{
printf("which camera(a/b/c/d/all)? ");
@@ -48,8 +63,9 @@ int main(int argc, char *argv[])
a = b = c = d = divider;
}
encoder_dev_set_divide(500, a, b, c, d);
- printf("divider of camera %s is set to %d\r\n\r\n", which, divider);
+ printf("clear mode is %s, divider of camera %s is set to %d\r\n\r\n", clear_mode, which, divider);
which[0] = '\0';
+ clear_mode[0] = '\0';
}
}
diff --git a/source/linux_driver/version b/source/linux_driver/version
index a58941b..840ca8c 100644
--- a/source/linux_driver/version
+++ b/source/linux_driver/version
@@ -1 +1 @@
-1.3
\ No newline at end of file
+1.4
\ No newline at end of file