From cbdc235291bef4bea0034256b4315a9862ce699a Mon Sep 17 00:00:00 2001 From: Philip Heron Date: Tue, 6 Jul 2010 12:16:42 +0100 Subject: [PATCH] Updates --- c328.c | 15 +++--- hadie.c | 148 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 148 insertions(+), 15 deletions(-) diff --git a/c328.c b/c328.c index 21f95d0..ca73afb 100644 --- a/c328.c +++ b/c328.c @@ -6,7 +6,7 @@ #include "c328.h" /* >10ms timeout at 300 hz */ -#define CMD_TIMEOUT (4) +#define CMD_TIMEOUT (20) /* Wait longer for the camera to take the image and return DATA response */ #define PIC_TIMEOUT (200) @@ -14,9 +14,9 @@ #define RXREADY (UCSR0A & (1 << RXC0)) /* Receive buffer */ -#define RXBUF_LEN (64) -static uint8_t rxbuf[RXBUF_LEN]; -static uint16_t rxbuf_len = 0; +#define RXBUF_LEN (256) +uint8_t rxbuf[RXBUF_LEN]; +uint16_t rxbuf_len = 0; /* Expected package size */ static uint8_t pkg_len = 64; /* Default is 64 according to datasheet */ @@ -82,9 +82,9 @@ static char c3_cmd(uint8_t cmd, uint8_t a1, uint8_t a2, uint8_t a3, uint8_t a4) void c3_init(void) { - /* Do UART initialisation, port 0 @ 57600 baud for 7.3728 MHz clock */ + /* Do UART initialisation, port 0 @ 9600 baud for 7.3728 MHz clock */ UBRR0H = 0; - UBRR0L = 7; + UBRR0L = 47; /* Enable TX & RX */ UCSR0B = (1 << RXEN0) | (1 << TXEN0); @@ -108,6 +108,7 @@ char c3_sync(void) /* ACK the SYNC and return success code */ c3_tx(CMD_ACK, CMD_SYNC, 0, 0, 0); + return(0); } @@ -186,7 +187,7 @@ char c3_get_package(uint16_t id, uint8_t **dst, uint16_t *length) /* Test for timeout or incomplete package */ if(rxbuf_len != s) return(-1); - /* Test checksum */ + /* Fix and test checksum */ checksum -= rxbuf[rxbuf_len - 2]; if(checksum != rxbuf[rxbuf_len - 2]) return(-1); diff --git a/hadie.c b/hadie.c index 2b1f779..fc04f51 100644 --- a/hadie.c +++ b/hadie.c @@ -8,34 +8,166 @@ /* copy should be included with this source. */ #include "config.h" +#include +#include #include #include #include #include "rtty.h" +#include "c328.h" #include "rs8.h" -uint16_t gps_CRC16_checksum(char *s) +/* Message buffer */ +#define MSG_SIZE (100) +char msg[MSG_SIZE]; + +/* Image TX data */ +#define PKT_SIZE (0x100) +#define PKT_SIZE_HEADER (0x06) +#define PKT_SIZE_RSCODES (0x20) +#define PKT_SIZE_PAYLOAD (PKT_SIZE - PKT_SIZE_HEADER - PKT_SIZE_RSCODES) +uint8_t pkt[PKT_SIZE]; +uint16_t pkt_len; +uint16_t image_len; + +void init_packet(uint8_t *packet, uint8_t imageid, uint8_t pktid, uint16_t filesize) { - uint16_t x; + packet[0] = 0x55; /* Preamble */ + packet[1] = 0x66; /* Marker */ + packet[2] = imageid; /* Image ID */ + packet[3] = pktid; /* Packet ID */ + packet[4] = filesize & 0XFF; /* Filesize LSB */ + packet[5] = filesize >> 8; /* Filesize MSB */ + memset(&packet[PKT_SIZE_HEADER], 0, PKT_SIZE_PAYLOAD); +} + +char setup_camera(void) +{ + if(c3_sync() != 0) + { + rtx_string_P(PSTR("$$" CALLSIGN ":Camera sync failed...\n")); + return(-1); + } - for(x = 0xFFFF; *s; s++) - x = _crc_xmodem_update(x, (uint8_t) *s); + /* Setup the camera */ + if(c3_setup(CT_JPEG, 0, SR_320x240) != 0) + { + rtx_string_P(PSTR("$$" CALLSIGN ":Camera setup failed...\n")); + return(-1); + } - return(x); + /* Set the package size */ + if(c3_set_package_size(PKT_SIZE_PAYLOAD + 6) != 0) + { + rtx_string_P(PSTR("$$" CALLSIGN ":Package size set failed!\n")); + return(-1); + } + + /* Take the image */ + if(c3_snapshot(ST_JPEG, 0) != 0) + { + rtx_string_P(PSTR("$$" 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("$$" CALLSIGN ":Get picture failed\n")); + return(-1); + } + + /* Camera is ready to transfer the image data */ + + return(0); +} + +char tx_image(void) +{ + 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 pkt_id; + + if(!setup) + { + if(setup_camera() != 0) return(-1); + setup = -1; + + pkt_id = 0; + pkg_len = 0; + pkg_id = 0; + } + + /* Initialise the packet -- make sure previous packet has finished TX'ing! */ + init_packet(pkt, img_id, pkt_id++, image_len); + pkt_len = 0; + + while(pkt_len < PKT_SIZE_PAYLOAD) + { + if(pkg_len == 0) + { + char msg[100]; + if(c3_get_package(pkg_id++, &pkg, &pkg_len) != 0) + { + snprintf(msg, 100, "$$" CALLSIGN ",Get package %i failed, had %i bytes: %02X %02X %02X %02X\n", pkg_id - 1, pkg_len, pkg[0], pkg[1], pkg[2], pkg[3]); + rtx_string(msg); + rtx_wait(); + + setup = 0; + return(-1); + } + + snprintf(msg, 100, "$$" CALLSIGN ",Got package %i, %i bytes, %i in pkt\n", pkg_id - 1, pkg_len, pkt_len); + rtx_string(msg); + rtx_wait(); + + /* 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; + + memcpy(pkt + PKT_SIZE_HEADER + pkt_len, pkg, l); + + pkg += l; + pkg_len -= l; + pkt_len += l; + } + } + + rtx_string_P(PSTR("TX'ing packet\n")); + encode_rs_8(&pkt[1], &pkt[PKT_SIZE_HEADER + PKT_SIZE_PAYLOAD], 0); + rtx_data(pkt, PKT_SIZE); + + return(0); } int main(void) { - /* Initalise the radio, and let it settle */ + /* Initalise the various bits */ rtx_init(); + c3_init(); + + /* Let the radio settle before beginning */ _delay_ms(2000); - /* Start interrupts and enter main loop */ + /* Start interrupts and enter the main loop */ sei(); while(1) { - rtx_string_P(PSTR("Hello, World!\n")); + tx_image(); + rtx_wait(); + //rtx_string_P(PSTR("$$" CALLSIGN ",TEST\n")); } return(0);