kopia lustrzana https://github.com/rs1729/RS
				
				
				
			RS92: CRC
							rodzic
							
								
									ffd9f3119e
								
							
						
					
					
						commit
						6a7f60357c
					
				
							
								
								
									
										109
									
								
								rs92/rs92gps.c
								
								
								
								
							
							
						
						
									
										109
									
								
								rs92/rs92gps.c
								
								
								
								
							| 
						 | 
				
			
			@ -73,6 +73,7 @@ int option_verbose = 0,  // ausfuehrliche Anzeige
 | 
			
		|||
    option_raw = 0,      // rohe Frames
 | 
			
		||||
    option_inv = 0,      // invertiert Signal
 | 
			
		||||
    option_res = 0,      // genauere Bitmessung
 | 
			
		||||
    option_crc = 0,      // check CRC
 | 
			
		||||
    option_avg = 0,      // moving average
 | 
			
		||||
    option_b = 0,
 | 
			
		||||
    fileloaded = 0,
 | 
			
		||||
| 
						 | 
				
			
			@ -354,8 +355,13 @@ int compare() {
 | 
			
		|||
    return i;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
ui8_t xorbyte(int pos) {
 | 
			
		||||
    return  frame[pos]; // ^ mask[pos % MASK_LEN];
 | 
			
		||||
    return  xframe[pos] ^ mask[pos % MASK_LEN];
 | 
			
		||||
}
 | 
			
		||||
*/
 | 
			
		||||
ui8_t framebyte(int pos) {
 | 
			
		||||
    return  frame[pos];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -398,6 +404,40 @@ void Gps2Date(long GpsWeek, long GpsSeconds, int *Year, int *Month, int *Day) {
 | 
			
		|||
#define posGPS_PRN    0x4E  // 12*5 bit in 8 byte
 | 
			
		||||
#define posGPS_DATA   0x62  // 12*8 byte
 | 
			
		||||
 | 
			
		||||
#define pos_MEAS      0x2C  // 24 byte
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define BLOCK_CFG 0x6510  // frame[pos_FrameNb-2], frame[pos_FrameNb-1]
 | 
			
		||||
#define BLOCK_PTU 0x690C
 | 
			
		||||
#define BLOCK_GPS 0x673D  // frame[pos_GPSTOW-2], (frame[pos_GPSTOW-1]
 | 
			
		||||
#define BLOCK_AUX 0x6805
 | 
			
		||||
 | 
			
		||||
#define LEN_CFG (2*(BLOCK_CFG & 0xFF))
 | 
			
		||||
#define LEN_GPS (2*(BLOCK_GPS & 0xFF))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int crc16(int start, int len) {
 | 
			
		||||
    int crc16poly = 0x1021;
 | 
			
		||||
    int rem = 0xFFFF, i, j;
 | 
			
		||||
    int byte;
 | 
			
		||||
 | 
			
		||||
    if (start+len >= FRAME_LEN) return -1;
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < len; i++) {
 | 
			
		||||
        byte = framebyte(start+i);
 | 
			
		||||
        rem = rem ^ (byte << 8);
 | 
			
		||||
        for (j = 0; j < 8; j++) {
 | 
			
		||||
            if (rem & 0x8000) {
 | 
			
		||||
                rem = (rem << 1) ^ crc16poly;
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                rem = (rem << 1);
 | 
			
		||||
            }
 | 
			
		||||
            rem &= 0xFFFF;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int get_FrameNb() {
 | 
			
		||||
    int i;
 | 
			
		||||
| 
						 | 
				
			
			@ -406,7 +446,7 @@ int get_FrameNb() {
 | 
			
		|||
    int frnr;
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < 2; i++) {
 | 
			
		||||
        byte = xorbyte(pos_FrameNb + i);
 | 
			
		||||
        byte = framebyte(pos_FrameNb + i);
 | 
			
		||||
        frnr_bytes[i] = byte;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -417,12 +457,27 @@ int get_FrameNb() {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
int get_SondeID() {
 | 
			
		||||
    int i;
 | 
			
		||||
    int i, ret=0;
 | 
			
		||||
    unsigned byte;
 | 
			
		||||
    ui8_t sondeid_bytes[10];
 | 
			
		||||
    int crc_frame, crc;
 | 
			
		||||
 | 
			
		||||
    // BLOCK_CFG == frame[pos_FrameNb-2 .. pos_FrameNb-1] ?
 | 
			
		||||
    crc_frame = framebyte(pos_FrameNb+LEN_CFG) | (framebyte(pos_FrameNb+LEN_CFG+1) << 8);
 | 
			
		||||
    crc = crc16(pos_FrameNb, LEN_CFG);
 | 
			
		||||
/*
 | 
			
		||||
    if (option_crc) {
 | 
			
		||||
      //printf(" (%04X:%02X%02X) ", BLOCK_CFG, frame[pos_FrameNb-2], frame[pos_FrameNb-1]);
 | 
			
		||||
      printf(" [%04X:%04X] ", crc_frame, crc);
 | 
			
		||||
    }
 | 
			
		||||
*/
 | 
			
		||||
    ret = 0;
 | 
			
		||||
    if ( 0  &&  option_crc  &&  crc != crc_frame) {
 | 
			
		||||
        ret = -2;  // erst wichtig, wenn Cal/Cfg-Data
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < 8; i++) {
 | 
			
		||||
        byte = xorbyte(pos_SondeID + i);
 | 
			
		||||
        byte = framebyte(pos_SondeID + i);
 | 
			
		||||
        if ((byte < 0x20) || (byte > 0x7E)) return -1;
 | 
			
		||||
        sondeid_bytes[i] = byte;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -432,21 +487,36 @@ int get_SondeID() {
 | 
			
		|||
    }
 | 
			
		||||
    gpx.id[8] = '\0';
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
char weekday[7][3] = { "So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"};
 | 
			
		||||
 | 
			
		||||
int get_GPStime() {
 | 
			
		||||
    int i;
 | 
			
		||||
    int i, ret=0;
 | 
			
		||||
    unsigned byte;
 | 
			
		||||
    ui8_t gpstime_bytes[4];
 | 
			
		||||
    int gpstime = 0, // 32bit
 | 
			
		||||
        day;
 | 
			
		||||
    float ms;
 | 
			
		||||
    int crc_frame, crc;
 | 
			
		||||
 | 
			
		||||
    // BLOCK_GPS == frame[pos_GPSTOW-2 .. pos_GPSTOW-1] ?
 | 
			
		||||
    crc_frame = framebyte(pos_GPSTOW+LEN_GPS) | (framebyte(pos_GPSTOW+LEN_GPS+1) << 8);
 | 
			
		||||
    crc = crc16(pos_GPSTOW, LEN_GPS);
 | 
			
		||||
/*
 | 
			
		||||
    if (option_crc) {
 | 
			
		||||
      //printf(" (%04X:%02X%02X) ", BLOCK_GPS, frame[pos_GPSTOW-2], frame[pos_GPSTOW-1]);
 | 
			
		||||
      printf(" [%04X:%04X] ", crc_frame, crc);
 | 
			
		||||
    }
 | 
			
		||||
*/
 | 
			
		||||
    ret = 0;
 | 
			
		||||
    if (option_crc  &&  crc != crc_frame) {
 | 
			
		||||
        ret = -2;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < 4; i++) {
 | 
			
		||||
        byte = xorbyte(pos_GPSTOW + i);
 | 
			
		||||
        byte = framebyte(pos_GPSTOW + i);
 | 
			
		||||
        gpstime_bytes[i] = byte;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -465,7 +535,7 @@ int get_GPStime() {
 | 
			
		|||
    gpx.min = (gpstime % 3600) / 60;
 | 
			
		||||
    gpx.sek = gpstime % 60 + ms/1000.0;
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int get_Aux() {
 | 
			
		||||
| 
						 | 
				
			
			@ -473,7 +543,7 @@ int get_Aux() {
 | 
			
		|||
    unsigned short byte;
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < 4; i++) {
 | 
			
		||||
        byte = xorbyte(pos_AuxData+2*i)+(xorbyte(pos_AuxData+2*i+1)<<8);
 | 
			
		||||
        byte = framebyte(pos_AuxData+2*i)+(framebyte(pos_AuxData+2*i+1)<<8);
 | 
			
		||||
        gpx.aux[i] = byte;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -488,7 +558,7 @@ int get_Cal() {
 | 
			
		|||
    int freq = 0;
 | 
			
		||||
    ui8_t freq_bytes[2];
 | 
			
		||||
 | 
			
		||||
    byte = xorbyte(pos_CalData);
 | 
			
		||||
    byte = framebyte(pos_CalData);
 | 
			
		||||
    calfr = byte;
 | 
			
		||||
 | 
			
		||||
    if (option_verbose == 2) {
 | 
			
		||||
| 
						 | 
				
			
			@ -496,7 +566,7 @@ int get_Cal() {
 | 
			
		|||
        fprintf(stderr, "  0x%02x:", calfr);
 | 
			
		||||
    }
 | 
			
		||||
    for (i = 0; i < 16; i++) {
 | 
			
		||||
        byte = xorbyte(pos_CalData+1+i);
 | 
			
		||||
        byte = framebyte(pos_CalData+1+i);
 | 
			
		||||
        if (option_verbose == 2) {
 | 
			
		||||
            fprintf(stderr, " %02x", byte);
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -506,12 +576,12 @@ int get_Cal() {
 | 
			
		|||
        if (option_verbose == 2) {
 | 
			
		||||
            fprintf(stderr, "  #  ");
 | 
			
		||||
            for (i = 0; i < 8; i++) {
 | 
			
		||||
                byte = xorbyte(pos_AuxData+i);
 | 
			
		||||
                byte = framebyte(pos_AuxData+i);
 | 
			
		||||
                fprintf(stderr, "%02x ", byte);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            if (gpx.aux[0] != 0 || gpx.aux[1] != 0 ||gpx.aux[2] != 0 || gpx.aux[3] != 0) {
 | 
			
		||||
            if (gpx.aux[0] != 0 || gpx.aux[1] != 0 || gpx.aux[2] != 0 || gpx.aux[3] != 0) {
 | 
			
		||||
                fprintf(stdout, " # %04x %04x %04x %04x", gpx.aux[0], gpx.aux[1], gpx.aux[2], gpx.aux[3]);
 | 
			
		||||
            }
 | 
			
		||||
        }   
 | 
			
		||||
| 
						 | 
				
			
			@ -519,7 +589,7 @@ int get_Cal() {
 | 
			
		|||
 | 
			
		||||
    if (calfr == 0x00) {
 | 
			
		||||
        for (i = 0; i < 2; i++) {
 | 
			
		||||
            byte = xorbyte(pos_Calfreq + i);
 | 
			
		||||
            byte = framebyte(pos_Calfreq + i);
 | 
			
		||||
            freq_bytes[i] = byte;
 | 
			
		||||
        }
 | 
			
		||||
        byte = freq_bytes[0] + (freq_bytes[1] << 8);
 | 
			
		||||
| 
						 | 
				
			
			@ -720,7 +790,7 @@ int get_pseudorange() {
 | 
			
		|||
    double  pr0, prj;
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < 4; i++) {
 | 
			
		||||
        gpstime_bytes[i] = xorbyte(pos_GPSTOW + i);
 | 
			
		||||
        gpstime_bytes[i] = framebyte(pos_GPSTOW + i);
 | 
			
		||||
    }
 | 
			
		||||
    memcpy(&gpstime, gpstime_bytes, 4);  // GPS-TOW in ms
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -976,10 +1046,15 @@ void print_frame(int len) {
 | 
			
		|||
    int i;
 | 
			
		||||
    ui8_t byte;
 | 
			
		||||
 | 
			
		||||
    for (i = len; i < FRAME_LEN; i++) {
 | 
			
		||||
        frame[i] = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    if (option_raw) {
 | 
			
		||||
        for (i = 0; i < len; i++) {
 | 
			
		||||
            //byte = frame[i];
 | 
			
		||||
            byte = xorbyte(i);
 | 
			
		||||
            byte = framebyte(i);
 | 
			
		||||
            fprintf(stdout, "%02x", byte);
 | 
			
		||||
        }
 | 
			
		||||
        fprintf(stdout, "\n");
 | 
			
		||||
| 
						 | 
				
			
			@ -1020,6 +1095,7 @@ int main(int argc, char *argv[]) {
 | 
			
		|||
            fprintf(stderr, "       -g1         (verbose GPS:   4 sats)\n");
 | 
			
		||||
            fprintf(stderr, "       -g2         (verbose GPS: all sats)\n");
 | 
			
		||||
            fprintf(stderr, "       -gg         (vverbose GPS)\n");
 | 
			
		||||
            fprintf(stderr, "       --crc       (CRC check GPS)\n");
 | 
			
		||||
            fprintf(stderr, "       --rawin1,2  (raw_data file)\n");
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -1029,6 +1105,7 @@ int main(int argc, char *argv[]) {
 | 
			
		|||
        else if ( (strcmp(*argv, "-vv") == 0) ) {
 | 
			
		||||
            option_verbose = 2;
 | 
			
		||||
        }
 | 
			
		||||
        else if   (strcmp(*argv, "--crc") == 0) { option_crc = 1; }
 | 
			
		||||
        else if ( (strcmp(*argv, "-r") == 0) || (strcmp(*argv, "--raw") == 0) ) {
 | 
			
		||||
            option_raw = 1;
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Ładowanie…
	
		Reference in New Issue