cck56 / mijia-720p-ctrl

The code controls the pan/tilt motors of Mijia 720p 360 degree version
23 stars 9 forks source link

An ugly hack to mimic auto-nightmode #7

Closed iMilnb closed 2 years ago

iMilnb commented 2 years ago

Sorry for not taking the time to make it prettier, here's a very ugly hack in order to mijia_ctrl to be called by a while:;sleep loop and enable DAYNIGHT if ev value is below 1000, which is the value corresponding for my cam (ieGeek):

  diff --git a/mijia_ctrl.c b/mijia_ctrl.c
  index dcd95b8..4933f02 100644
  --- a/mijia_ctrl.c
  +++ b/mijia_ctrl.c
  @@ -267,7 +267,7 @@ int cmd_ircut(int argc, char *argv[], char *buf) {
   }

   int cmd_daynight(int argc, char *argv[], char *buf) {
  -    unsigned int val = -1;
  +    unsigned int val = -1, ev = 0;

       if ( fcntl(isp_fd, F_GETFD) == -1 ) {
           strcpy(buf, REPLY_DEV_INIT_FAIL);
  @@ -277,6 +277,17 @@ int cmd_daynight(int argc, char *argv[], char *buf) {
       if (argc == 2) {
           sscanf(argv[1], "%d", &val);
           fprintf(stdout, "daynight mode:%d\n", val);
  +        if (val == 2) {
  +            get_ev(&ev);
  +            fprintf(stdout, "ev:%d\n", ev);
  +            if (ev < 1000)
  +                val = 1;
  +            else
  +                val = 0;
  +
  +            ioctl(isp_fd, _IOW(0x6d, 0x0a, int), &val);
  +            return 0;
  +        }
           if (val <= 1) {
               ioctl(isp_fd, _IOW(0x6d, 0x0a, int), &val);
               sprintf(buf, "OK,VAL=%d\n", val);
  @@ -321,6 +332,11 @@ int cmd_ledstatus(int argc, char *argv[], char *buf) {
       return 0;
   }

  +void
  +get_ev(unsigned int *ev) {
  +    ioctl(isp_fd, _IOR(0x65, 0x1f, int), ev);
  +}
  +
   int cmd_isp_sta(int argc, char *argv[], char *buf) {
       unsigned int converge = 0, ev = 0, sta_rdy = 0;
       unsigned int awb_sta[10];
  @@ -334,7 +350,7 @@ int cmd_isp_sta(int argc, char *argv[], char *buf) {
           ioctl(isp_fd, _IOR(0x65, 0x23, int), &converge);
           sleep(1);
       }
  -    ioctl(isp_fd, _IOR(0x65, 0x1f, int), &ev);
  +    get_ev(&ev);

       while (sta_rdy != 0xf) {
           ioctl(isp_fd, _IOR(0x63, 0x09, int), &sta_rdy);

After building with this patch, mijia_ctrl DAYNIGHT,2 will enable NIGHTMODE when ev < 1000.

iMilnb commented 2 years ago

Will submit cleaner way of doing this.