Merge pull request #1387 from openmv/py_sensor_errors

Use sensor error codes in py_sensor.
This commit is contained in:
Ibrahim Abd Elkader 2021-07-02 13:26:41 +02:00 committed by GitHub
commit ff52402ca9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -67,8 +67,7 @@ static mp_obj_t py_sensor__init__()
// it gets called when the module is imported. This is good // it gets called when the module is imported. This is good
// place to check if the sensor was detected or not. // place to check if the sensor was detected or not.
if (sensor_is_detected() == false) { if (sensor_is_detected() == false) {
mp_raise_msg(&mp_type_RuntimeError, mp_raise_msg(&mp_type_RuntimeError, sensor_strerror(SENSOR_ERROR_ISC_UNDETECTED));
MP_ERROR_TEXT("The image sensor is detached or failed to initialize!"));
} }
return mp_const_none; return mp_const_none;
} }
@ -116,23 +115,9 @@ static mp_obj_t py_sensor_snapshot(uint n_args, const mp_obj_t *args, mp_map_t *
mp_obj_t image = py_image(0, 0, 0, 0); mp_obj_t image = py_image(0, 0, 0, 0);
int ret = sensor.snapshot(&sensor, (image_t *) py_image_cobj(image), 0); int ret = sensor.snapshot(&sensor, (image_t *) py_image_cobj(image), 0);
if (ret != 0) {
if (ret == -1) { mp_raise_msg(&mp_type_RuntimeError, sensor_strerror(ret));
mp_raise_msg(&mp_type_RuntimeError,
MP_ERROR_TEXT("PIXFORMAT not set!"));
} else if (ret == -2) {
mp_raise_msg(&mp_type_RuntimeError,
MP_ERROR_TEXT("Invalid Frame Size or Window!"));
} else if (ret == -3) {
mp_raise_msg(&mp_type_RuntimeError, MP_ERROR_TEXT("Framebuffer Error!"));
} else if (ret == -4) {
mp_raise_msg(&mp_type_RuntimeError, MP_ERROR_TEXT("Sensor Timeout!"));
} else if (ret == -5) {
mp_raise_msg(&mp_type_RuntimeError, MP_ERROR_TEXT("JPEG Overflow!"));
} else if (ret < 0) {
mp_raise_msg_varg(&mp_type_RuntimeError, MP_ERROR_TEXT("Capture Failed: %d"), ret);
} }
return image; return image;
} }
@ -248,7 +233,7 @@ static mp_obj_t py_sensor_dealloc_extra_fb()
static mp_obj_t py_sensor_set_pixformat(mp_obj_t pixformat) static mp_obj_t py_sensor_set_pixformat(mp_obj_t pixformat)
{ {
if (sensor_set_pixformat(mp_obj_get_int(pixformat)) != 0) { if (sensor_set_pixformat(mp_obj_get_int(pixformat)) != 0) {
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Pixel format is not supported!")); mp_raise_msg(&mp_type_RuntimeError, sensor_strerror(SENSOR_ERROR_INVALID_PIXFORMAT));
} }
return mp_const_none; return mp_const_none;
} }
@ -256,7 +241,7 @@ static mp_obj_t py_sensor_set_pixformat(mp_obj_t pixformat)
static mp_obj_t py_sensor_get_pixformat() static mp_obj_t py_sensor_get_pixformat()
{ {
if (sensor.pixformat == PIXFORMAT_INVALID) { if (sensor.pixformat == PIXFORMAT_INVALID) {
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Pixel format not set yet!")); mp_raise_msg(&mp_type_ValueError, sensor_strerror(SENSOR_ERROR_INVALID_PIXFORMAT));
} }
return mp_obj_new_int(sensor.pixformat); return mp_obj_new_int(sensor.pixformat);
} }
@ -264,7 +249,7 @@ static mp_obj_t py_sensor_get_pixformat()
static mp_obj_t py_sensor_set_framesize(mp_obj_t framesize) static mp_obj_t py_sensor_set_framesize(mp_obj_t framesize)
{ {
if (sensor_set_framesize(mp_obj_get_int(framesize)) != 0) { if (sensor_set_framesize(mp_obj_get_int(framesize)) != 0) {
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Failed to set framesize!")); mp_raise_msg(&mp_type_RuntimeError, sensor_strerror(SENSOR_ERROR_INVALID_FRAMESIZE));
} }
return mp_const_none; return mp_const_none;
} }
@ -272,7 +257,7 @@ static mp_obj_t py_sensor_set_framesize(mp_obj_t framesize)
static mp_obj_t py_sensor_get_framesize() static mp_obj_t py_sensor_get_framesize()
{ {
if (sensor.framesize == FRAMESIZE_INVALID) { if (sensor.framesize == FRAMESIZE_INVALID) {
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Frame size not set yet!")); mp_raise_msg(&mp_type_ValueError, sensor_strerror(SENSOR_ERROR_INVALID_FRAMESIZE));
} }
return mp_obj_new_int(sensor.framesize); return mp_obj_new_int(sensor.framesize);
} }
@ -280,7 +265,7 @@ static mp_obj_t py_sensor_get_framesize()
static mp_obj_t py_sensor_set_framerate(mp_obj_t framerate) static mp_obj_t py_sensor_set_framerate(mp_obj_t framerate)
{ {
if (sensor_set_framerate(mp_obj_get_int(framerate)) != 0) { if (sensor_set_framerate(mp_obj_get_int(framerate)) != 0) {
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Failed to set framerate!")); mp_raise_msg(&mp_type_RuntimeError, sensor_strerror(SENSOR_ERROR_INVALID_FRAMERATE));
} }
return mp_const_none; return mp_const_none;
} }
@ -288,7 +273,7 @@ static mp_obj_t py_sensor_set_framerate(mp_obj_t framerate)
static mp_obj_t py_sensor_get_framerate() static mp_obj_t py_sensor_get_framerate()
{ {
if (sensor.framerate == 0) { if (sensor.framerate == 0) {
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Frame rate not set yet!")); mp_raise_msg(&mp_type_ValueError, sensor_strerror(SENSOR_ERROR_INVALID_FRAMERATE));
} }
return mp_obj_new_int(sensor.framerate); return mp_obj_new_int(sensor.framerate);
} }
@ -296,7 +281,7 @@ static mp_obj_t py_sensor_get_framerate()
static mp_obj_t py_sensor_set_windowing(uint n_args, const mp_obj_t *args) static mp_obj_t py_sensor_set_windowing(uint n_args, const mp_obj_t *args)
{ {
if (sensor.framesize == FRAMESIZE_INVALID) { if (sensor.framesize == FRAMESIZE_INVALID) {
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Frame size not set yet!")); mp_raise_msg(&mp_type_ValueError, sensor_strerror(SENSOR_ERROR_INVALID_FRAMESIZE));
} }
rectangle_t temp; rectangle_t temp;
@ -339,7 +324,7 @@ static mp_obj_t py_sensor_set_windowing(uint n_args, const mp_obj_t *args)
rectangle_intersected(&r, &temp); rectangle_intersected(&r, &temp);
if (sensor_set_windowing(r.x, r.y, r.w, r.h) != 0) { if (sensor_set_windowing(r.x, r.y, r.w, r.h) != 0) {
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Failed to set windowing!")); mp_raise_msg(&mp_type_RuntimeError, sensor_strerror(SENSOR_ERROR_INVALID_WINDOW));
} }
return mp_const_none; return mp_const_none;
@ -348,7 +333,7 @@ static mp_obj_t py_sensor_set_windowing(uint n_args, const mp_obj_t *args)
static mp_obj_t py_sensor_get_windowing() static mp_obj_t py_sensor_get_windowing()
{ {
if (sensor.framesize == FRAMESIZE_INVALID) { if (sensor.framesize == FRAMESIZE_INVALID) {
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Frame size not set yet!")); mp_raise_msg(&mp_type_ValueError, sensor_strerror(SENSOR_ERROR_INVALID_FRAMESIZE));
} }
return mp_obj_new_tuple(4, (mp_obj_t []) {mp_obj_new_int(framebuffer_get_x()), return mp_obj_new_tuple(4, (mp_obj_t []) {mp_obj_new_int(framebuffer_get_x()),
@ -383,7 +368,7 @@ static mp_obj_t py_sensor_set_gainceiling(mp_obj_t gainceiling)
gain = GAINCEILING_128X; gain = GAINCEILING_128X;
break; break;
default: default:
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Invalid gainceiling")); mp_raise_msg(&mp_type_ValueError, sensor_strerror(SENSOR_ERROR_INVALID_ARGUMENT));
break; break;
} }
@ -443,8 +428,10 @@ static mp_obj_t py_sensor_set_auto_gain(uint n_args, const mp_obj_t *args, mp_ma
int enable = mp_obj_get_int(args[0]); int enable = mp_obj_get_int(args[0]);
float gain_db = py_helper_keyword_float(n_args, args, 1, kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_gain_db), NAN); float gain_db = py_helper_keyword_float(n_args, args, 1, kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_gain_db), NAN);
float gain_db_ceiling = py_helper_keyword_float(n_args, args, 2, kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_gain_db_ceiling), NAN); float gain_db_ceiling = py_helper_keyword_float(n_args, args, 2, kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_gain_db_ceiling), NAN);
if (sensor_set_auto_gain(enable, gain_db, gain_db_ceiling) != 0) {
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Sensor control failed!")); int ret = sensor_set_auto_gain(enable, gain_db, gain_db_ceiling);
if (ret != 0) {
mp_raise_msg(&mp_type_RuntimeError, sensor_strerror(ret));
} }
return mp_const_none; return mp_const_none;
} }
@ -452,8 +439,9 @@ static mp_obj_t py_sensor_set_auto_gain(uint n_args, const mp_obj_t *args, mp_ma
static mp_obj_t py_sensor_get_gain_db() static mp_obj_t py_sensor_get_gain_db()
{ {
float gain_db; float gain_db;
if (sensor_get_gain_db(&gain_db) != 0) { int ret = sensor_get_gain_db(&gain_db);
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Sensor control failed!")); if (ret != 0) {
mp_raise_msg(&mp_type_RuntimeError, sensor_strerror(ret));
} }
return mp_obj_new_float(gain_db); return mp_obj_new_float(gain_db);
} }
@ -461,8 +449,9 @@ static mp_obj_t py_sensor_get_gain_db()
static mp_obj_t py_sensor_set_auto_exposure(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) static mp_obj_t py_sensor_set_auto_exposure(uint n_args, const mp_obj_t *args, mp_map_t *kw_args)
{ {
int exposure_us = py_helper_keyword_int(n_args, args, 1, kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_exposure_us), -1); int exposure_us = py_helper_keyword_int(n_args, args, 1, kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_exposure_us), -1);
if (sensor_set_auto_exposure(mp_obj_get_int(args[0]), exposure_us) != 0) { int ret = sensor_set_auto_exposure(mp_obj_get_int(args[0]), exposure_us);
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Sensor control failed!")); if (ret != 0) {
mp_raise_msg(&mp_type_RuntimeError, sensor_strerror(ret));
} }
return mp_const_none; return mp_const_none;
} }
@ -470,8 +459,9 @@ static mp_obj_t py_sensor_set_auto_exposure(uint n_args, const mp_obj_t *args, m
static mp_obj_t py_sensor_get_exposure_us() static mp_obj_t py_sensor_get_exposure_us()
{ {
int exposure_us; int exposure_us;
if (sensor_get_exposure_us(&exposure_us) != 0) { int ret = sensor_get_exposure_us(&exposure_us);
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Sensor control failed!")); if (ret != 0) {
mp_raise_msg(&mp_type_RuntimeError, sensor_strerror(ret));
} }
return mp_obj_new_int(exposure_us); return mp_obj_new_int(exposure_us);
} }
@ -481,8 +471,10 @@ static mp_obj_t py_sensor_set_auto_whitebal(uint n_args, const mp_obj_t *args, m
int enable = mp_obj_get_int(args[0]); int enable = mp_obj_get_int(args[0]);
float rgb_gain_db[3] = {NAN, NAN, NAN}; float rgb_gain_db[3] = {NAN, NAN, NAN};
py_helper_keyword_float_array(n_args, args, 1, kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_rgb_gain_db), rgb_gain_db, 3); py_helper_keyword_float_array(n_args, args, 1, kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_rgb_gain_db), rgb_gain_db, 3);
if (sensor_set_auto_whitebal(enable, rgb_gain_db[0], rgb_gain_db[1], rgb_gain_db[2]) != 0) {
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Sensor control failed!")); int ret = sensor_set_auto_whitebal(enable, rgb_gain_db[0], rgb_gain_db[1], rgb_gain_db[2]);
if (ret != 0) {
mp_raise_msg(&mp_type_RuntimeError, sensor_strerror(ret));
} }
return mp_const_none; return mp_const_none;
} }
@ -490,16 +482,21 @@ static mp_obj_t py_sensor_set_auto_whitebal(uint n_args, const mp_obj_t *args, m
static mp_obj_t py_sensor_get_rgb_gain_db() static mp_obj_t py_sensor_get_rgb_gain_db()
{ {
float r_gain_db = 0.0, g_gain_db = 0.0, b_gain_db = 0.0; float r_gain_db = 0.0, g_gain_db = 0.0, b_gain_db = 0.0;
if (sensor_get_rgb_gain_db(&r_gain_db, &g_gain_db, &b_gain_db) != 0) { int ret = sensor_get_rgb_gain_db(&r_gain_db, &g_gain_db, &b_gain_db);
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Sensor control failed!")); if (ret != 0) {
mp_raise_msg(&mp_type_RuntimeError, sensor_strerror(ret));
} }
return mp_obj_new_tuple(3, (mp_obj_t []) {mp_obj_new_float(r_gain_db), mp_obj_new_float(g_gain_db), mp_obj_new_float(b_gain_db)}); return mp_obj_new_tuple(3, (mp_obj_t []) {
mp_obj_new_float(r_gain_db),
mp_obj_new_float(g_gain_db),
mp_obj_new_float(b_gain_db)});
} }
static mp_obj_t py_sensor_set_hmirror(mp_obj_t enable) static mp_obj_t py_sensor_set_hmirror(mp_obj_t enable)
{ {
if (sensor_set_hmirror(mp_obj_is_true(enable)) != 0) { int ret = sensor_set_hmirror(mp_obj_is_true(enable));
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Sensor control failed!")); if (ret != 0) {
mp_raise_msg(&mp_type_RuntimeError, sensor_strerror(ret));
} }
return mp_const_none; return mp_const_none;
} }
@ -511,8 +508,9 @@ static mp_obj_t py_sensor_get_hmirror()
static mp_obj_t py_sensor_set_vflip(mp_obj_t enable) static mp_obj_t py_sensor_set_vflip(mp_obj_t enable)
{ {
if (sensor_set_vflip(mp_obj_is_true(enable)) != 0) { int ret = sensor_set_vflip(mp_obj_is_true(enable));
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Sensor control failed!")); if (ret != 0) {
mp_raise_msg(&mp_type_RuntimeError, sensor_strerror(ret));
} }
return mp_const_none; return mp_const_none;
} }
@ -524,8 +522,9 @@ static mp_obj_t py_sensor_get_vflip()
static mp_obj_t py_sensor_set_transpose(mp_obj_t enable) static mp_obj_t py_sensor_set_transpose(mp_obj_t enable)
{ {
if (sensor_set_transpose(mp_obj_is_true(enable)) != 0) { int ret = sensor_set_transpose(mp_obj_is_true(enable));
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Cannot transpose in JPEG mode!")); if (ret != 0) {
mp_raise_msg(&mp_type_RuntimeError, sensor_strerror(ret));
} }
return mp_const_none; return mp_const_none;
} }
@ -537,8 +536,9 @@ static mp_obj_t py_sensor_get_transpose()
static mp_obj_t py_sensor_set_auto_rotation(mp_obj_t enable) static mp_obj_t py_sensor_set_auto_rotation(mp_obj_t enable)
{ {
if (sensor_set_auto_rotation(mp_obj_is_true(enable)) != 0) { int ret = sensor_set_auto_rotation(mp_obj_is_true(enable));
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Cannot auto rotate in JPEG mode!")); if (ret != 0) {
mp_raise_msg(&mp_type_RuntimeError, sensor_strerror(ret));
} }
return mp_const_none; return mp_const_none;
} }
@ -556,8 +556,13 @@ static mp_obj_t py_sensor_set_framebuffers(mp_obj_t count)
return mp_const_none; return mp_const_none;
} }
if ((c < 1) || (sensor_set_framebuffers(c) != 0)) { if (c < 1) {
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Invalid framebuffer count!")); mp_raise_msg(&mp_type_ValueError, sensor_strerror(SENSOR_ERROR_INVALID_ARGUMENT));
}
int ret = sensor_set_framebuffers(c);
if (ret != 0) {
mp_raise_msg(&mp_type_RuntimeError, sensor_strerror(ret));
} }
return mp_const_none; return mp_const_none;
@ -639,134 +644,125 @@ static mp_obj_t py_sensor_ioctl(uint n_args, const mp_obj_t *args)
{ {
mp_obj_t ret_obj = mp_const_none; mp_obj_t ret_obj = mp_const_none;
int request = mp_obj_get_int(args[0]); int request = mp_obj_get_int(args[0]);
int ret = SENSOR_ERROR_INVALID_ARGUMENT;
switch (request) { switch (request) {
case IOCTL_SET_READOUT_WINDOW: { case IOCTL_SET_READOUT_WINDOW: {
if (n_args < 2) { if (n_args > 2) {
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Sensor control failed!")); int x, y, w, h;
mp_obj_t *array;
mp_uint_t array_len;
mp_obj_get_array(args[1], &array_len, &array);
if (array_len == 4) {
x = mp_obj_get_int(array[0]);
y = mp_obj_get_int(array[1]);
w = mp_obj_get_int(array[2]);
h = mp_obj_get_int(array[3]);
} else if (array_len == 2) {
w = mp_obj_get_int(array[0]);
h = mp_obj_get_int(array[1]);
x = 0;
y = 0;
} else {
mp_raise_msg(&mp_type_ValueError,
MP_ERROR_TEXT("The tuple/list must either be (x, y, w, h) or (w, h)"));
}
ret = sensor_ioctl(request, x, y, w, h);
} }
int x, y, w, h;
mp_obj_t *array;
mp_uint_t array_len;
mp_obj_get_array(args[1], &array_len, &array);
if (array_len == 4) {
x = mp_obj_get_int(array[0]);
y = mp_obj_get_int(array[1]);
w = mp_obj_get_int(array[2]);
h = mp_obj_get_int(array[3]);
} else if (array_len == 2) {
w = mp_obj_get_int(array[0]);
h = mp_obj_get_int(array[1]);
x = 0;
y = 0;
} else {
mp_raise_msg(&mp_type_ValueError,
MP_ERROR_TEXT("The tuple/list must either be (x, y, w, h) or (w, h)"));
}
if (sensor_ioctl(request, x, y, w, h) != 0) {
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Sensor control failed!"));
}
break; break;
} }
case IOCTL_GET_READOUT_WINDOW: { case IOCTL_GET_READOUT_WINDOW: {
int x, y, w, h; int x, y, w, h;
if (sensor_ioctl(request, &x, &y, &w, &h) != 0) { ret = sensor_ioctl(request, &x, &y, &w, &h);
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Sensor control failed!")); if (ret == 0) {
ret_obj = mp_obj_new_tuple(4, (mp_obj_t []) {mp_obj_new_int(x),
mp_obj_new_int(y),
mp_obj_new_int(w),
mp_obj_new_int(h)});
} }
ret_obj = mp_obj_new_tuple(4, (mp_obj_t []) {mp_obj_new_int(x),
mp_obj_new_int(y),
mp_obj_new_int(w),
mp_obj_new_int(h)});
break; break;
} }
case IOCTL_SET_TRIGGERED_MODE: { case IOCTL_SET_TRIGGERED_MODE: {
if (n_args < 2 || sensor_ioctl(request, mp_obj_get_int(args[1])) != 0) { if (n_args > 2) {
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Sensor control failed!")); ret = sensor_ioctl(request, mp_obj_get_int(args[1]));
} }
break; break;
} }
case IOCTL_GET_TRIGGERED_MODE: { case IOCTL_GET_TRIGGERED_MODE: {
int enabled; int enabled;
if (sensor_ioctl(request, &enabled) != 0) { ret = sensor_ioctl(request, &enabled);
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Sensor control failed!")); if (ret == 0) {
ret_obj = mp_obj_new_bool(enabled);
} }
ret_obj = mp_obj_new_bool(enabled);
break; break;
} }
#if (OMV_ENABLE_OV5640_AF == 1) #if (OMV_ENABLE_OV5640_AF == 1)
case IOCTL_TRIGGER_AUTO_FOCUS: case IOCTL_TRIGGER_AUTO_FOCUS:
case IOCTL_PAUSE_AUTO_FOCUS: case IOCTL_PAUSE_AUTO_FOCUS:
case IOCTL_RESET_AUTO_FOCUS: { case IOCTL_RESET_AUTO_FOCUS: {
if (sensor_ioctl(request) != 0) { ret = sensor_ioctl(request);
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Sensor control failed!"));
}
break; break;
} }
case IOCTL_WAIT_ON_AUTO_FOCUS: { case IOCTL_WAIT_ON_AUTO_FOCUS: {
if (sensor_ioctl(request, (n_args < 2) ? 5000 : mp_obj_get_int(args[1])) != 0) { ret = sensor_ioctl(request, (n_args < 2) ? 5000 : mp_obj_get_int(args[1]));
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Sensor control failed!"));
}
break; break;
} }
#endif #endif
case IOCTL_LEPTON_GET_WIDTH: { case IOCTL_LEPTON_GET_WIDTH: {
int width; int width;
if (sensor_ioctl(request, &width) != 0) { ret = sensor_ioctl(request, &width);
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Sensor control failed!")); if (ret == 0) {
ret_obj = mp_obj_new_int(width);
} }
ret_obj = mp_obj_new_int(width);
break; break;
} }
case IOCTL_LEPTON_GET_HEIGHT: { case IOCTL_LEPTON_GET_HEIGHT: {
int height; int height;
if (sensor_ioctl(request, &height) != 0) { ret = sensor_ioctl(request, &height);
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Sensor control failed!")); if (ret == 0) {
ret_obj = mp_obj_new_int(height);
} }
ret_obj = mp_obj_new_int(height);
break; break;
} }
case IOCTL_LEPTON_GET_RADIOMETRY: { case IOCTL_LEPTON_GET_RADIOMETRY: {
int radiometry; int radiometry;
if (sensor_ioctl(request, &radiometry) != 0) { ret = sensor_ioctl(request, &radiometry);
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Sensor control failed!")); if (ret == 0) {
ret_obj = mp_obj_new_int(radiometry);
} }
ret_obj = mp_obj_new_int(radiometry);
break; break;
} }
case IOCTL_LEPTON_GET_REFRESH: { case IOCTL_LEPTON_GET_REFRESH: {
int refresh; int refresh;
if (sensor_ioctl(request, &refresh) != 0) { ret = sensor_ioctl(request, &refresh);
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Sensor control failed!")); if (ret == 0) {
ret_obj = mp_obj_new_int(refresh);
} }
ret_obj = mp_obj_new_int(refresh);
break; break;
} }
case IOCTL_LEPTON_GET_RESOLUTION: { case IOCTL_LEPTON_GET_RESOLUTION: {
int resolution; int resolution;
if (sensor_ioctl(request, &resolution) != 0) { ret = sensor_ioctl(request, &resolution);
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Sensor control failed!")); if (ret == 0) {
ret_obj = mp_obj_new_int(resolution);
} }
ret_obj = mp_obj_new_int(resolution);
break; break;
} }
case IOCTL_LEPTON_RUN_COMMAND: { case IOCTL_LEPTON_RUN_COMMAND: {
if (n_args < 2 || sensor_ioctl(request, mp_obj_get_int(args[1])) != 0) { if (n_args > 2) {
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Sensor control failed!")); ret = sensor_ioctl(request, mp_obj_get_int(args[1]));
} }
break; break;
} }
@ -776,9 +772,7 @@ static mp_obj_t py_sensor_ioctl(uint n_args, const mp_obj_t *args)
int command = mp_obj_get_int(args[1]); int command = mp_obj_get_int(args[1]);
uint16_t *data = (uint16_t *) mp_obj_str_get_data(args[2], &data_len); uint16_t *data = (uint16_t *) mp_obj_str_get_data(args[2], &data_len);
PY_ASSERT_TRUE_MSG(data_len > 0, "0 bytes transferred!"); PY_ASSERT_TRUE_MSG(data_len > 0, "0 bytes transferred!");
if (sensor_ioctl(request, command, data, data_len / sizeof(uint16_t)) != 0) { ret = sensor_ioctl(request, command, data, data_len / sizeof(uint16_t));
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Sensor control failed!"));
}
break; break;
} }
@ -787,117 +781,106 @@ static mp_obj_t py_sensor_ioctl(uint n_args, const mp_obj_t *args)
size_t data_len = mp_obj_get_int(args[2]); size_t data_len = mp_obj_get_int(args[2]);
PY_ASSERT_TRUE_MSG(data_len > 0, "0 bytes transferred!"); PY_ASSERT_TRUE_MSG(data_len > 0, "0 bytes transferred!");
uint16_t *data = xalloc(data_len * sizeof(uint16_t)); uint16_t *data = xalloc(data_len * sizeof(uint16_t));
if (sensor_ioctl(request, command, data, data_len) != 0) { ret = sensor_ioctl(request, command, data, data_len);
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Sensor control failed!")); if (ret == 0) {
ret_obj = mp_obj_new_bytearray_by_ref(data_len * sizeof(uint16_t), data);
} }
ret_obj = mp_obj_new_bytearray_by_ref(data_len * sizeof(uint16_t), data);
break; break;
} }
case IOCTL_LEPTON_GET_FPA_TEMPERATURE: case IOCTL_LEPTON_GET_FPA_TEMPERATURE:
case IOCTL_LEPTON_GET_AUX_TEMPERATURE: { case IOCTL_LEPTON_GET_AUX_TEMPERATURE: {
int temp; int temp;
if (sensor_ioctl(request, &temp) != 0) { ret = sensor_ioctl(request, &temp);
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Sensor control failed!")); if (ret == 0) {
ret_obj = mp_obj_new_float((((float) temp) / 100) - 273.15f);
} }
ret_obj = mp_obj_new_float((((float) temp) / 100) - 273.15f);
break; break;
} }
case IOCTL_LEPTON_SET_MEASUREMENT_MODE: case IOCTL_LEPTON_SET_MEASUREMENT_MODE:
if (n_args < 2 || sensor_ioctl(request, mp_obj_get_int(args[1])) != 0) { if (n_args > 2) {
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Sensor control failed!")); ret = sensor_ioctl(request, mp_obj_get_int(args[1]));
} }
break; break;
case IOCTL_LEPTON_GET_MEASUREMENT_MODE: { case IOCTL_LEPTON_GET_MEASUREMENT_MODE: {
int enabled; int enabled;
if (sensor_ioctl(request, &enabled) != 0) { ret = sensor_ioctl(request, &enabled);
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Sensor control failed!")); if (ret == 0) {
ret_obj = mp_obj_new_bool(enabled);
} }
ret_obj = mp_obj_new_bool(enabled);
break; break;
} }
case IOCTL_LEPTON_SET_MEASUREMENT_RANGE: case IOCTL_LEPTON_SET_MEASUREMENT_RANGE:
if (n_args < 3) { if (n_args > 3) {
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Sensor control failed!")); // GCC will not let us pass floats to ... so we have to pass float pointers instead.
} float min = mp_obj_get_float(args[1]);
// GCC will not less us pass floats to ... so we have to pass float pointers instead. float max = mp_obj_get_float(args[2]);
float min = mp_obj_get_float(args[1]); ret = sensor_ioctl(request, &min, &max);
float max = mp_obj_get_float(args[2]);
if (sensor_ioctl(request, &min, &max) != 0) {
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Sensor control failed!"));
} }
break; break;
case IOCTL_LEPTON_GET_MEASUREMENT_RANGE: { case IOCTL_LEPTON_GET_MEASUREMENT_RANGE: {
float min, max; float min, max;
if (sensor_ioctl(request, &min, &max) != 0) { ret = sensor_ioctl(request, &min, &max);
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Sensor control failed!")); if (ret == 0) {
ret_obj = mp_obj_new_tuple(2, (mp_obj_t []) {mp_obj_new_float(min), mp_obj_new_float(max)});
} }
ret_obj = mp_obj_new_tuple(2, (mp_obj_t []) {mp_obj_new_float(min), mp_obj_new_float(max)});
break; break;
} }
#if (OMV_ENABLE_HM01B0 == 1) #if (OMV_ENABLE_HM01B0 == 1)
case IOCTL_HIMAX_MD_ENABLE: { case IOCTL_HIMAX_MD_ENABLE: {
if (n_args < 2 || sensor_ioctl(request, mp_obj_get_int(args[1])) != 0) { if (n_args > 2) {
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Sensor control failed!")); ret = sensor_ioctl(request, mp_obj_get_int(args[1]));
} }
break; break;
} }
case IOCTL_HIMAX_MD_WINDOW: { case IOCTL_HIMAX_MD_WINDOW: {
if (n_args < 2) { if (n_args > 2) {
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Sensor control failed!")); int x, y, w, h;
mp_obj_t *array;
mp_uint_t array_len;
mp_obj_get_array(args[1], &array_len, &array);
if (array_len == 4) {
x = mp_obj_get_int(array[0]);
y = mp_obj_get_int(array[1]);
w = mp_obj_get_int(array[2]);
h = mp_obj_get_int(array[3]);
} else if (array_len == 2) {
w = mp_obj_get_int(array[0]);
h = mp_obj_get_int(array[1]);
x = 0;
y = 0;
} else {
mp_raise_msg(&mp_type_ValueError,
MP_ERROR_TEXT("The tuple/list must either be (x, y, w, h) or (w, h)"));
}
ret = sensor_ioctl(request, x, y, w, h);
} }
int x, y, w, h;
mp_obj_t *array;
mp_uint_t array_len;
mp_obj_get_array(args[1], &array_len, &array);
if (array_len == 4) {
x = mp_obj_get_int(array[0]);
y = mp_obj_get_int(array[1]);
w = mp_obj_get_int(array[2]);
h = mp_obj_get_int(array[3]);
} else if (array_len == 2) {
w = mp_obj_get_int(array[0]);
h = mp_obj_get_int(array[1]);
x = 0;
y = 0;
} else {
mp_raise_msg(&mp_type_ValueError,
MP_ERROR_TEXT("The tuple/list must either be (x, y, w, h) or (w, h)"));
}
if (sensor_ioctl(request, x, y, w, h) != 0) {
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Sensor control failed!"));
}
break; break;
} }
case IOCTL_HIMAX_MD_THRESHOLD: { case IOCTL_HIMAX_MD_THRESHOLD: {
if (n_args < 2 || sensor_ioctl(request, mp_obj_get_int(args[1])) != 0) { if (n_args > 2) {
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Sensor control failed!")); ret = sensor_ioctl(request, mp_obj_get_int(args[1]));
} }
break; break;
} }
case IOCTL_HIMAX_MD_CLEAR: { case IOCTL_HIMAX_MD_CLEAR: {
if (sensor_ioctl(request) != 0) { ret = sensor_ioctl(request);
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Sensor control failed!"));
}
break; break;
} }
case IOCTL_HIMAX_OSC_ENABLE: { case IOCTL_HIMAX_OSC_ENABLE: {
if (n_args < 2 || sensor_ioctl(request, mp_obj_get_int(args[1])) != 0) { if (n_args > 2) {
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Sensor control failed!")); ret = sensor_ioctl(request, mp_obj_get_int(args[1]));
} }
break; break;
} }
@ -905,10 +888,15 @@ static mp_obj_t py_sensor_ioctl(uint n_args, const mp_obj_t *args)
#endif // (OMV_ENABLE_HM01B0 == 1) #endif // (OMV_ENABLE_HM01B0 == 1)
default: { default: {
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Operation not supported!")); mp_raise_msg(&mp_type_ValueError, sensor_strerror(SENSOR_ERROR_CTL_UNSUPPORTED));
break; break;
} }
} }
if (ret != 0) {
mp_raise_msg(&mp_type_RuntimeError, sensor_strerror(ret));
}
return ret_obj; return ret_obj;
} }
@ -923,7 +911,7 @@ static mp_obj_t py_sensor_set_color_palette(mp_obj_t palette_obj)
sensor_set_color_palette(ironbow_table); sensor_set_color_palette(ironbow_table);
break; break;
default: default:
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Invalid color palette!")); mp_raise_msg(&mp_type_ValueError, sensor_strerror(SENSOR_ERROR_INVALID_ARGUMENT));
break; break;
} }
return mp_const_none; return mp_const_none;