/****************************************************************************
 * apps/testing/monkey/monkey.c
 *
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.  The
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance with the
 * License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 * License for the specific language governing permissions and limitations
 * under the License.
 *
 ****************************************************************************/

/****************************************************************************
 * Included Files
 ****************************************************************************/

#include <nuttx/config.h>
#include <stdlib.h>
#include <string.h>
#include <inttypes.h>
#include "monkey.h"
#include "monkey_recorder.h"
#include "monkey_assert.h"
#include "monkey_log.h"
#include "monkey_dev.h"
#include "monkey_utils.h"

/****************************************************************************
 * Pre-processor Definitions
 ****************************************************************************/

#define MONKEY_DEV_PATH_TOUCH "/dev/input0"
#define MONKEY_DEV_PATH_BUTTON "/dev/buttons"
#define MONKEY_DEV_PATH_UTOUCH "/dev/utouch"
#define MONKEY_DEV_PATH_UBUTTON "/dev/ubutton"

#define MONKEY_DEV_CREATE_MATCH(monkey, type_mask, type)                  \
do {                                                                      \
  if (((type_mask) & MONKEY_DEV_TYPE_##type) == MONKEY_DEV_TYPE_##type)   \
    {                                                                     \
      FAR struct monkey_dev_s *dev;                                       \
      dev = monkey_dev_create(MONKEY_DEV_PATH_##type,                     \
                              MONKEY_DEV_TYPE_##type);                    \
      if (!dev)                                                           \
        {                                                                 \
          goto failed;                                                    \
        }                                                                 \
      (monkey)->devs[(monkey)->dev_num] = dev;                            \
      (monkey)->dev_num++;                                                \
    }                                                                     \
} while (0)

/****************************************************************************
 * Public Functions
 ****************************************************************************/

/****************************************************************************
 * Name: monkey_create
 ****************************************************************************/

FAR struct monkey_s *monkey_create(int dev_type_mask)
{
  FAR struct monkey_s *monkey = calloc(1, sizeof(struct monkey_s));
  MONKEY_ASSERT_NULL(monkey);

  if (MONKEY_IS_UINPUT_TYPE(dev_type_mask))
    {
      MONKEY_DEV_CREATE_MATCH(monkey, dev_type_mask, UTOUCH);
      MONKEY_DEV_CREATE_MATCH(monkey, dev_type_mask, UBUTTON);
    }
  else
    {
      MONKEY_DEV_CREATE_MATCH(monkey, dev_type_mask, TOUCH);
      MONKEY_DEV_CREATE_MATCH(monkey, dev_type_mask, BUTTON);
    }

  if (monkey->dev_num == 0)
    {
      MONKEY_LOG_ERROR("NO enabled device detected");
      goto failed;
    }

  MONKEY_ASSERT(monkey->dev_num <= MONKEY_DEV_MAX_NUM);

  MONKEY_LOG_NOTICE("OK");

  return monkey;

failed:
  monkey_delete(monkey);
  return NULL;
}

/****************************************************************************
 * Name: monkey_delete
 ****************************************************************************/

void monkey_delete(FAR struct monkey_s *monkey)
{
  int i;
  MONKEY_ASSERT_NULL(monkey);

  for (i = 0; i < monkey->dev_num; i++)
    {
      monkey_dev_delete(monkey->devs[i]);
    }

  if (monkey->recorder)
    {
      monkey_recorder_delete(monkey->recorder);
      monkey->recorder = NULL;
    }

  free(monkey);
  MONKEY_LOG_NOTICE("OK");
}

/****************************************************************************
 * Name: monkey_config_default_init
 ****************************************************************************/

void monkey_config_default_init(FAR struct monkey_config_s *config)
{
  MONKEY_ASSERT_NULL(config);
  memset(config, 0, sizeof(struct monkey_config_s));
  config->screen.hor_res = 480;
  config->screen.ver_res = 480;
  config->period.min = 100;
  config->period.max = 500;
}

/****************************************************************************
 * Name: monkey_set_config
 ****************************************************************************/

void monkey_set_config(FAR struct monkey_s *monkey,
                       FAR const struct monkey_config_s *config)
{
  MONKEY_ASSERT_NULL(monkey);
  MONKEY_ASSERT_NULL(config);
  monkey->config = *config;
}

/****************************************************************************
 * Name: monkey_set_mode
 ****************************************************************************/

void monkey_set_mode(FAR struct monkey_s *monkey,
                     enum monkey_mode_e mode)
{
  MONKEY_ASSERT_NULL(monkey);
  monkey->mode = mode;
}

/****************************************************************************
 * Name: monkey_set_period
 ****************************************************************************/

void monkey_set_period(FAR struct monkey_s *monkey, uint32_t period)
{
  MONKEY_ASSERT_NULL(monkey);
  monkey->config.period.min = period;
  monkey->config.period.max = period;
}

/****************************************************************************
 * Name: monkey_set_recorder_path
 ****************************************************************************/

bool monkey_set_recorder_path(FAR struct monkey_s *monkey,
                              FAR const char *path)
{
  MONKEY_ASSERT_NULL(monkey);

  if (monkey->mode == MONKEY_MODE_RECORD)
    {
      monkey->recorder = monkey_recorder_create(path,
                          MONKEY_RECORDER_MODE_RECORD);
    }
  else if (monkey->mode == MONKEY_MODE_PLAYBACK)
    {
      monkey->recorder = monkey_recorder_create(path,
                          MONKEY_RECORDER_MODE_PLAYBACK);
    }
  else
    {
      MONKEY_LOG_WARN("mismatched mode: %d", monkey->mode);
    }

  return (monkey->recorder != NULL);
}
