kopia lustrzana https://github.com/fsphil/hadie
Make reading camera data less crazy
rodzic
bf2af64026
commit
4cf75874ad
83
c328.c
83
c328.c
|
@ -11,6 +11,7 @@
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
#include "c328.h"
|
#include "c328.h"
|
||||||
|
|
||||||
|
@ -216,3 +217,85 @@ char c3_finish_picture(void)
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************** Simple interface ******************/
|
||||||
|
|
||||||
|
static uint16_t image_len;
|
||||||
|
static uint16_t image_read;
|
||||||
|
|
||||||
|
static uint8_t *package;
|
||||||
|
static uint16_t package_len;
|
||||||
|
static uint16_t package_id;
|
||||||
|
|
||||||
|
char c3_open(uint8_t jr)
|
||||||
|
{
|
||||||
|
/* Open, setup and take the image */
|
||||||
|
if(c3_sync() != 0) return(-1);
|
||||||
|
if(c3_setup(CT_JPEG, 0, jr) != 0) return(-2);
|
||||||
|
if(c3_set_package_size(RXBUF_LEN) != 0) return(-3);
|
||||||
|
if(c3_snapshot(ST_JPEG, 0) != 0) return(-4);
|
||||||
|
if(c3_get_picture(PT_SNAPSHOT, &image_len) != 0) return(-5);
|
||||||
|
|
||||||
|
image_read = 0;
|
||||||
|
package = NULL;
|
||||||
|
package_len = 0;
|
||||||
|
package_id = 0;
|
||||||
|
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
char c3_close(void)
|
||||||
|
{
|
||||||
|
c3_finish_picture();
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t c3_read(uint8_t *ptr, uint16_t length)
|
||||||
|
{
|
||||||
|
uint16_t r;
|
||||||
|
|
||||||
|
/* Don't read past the end of the image */
|
||||||
|
r = image_len - image_read;
|
||||||
|
if(length > r) length = r;
|
||||||
|
|
||||||
|
r = length;
|
||||||
|
while(r)
|
||||||
|
{
|
||||||
|
if(package_len == 0)
|
||||||
|
{
|
||||||
|
char i = c3_get_package(package_id++, &package, &package_len);
|
||||||
|
if(i != 0) return(length - r);
|
||||||
|
|
||||||
|
/* Skip the package headers and checksum */
|
||||||
|
package += 4;
|
||||||
|
package_len -= 6;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
uint16_t b = r;
|
||||||
|
if(b > package_len) b = package_len;
|
||||||
|
|
||||||
|
memcpy(ptr, package, b);
|
||||||
|
|
||||||
|
package += b;
|
||||||
|
package_len -= b;
|
||||||
|
|
||||||
|
ptr += b;
|
||||||
|
r -= b;
|
||||||
|
|
||||||
|
image_read += b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return(length);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t c3_filesize(void)
|
||||||
|
{
|
||||||
|
return(image_len);
|
||||||
|
}
|
||||||
|
|
||||||
|
char c3_eof(void)
|
||||||
|
{
|
||||||
|
return(image_read >= image_len);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
6
c328.h
6
c328.h
|
@ -100,4 +100,10 @@ extern char c3_get_picture(uint8_t pt, uint16_t *length);
|
||||||
extern char c3_get_package(uint16_t id, uint8_t **dst, uint16_t *length);
|
extern char c3_get_package(uint16_t id, uint8_t **dst, uint16_t *length);
|
||||||
extern char c3_finish_picture(void);
|
extern char c3_finish_picture(void);
|
||||||
|
|
||||||
|
extern char c3_open(uint8_t jr);
|
||||||
|
extern char c3_close(void);
|
||||||
|
extern uint16_t c3_read(uint8_t *ptr, uint16_t length);
|
||||||
|
extern uint16_t c3_filesize(void);
|
||||||
|
extern char c3_eof(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
118
hadie.c
118
hadie.c
|
@ -30,8 +30,6 @@ char msg[MSG_SIZE];
|
||||||
#define PKT_SIZE_RSCODES (0x20)
|
#define PKT_SIZE_RSCODES (0x20)
|
||||||
#define PKT_SIZE_PAYLOAD (PKT_SIZE - PKT_SIZE_HEADER - PKT_SIZE_RSCODES)
|
#define PKT_SIZE_PAYLOAD (PKT_SIZE - PKT_SIZE_HEADER - PKT_SIZE_RSCODES)
|
||||||
uint8_t pkt[PKT_SIZE];
|
uint8_t pkt[PKT_SIZE];
|
||||||
uint16_t pkt_len;
|
|
||||||
uint16_t image_len;
|
|
||||||
uint8_t image_pkts;
|
uint8_t image_pkts;
|
||||||
|
|
||||||
void init_packet(uint8_t *packet, uint8_t imageid, uint8_t pktid, uint8_t pkts, uint16_t width, uint16_t height)
|
void init_packet(uint8_t *packet, uint8_t imageid, uint8_t pktid, uint8_t pkts, uint16_t width, uint16_t height)
|
||||||
|
@ -49,129 +47,41 @@ void init_packet(uint8_t *packet, uint8_t imageid, uint8_t pktid, uint8_t pkts,
|
||||||
memset(&packet[PKT_SIZE_HEADER], 0, PKT_SIZE_PAYLOAD);
|
memset(&packet[PKT_SIZE_HEADER], 0, PKT_SIZE_PAYLOAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
char setup_camera(void)
|
|
||||||
{
|
|
||||||
if(c3_sync() != 0)
|
|
||||||
{
|
|
||||||
rtx_string_P(PSTR(PREFIX CALLSIGN ":Camera sync failed...\n"));
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Setup the camera */
|
|
||||||
if(c3_setup(CT_JPEG, 0, SR_320x240) != 0)
|
|
||||||
{
|
|
||||||
rtx_string_P(PSTR(PREFIX CALLSIGN ":Camera setup failed...\n"));
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set the package size */
|
|
||||||
if(c3_set_package_size(PKT_SIZE_PAYLOAD + 6) != 0)
|
|
||||||
{
|
|
||||||
rtx_string_P(PSTR(PREFIX CALLSIGN ":Package size set failed!\n"));
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Take the image */
|
|
||||||
if(c3_snapshot(ST_JPEG, 0) != 0)
|
|
||||||
{
|
|
||||||
rtx_string_P(PSTR(PREFIX CALLSIGN ":Snapshot failed!\n"));
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get the image size and begin the transfer */
|
|
||||||
if(c3_get_picture(PT_SNAPSHOT, &image_len) != 0)
|
|
||||||
{
|
|
||||||
rtx_string_P(PSTR(PREFIX CALLSIGN ":Get picture failed\n"));
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Calculate the number of packets needed for this image */
|
|
||||||
image_pkts = image_len / PKT_SIZE_PAYLOAD;
|
|
||||||
image_pkts += (image_len % PKT_SIZE_PAYLOAD > 0 ? 1 : 0);
|
|
||||||
|
|
||||||
/* Camera is ready to transfer the image data */
|
|
||||||
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
char tx_image(void)
|
char tx_image(void)
|
||||||
{
|
{
|
||||||
static char setup = 0;
|
static char setup = 0;
|
||||||
|
|
||||||
static uint16_t pkg_id;
|
|
||||||
static uint8_t *pkg;
|
|
||||||
static uint16_t pkg_len;
|
|
||||||
|
|
||||||
static uint8_t img_id = 0;
|
static uint8_t img_id = 0;
|
||||||
static uint16_t img_tx;
|
|
||||||
static uint8_t pkt_id;
|
static uint8_t pkt_id;
|
||||||
|
|
||||||
if(!setup)
|
if(!setup)
|
||||||
{
|
{
|
||||||
if(setup_camera() != 0) return(setup);
|
uint16_t image_len;
|
||||||
setup = -1;
|
|
||||||
|
|
||||||
|
if(c3_open(SR_320x240) != 0) return(setup);
|
||||||
|
setup = -1;
|
||||||
pkt_id = 0;
|
pkt_id = 0;
|
||||||
pkg_len = 0;
|
|
||||||
pkg_id = 0;
|
|
||||||
img_tx = 0;
|
|
||||||
img_id++;
|
img_id++;
|
||||||
|
|
||||||
|
/* Calculate the number of packets needed for this image */
|
||||||
|
image_len = c3_filesize();
|
||||||
|
image_pkts = image_len / PKT_SIZE_PAYLOAD;
|
||||||
|
image_pkts += (image_len % PKT_SIZE_PAYLOAD > 0 ? 1 : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialise the packet -- make sure previous packet has finished TX'ing! */
|
/* Initialise the packet */
|
||||||
init_packet(pkt, img_id, pkt_id++, image_pkts, 320, 240);
|
init_packet(pkt, img_id, pkt_id++, image_pkts, 320, 240);
|
||||||
pkt_len = 0;
|
|
||||||
|
|
||||||
while(pkt_len < PKT_SIZE_PAYLOAD)
|
c3_read(&pkt[PKT_SIZE_HEADER], PKT_SIZE_PAYLOAD);
|
||||||
|
|
||||||
|
if(c3_eof())
|
||||||
{
|
{
|
||||||
if(pkg_len == 0)
|
c3_close();
|
||||||
{
|
setup = 0;
|
||||||
char msg[100];
|
|
||||||
char i;
|
|
||||||
if((i = c3_get_package(pkg_id++, &pkg, &pkg_len)) != 0)
|
|
||||||
{
|
|
||||||
snprintf(msg, 100, PREFIX CALLSIGN ",Get package %i failed (%i)\n", pkg_id - 1, i);
|
|
||||||
rtx_string(msg);
|
|
||||||
rtx_wait();
|
|
||||||
|
|
||||||
setup = 0;
|
|
||||||
return(setup);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Skip the package header */
|
|
||||||
pkg += 4;
|
|
||||||
pkg_len -= 6;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(pkg_len > 0)
|
|
||||||
{
|
|
||||||
uint16_t l = PKT_SIZE_PAYLOAD - pkt_len;
|
|
||||||
if(pkg_len < l) l = pkg_len;
|
|
||||||
|
|
||||||
/* TODO: Copy with the JPEG filter */
|
|
||||||
memcpy(pkt + PKT_SIZE_HEADER + pkt_len, pkg, l);
|
|
||||||
|
|
||||||
pkg += l;
|
|
||||||
pkg_len -= l;
|
|
||||||
pkt_len += l;
|
|
||||||
img_tx += l;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Have we reached the end of the image? */
|
|
||||||
if(img_tx >= image_len)
|
|
||||||
{
|
|
||||||
c3_finish_picture();
|
|
||||||
setup = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
encode_rs_8(&pkt[1], &pkt[PKT_SIZE_HEADER + PKT_SIZE_PAYLOAD], 0);
|
encode_rs_8(&pkt[1], &pkt[PKT_SIZE_HEADER + PKT_SIZE_PAYLOAD], 0);
|
||||||
rtx_string_P(PSTR("UUU")); /* U = 0x55 */
|
rtx_string_P(PSTR("UUU")); /* U = 0x55 */
|
||||||
rtx_data(pkt, PKT_SIZE);
|
rtx_data(pkt, PKT_SIZE);
|
||||||
//rtx_wait();
|
|
||||||
|
|
||||||
//c3_ping();
|
|
||||||
|
|
||||||
return(setup);
|
return(setup);
|
||||||
}
|
}
|
||||||
|
|
Ładowanie…
Reference in New Issue