USB温度計

http://www.amazon.co.jp/%E3%83%90%E3%83%AB%E3%82%AF-USB%E6%B8%A9%E5%BA%A6%E8%A8%88-USB-thermometer/dp/B004FI1570
買ってみた。githublinux用のツールがあるので拝借。
GitHub - bitplane/temper: App to log the current temperature from a Temper1 sensor
一部FreeBSDではエラーになるので直して使っていたのだが、手元の環境では2,3日すると固まって温度が取れなくなる&プロセスも切れない。(USBバスが固まるのかシャットダウンもできない)な状態になる。
なんか、何度もオープンしたりクローズしたりするのがよくない感じっぽいので、libeventで簡単http鯖になってもらうことにした。

static usb_dev_handle *temperdev;

int main(int argc, const char* argv[])
{
  struct event_base *ev_base;
  struct evhttp *httpd;

  ev_base = event_base_new();
  httpd = evhttp_new(ev_base);
  if (evhttp_bind_socket(httpd,"127.0.0.1",PORT) < 0) {
    perror("evhttp_bind_socket()");
    exit(1);
  }

  temperdev = temperopendev();

  evhttp_set_gencb(httpd, req_handler, NULL);
  event_base_dispatch(ev_base);
  evhttp_free(httpd);
  event_base_free(ev_base);
  temperclosedev(temperdev);
  return 0;
}

void req_handler(struct evhttp_request *r, void *arg)
{
  struct evbuffer *evbuf;
  char content_length[8];
  char buf[128];

  evbuf = evbuffer_new();
  if (evbuf == NULL) {
    evhttp_send_error(r, HTTP_SERVUNAVAIL, "Failed to create buffer");
    return;
  }

  snprintf(buf,128,"%f\n",gettemp(temperdev));
  snprintf(content_length, 7, "%d", strlen(buf));
  evhttp_add_header(r->output_headers, "Content-Type", "text/plain");
  evhttp_add_header(r->output_headers, "Content-Length", content_length);
  evbuffer_add(evbuf, buf, strlen(buf));
  evhttp_send_reply(r, HTTP_OK, "", evbuf);
  evbuffer_free(evbuf);
}

なんかサンプルに毛が生えた程度だが、
何が来ても温度返すだけで安定した感じw。