Example #1
0
void
transmit_raw_buffer(int *data, int len)
{
    int i;
    char sent[5];
    snprintf(sent, 4, "%d: ", len);
    uart1_transmit_string(sent);

    for (i = 0; i < len; i++)
    {
        snprintf(sent, 4, "%03X ", data[i]);
        uart1_transmit_string(sent);
    }
    printf("\n");
}
Example #2
0
/***************************************************************************
 *  20  01  XX  XX  Speed through water: XXXX/10 Knots
 *                  Corresponding NMEA sentence: VHW
 */
int
water_temperature(int *data, int len, int oformat)
{
    char            buf[PRINTF_BUFSIZE+1];


    if (len != (data[1] & 0x3) + 3)
        return 1;

    if (oformat == FORMAT_NMEA)
    {

        return 0;
    }

    if (oformat == FORMAT_JSON)
    {
        return 0;
    }

    if (oformat == FORMAT_HUMAN)
    {
        snprintf(buf, PRINTF_BUFSIZE, "Water temperature: %d C %d F\n", data[2], data[3]);
        uart1_transmit_string(buf);
        return 0;
    }
}
Example #3
0
/***************************************************************************
 *  20  01  XX  XX  Speed through water: XXXX/10 Knots
 *                  Corresponding NMEA sentence: VHW
 */
int
speed_through_water(int *data, int len, int oformat)
{
    char            buf[PRINTF_BUFSIZE+1];
    int             spd_raw;
    float           spd;

    if (len != data[1]+3)
        return 1;

    spd_raw = data[3] << 8 | data[2];
    spd = spd_raw / 10.0;

    if (oformat == FORMAT_NMEA)
    {

        return 0;
    }

    if (oformat == FORMAT_JSON)
    {
        return 0;
    }

    if (oformat == FORMAT_HUMAN)
    {
        snprintf(buf, PRINTF_BUFSIZE, "Speed through water: %f kts\n", spd);
        uart1_transmit_string(buf);
        return 0;
    }
}
Example #4
0
/***************************************************************************
 * Apparent Wind Speed sentence
 *
 *  11  01  XX  0Y  Apparent Wind Speed: (XX & 0x7F) + Y/10 Knots
 *                  Units flag: XX&0x80=0    => Display value in Knots
 *                              XX&0x80=0x80 => Display value in Meter/Second
 *                  Corresponding NMEA sentence: MWV
 */
int
apparent_wind_speed(int *data, int len, int oformat, struct wind_data *wd)
{
    char            buf[PRINTF_BUFSIZE+1];
    int             ws_raw;
    float           ws;

    if (len != data[1]+3)
        return 1;

    ws_raw = (data[2] & 0x7F)*10 + (data[3] & 0x0F);
    ws = ws_raw / 10.0;

    if (oformat == FORMAT_NMEA)
    {
        wd->wd_speed = ws;
        wd->wd_speed_age = time;
        transmit_wind_data(wd);
        return 0;
    }

    if (oformat == FORMAT_JSON)
    {
        return 0;
    }

    if (oformat == FORMAT_HUMAN)
    {
        snprintf(buf, PRINTF_BUFSIZE, "Wind speed: %f deg\n", ws);
        uart1_transmit_string(buf);
        return 0;
    }
}
Example #5
0
/***************************************************************************
 * Apparent Wind Angle sentence
 *
 * 10  01  XX  YY  Apparent Wind Angle: XXYY/2 degrees right of bow
 *               Used for autopilots Vane Mode (WindTrim)
 *               Corresponding NMEA sentence: MWV
 */
int
apparent_wind_angle(int *data, int len, int oformat, struct wind_data *wd)
{
    char            buf[PRINTF_BUFSIZE+1];
    int             wa_raw;
    float           wa;

    if (len != data[1]+3)
        return 1;

    wa_raw = (data[2] << 8) | (data[3] & 0xFF);
    wa = wa_raw / 2.0;

    if (oformat == FORMAT_NMEA)
    {
        wd->wd_angle = wa;
        wd->wd_angle_age = time;
        transmit_wind_data(wd);
        return 0;
    }

    if (oformat == FORMAT_JSON)
    {
        return 0;
    }

    if (oformat == FORMAT_HUMAN)
    {
        snprintf(buf, PRINTF_BUFSIZE, "Wind angle: %f deg\n", wa);
        uart1_transmit_string(buf);
        return 0;
    }
}
Example #6
0
/***************************************************************************
 * Depth Below Transducer sentence
 *
 *  00  02  YZ  XX XX  Depth below transducer: XXXX/10 feet
 *                     Flags in Y: Y&8 = 8: Anchor Alarm is active
 *                                Y&4 = 4: Metric display units or
 *                                         Fathom display units if
 *                                          followed by command 65
 *                                Y&2 = 2: Used, unknown meaning
 *                    Flags in Z: Z&4 = 4: Transducer defective
 *                                Z&2 = 2: Deep Alarm is active
 *                                Z&1 = 1: Shallow Depth Alarm is active
 *                  Corresponding NMEA sentences: DPT, DBT
 */
int
depth_below_transducer(int *data, int len, int oformat)
{
    char            buf[PRINTF_BUFSIZE+1];
    unsigned int    depth_raw;
    float           depth_meters, depth_feet, depth_fathoms;

    if (len != data[1]+3)
        return 1;

    depth_raw = (data[4] << 8) | data[3];


    if (oformat == FORMAT_NMEA)
    {
        depth_meters = depth_raw/10.0;
        depth_fathoms = 0.54*depth_meters;
        depth_feet = 3.281*depth_meters;

        nmea_sprintf(buf, PRINTF_BUFSIZE, "$SDDBT,%.1f,f,%.1f,M,%.1f,F",
                     depth_feet, depth_meters, depth_fathoms);


        uart1_transmit_string(buf);
        return 0;
    }

    if (oformat == FORMAT_JSON)
    {
        return 0;
    }

    if (oformat == FORMAT_HUMAN)
    {
        depth_feet = depth_raw/10.0;
        snprintf(buf, PRINTF_BUFSIZE, "Depth: %f meters\n", depth_feet/3.281);
        uart1_transmit_string(buf);
        return 0;
    }
}
Example #7
0
void main(void)
{
	DDRC = 0xff;
	PORTC = 0xff;
	unsigned char ch,ch1;
	unsigned char buf[10];

	uart1_init();
	lcd_init();	
	lcd_char('*');
	
	init_i2c();
	
	WR_I2C(0,0x57);//Sec
    WR_I2C(1,0x59);//Min
	WR_I2C(2,0x11 | (1<<5)|(1<<6) );//Hr
    WR_I2C(3,1);//Day
	WR_I2C(4,0x31);//Date
    WR_I2C(5,0x12);//Month
	WR_I2C(6,0x99);//year
	
	while(1)
	{	
		ch = RD_I2C(0,0);//sec
		sprintf(buf,"\n\rSec = %02d",Hex2Dec(ch));
		uart1_transmit_string(buf);

		ch = RD_I2C(1,0);//min
		sprintf(buf,"\n\rMin = %02d",Hex2Dec(ch));
		uart1_transmit_string(buf);
	
		ch = RD_I2C(2,0);//hr
		sprintf(buf,"\n\rHr = %02d",Hex2Dec( ch & 0x1F ) );
		uart1_transmit_string(buf);
	
		ch = RD_I2C(3,0);//day
		sprintf(buf,"\n\rDay = %02d",Hex2Dec(ch));
		uart1_transmit_string(buf);

		ch = RD_I2C(4,0);//date
		sprintf(buf,"\n\rDate = %02d",Hex2Dec(ch));
		uart1_transmit_string(buf);
	
		ch = RD_I2C(5,0);//month
		sprintf(buf,"\n\rMonth = %02d",Hex2Dec(ch));
		uart1_transmit_string(buf);

		ch = RD_I2C(6,0);//year
		sprintf(buf,"\n\rYear = %02d",Hex2Dec(ch));
		uart1_transmit_string(buf);
		_delay_ms(1000);
	
	}
}
Example #8
0
int
transmit_wind_data(struct wind_data *wd)
{
    char            buf[NMEA_MAX_LENGTH+1];
    char            *valid = "";
    int             ret;

    if ( (time - wd->wd_angle_age < MAX_DATA_AGE) &&
            (time - wd->wd_speed_age < MAX_DATA_AGE) )
        valid = ",A";

    ret = nmea_sprintf(buf, PRINTF_BUFSIZE, "VWMWV,%.1f,R,%.1f,K%s",
                       wd->wd_angle, wd->wd_speed, valid);

    uart1_transmit_string(buf);

    return ret;
}