/****************************************************************************
 * apps/examples/stepper/stepper.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 <sys/ioctl.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdbool.h>

#include <nuttx/motor/stepper.h>

/****************************************************************************
 * Private Functions
 ****************************************************************************/

struct stepper_args
{
  FAR const char *path;
  int microstep;
  int speed;
  int steps;
};

static int parse_args(int argc, FAR char *argv[],
                      FAR struct stepper_args *args)
{
  int i;

  if (argc < 3)
    {
      return -1;
    }

  args->path = argv[1];
  args->microstep = -1;
  args->speed = 200;

  for (i i = 2; i < argc; ++i)
    {
      if (strncmp("-m", argv[i], 2) == 0)
        {
          i++;
          if (i >= argc)
            {
              return -1;
            }

          args->microstep = atoi(argv[i]);
          i++;
        }

      if (strncmp("-s", argv[i], 2) == 0)
        {
          i++;
          if (i >= argc)
            {
              return -1;
            }

          args->speed = atoi(argv[i]);
          i++;
        }
    }

  args->steps = atoi(argv[argc - 1]);
  return 0;
}

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

int main(int argc, FAR char *argv[])
{
  struct stepper_args args;
  struct stepper_status_s status;
  struct stepper_job_s job;
  int fd;
  int rc;

  if (parse_args(argc, argv, &args) < 0)
    {
      printf("usage:\n"
            "stepper path\n"
            "              [-m microstep (sticky)]\n"
            "              [-s speed in steps/s (default 200)]\n"
            "              steps (positive: CW, negative: CCW)\n");
      return 1;
    }

  fd = open(args.path, O_RDWR);
  if (fd < 0)
    {
      printf("Oops: %s\n", strerror(errno));
      exit(1);
    }

  if (args.microstep > 0)
    {
      printf("Set microstepping to %d\n", args.microstep);
      rc = ioctl(fd, STEPIOC_MICROSTEPPING, args.microstep);
      if (rc < 0)
        {
          printf("STEPIOC_MICROSTEPPING: %s\n", strerror(errno));
          exit(2);
        }
    }

  job.steps = args.steps;
  job.speed = args.speed;

  /* Retrieve the absolute position - before movement */

  rc = read(fd, &status, sizeof(struct stepper_status_s));
  if (rc != sizeof(struct stepper_status_s))
    {
      printf("read: %s\n", strerror(errno));
    }

  printf("Position before stepper motor moving: %ld\n", status.position);

  /* Move the stepper */

  printf("GO -> %ld @ %ld steps/s\n", job.steps, job.speed);

  rc = write(fd, &job, sizeof(struct stepper_job_s)); /* blocking */
  if (rc != sizeof(struct stepper_job_s))
    {
      printf("write: %s\n", strerror(errno));
    }

  /* Retrieve the absolute position - after movement */

  rc = read(fd, &status, sizeof(struct stepper_status_s));
  if (rc != sizeof(struct stepper_status_s))
    {
      printf("read: %s\n", strerror(errno));
    }

  printf("Position after stepper motor moving: %ld\n", status.position);

  return 0;
}
