コード例 #1
0
void
camera_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
{
    const char *temp;
    uint8_t buff[1024];
    camera_size_t camera_size = CAMERA_SIZE_1;
    u16_t count;
    u32_t size;
    int index = 0, len = 0, tries = 10;

    if (0 == *offset) {
        /* Determine the size of picture. 1 for the smallest and 3 for the largest. */
        if (!REST.get_query_variable(request, "size", &temp)) {
            REST.get_post_variable(request, "size", &temp);
        }
        if (temp) {
            camera_size = camera_parse_size(temp[0]);
        }
        leds_toggle(LEDS_GREEN);
        camera_take_picture(camera_size, preferred_size, &size, &count);
    }

    index = *offset / preferred_size + 1;
    count = camera_get_packet_count();
    len = camera_try_get_packet(index, buff, tries);
    *offset += len;
    if (index >= count) {
        *offset = -1;
    }
    REST.set_header_content_type(response, REST.type.IMAGE_JPEG);
    REST.set_response_payload(response, buff, len);
}
コード例 #2
0
/*
 * Get one packet of the picture.
 */
void
packet_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
{
    const char *temp;
    char buf[1024];
    int no = 0, len = 0, tries = 0;

    /* Get the index of the specified packet. */
    len = REST.get_query_variable(request, "no", &temp);
    if (!len) {
        len = REST.get_post_variable(request, "no", &temp);
    }
    memcpy(buf, temp, len);
    buf[len] = '\0';
    no = atoi(buf);

    /* Get count of tries. Unused right now. */
    len = REST.get_query_variable(request, "try", &temp);
    if (!len) {
        len = REST.get_post_variable(request, "try", &temp);
    }
    if (len) {
        memcpy(buf, temp, len);
        buf[len] = '\0';
        tries = atoi(buf);
    }
    if (tries <= 0) {
        tries = 10;
    }
    len = camera_try_get_packet(no, buf, tries);
    REST.set_response_payload(response, buf, len);
    REST.set_header_content_type(response, TEXT_PLAIN);
}
コード例 #3
0
static void
udp_handler(void)
{
  static uint8_t tries = 10;
  static camera_size_t camera_size;
  static uint16_t index, count, len;
  static uint32_t size;
  char temp[MAX_PAYLOAD_LEN];

  if (uip_newdata()) {
    uip_ipaddr_copy(&server_conn->ripaddr, &UDP_HDR->srcipaddr);
    server_conn->rport = UDP_HDR->srcport;
    if (1 == uip_datalen()) {
      camera_size = camera_parse_size(((char*)uip_appdata)[0]);
      camera_take_picture(camera_size, DEFAULT_CAMERA_PACKET_SIZE, &size, &count);

      /* Send picture size and packet count. */
      /* The first 2 bytes are packet_no. */
      /* Here set packet_no to 0 as this packet is not a real packet. */
      temp[0] = temp[1] = 0;
      temp[2] = size;
      /* The next 4 bytes are size. */
      temp[3] = size >> 8;
      temp[4] = size >> 16;
      temp[5] = size >> 24;
      /* The coming is count. */
      temp[6] = count;
      temp[7] = count >> 8;
      uip_udp_packet_send(server_conn, temp, 8);

      /* Send picture packet by packet. */
      for (index = 1; index <= count; index++) {
        len = camera_try_get_packet(index, buffer, tries);
        /* The first 2 bytes are packet_no. */
        temp[0] = index;
        temp[1] = index >> 8;
        /* Copy the picture data next to packet_no. */
        memcpy(temp + 2, buffer, len);
        uip_udp_packet_send(server_conn, temp, len + 2);
      }
    } else {
コード例 #4
0
      uip_udp_packet_send(server_conn, temp, 8);

      /* Send picture packet by packet. */
      for (index = 1; index <= count; index++) {
        len = camera_try_get_packet(index, buffer, tries);
        /* The first 2 bytes are packet_no. */
        temp[0] = index;
        temp[1] = index >> 8;
        /* Copy the picture data next to packet_no. */
        memcpy(temp + 2, buffer, len);
        uip_udp_packet_send(server_conn, temp, len + 2);
      }
    } else {
      index = (uint16_t)((char*)uip_appdata)[0] & 0x00FF;
      index += ((uint16_t)((char*)uip_appdata)[1] & 0x00FF) << 8;
      len = camera_try_get_packet(index, buffer, tries);

      /* The first 2 bytes are packet_no. */
      temp[0] = index;
      temp[1] = index >> 8;
      /* Copy the picture data next to packet_no. */
      memcpy(temp + 2, buffer, len);
      uip_udp_packet_send(server_conn, temp, len + 2);
    }

    memset(&server_conn->ripaddr, 0, sizeof(server_conn->ripaddr));
    server_conn->rport = 0;
  }
}

/*---------------------------------------------------------------------------*/