#ifdef STUB

#define _BSD_SOURCE     /* for M_PI */
#include <features.h>

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <time.h>
#include <math.h>

#include "pin.h"

#define UNUSED        __attribute__((unused))

struct PinHandle_s {
  int           want[PIN_MAX];
  int           have[PIN_MAX];
  time_t        last_sim;
};

/* simulation loop length seconds */
#define PERIOD          30

static void simulate(PinHandle handle) {
  time_t t1 = time(NULL);
  int dt = t1 - handle->last_sim;

  /* leds */
  int change = 0;
  int changed[PIN_MAX] = { };
  for (int i = PIN_LED_RED; i <= PIN_LED_STANDBY; i++) {
    if (handle->have[i] != handle->want[i]) {
      handle->have[i] = handle->want[i];
      changed[i] = 1;
      change++;
    }
  }

  if (dt > 0) {
    int point = t1 % PERIOD;
    double curve = sin(2 * M_PI * point / (double)PERIOD);

    /* some jitter */
    handle->have[PIN_TEMP_CPU] = 70000 + curve * 30000;         /* milli degrees C */
    handle->have[PIN_TEMP_EXTERNAL] = 40000 - curve * 10000;    /* milli degrees C */
    handle->have[PIN_MVOLTS_CPU] = 3300 + curve * 100;          /* 3.3 v */


    /* fan takes a few seconds to adjust to requests */
    int want = handle->want[PIN_FAN_CHASSIS];
    if (want < 0) want = 0;
    if (want > 100) want = 100;
    int dfan = want - handle->have[PIN_FAN_CHASSIS];
    if (dfan) {
      int adjust = .5 * dfan;
      if (adjust == 0) adjust = dfan;
      handle->have[PIN_FAN_CHASSIS] += adjust;
      changed[PIN_FAN_CHASSIS] = 1;
    }

    handle->last_sim = t1;
  }

  if (dt > 0 || change) {
    for (int i = 1; i < PIN_MAX; i++) {
      fprintf(stderr, "%c%d/%d ", changed[i] ? '*' : ' ', handle->want[i], handle->have[i]);
    }
    fprintf(stderr, "\n");
  }
}

PinHandle PinCreate(void) {
  PinHandle handle = (PinHandle) calloc(1, sizeof (*handle));
  if (handle == NULL) {
    perror("malloc");
    return NULL;
  }
  return handle;
}

void PinDestroy(PinHandle handle) {
  if (handle == NULL)
    return;
  free(handle);
}

int PinIsPresent(UNUSED PinHandle handle, UNUSED PinId id) {
  return 1;
}

PinStatus PinValue(PinHandle handle, PinId id, int* valueP) {
  simulate(handle);
  *valueP = handle->have[id];
  return PIN_OKAY;
}

PinStatus PinSetValue(PinHandle handle, PinId id, int value) {
  handle->want[id] = value;
  simulate(handle);
  return PIN_OKAY;
}
#endif /* MINDSPEED */
