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); }
/* * 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); }
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 {
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; } } /*---------------------------------------------------------------------------*/