/* * If definition has not been written, write it and return a new local message * number. Otherwise return the message number corresponding to the message. */ FIT_UINT8 write_mesg_defn(FIT_MESG_NUM mesg_num, FILE *fp) { int i; FIT_UINT8 local_mesg_num; /* See if definition has been written */ for (i = 0; i < FIT_MAX_LOCAL_MESGS; i++) { if (local_mesg_nums[i] == mesg_num) { return i; } } /* Definition has not been written, so write it and return new local * message number */ local_mesg_num = local_mesg_num_next; local_mesg_num_next = (local_mesg_num_next + 1) % FIT_MAX_LOCAL_MESGS; /* Definition header */ FIT_UINT8 header = local_mesg_num | FIT_HDR_TYPE_DEF_BIT; /* Definition */ const FIT_MESG_DEF *def = Fit_GetMesgDef(mesg_num); // switch (mesg_num) { // case FIT_MESG_NUM_SESSION: // def = fit_mesg_defs[FIT_MESG_SESSION]; // break; // case FIT_MESG_NUM_LAP: // def = fit_mesg_defs[FIT_MESG_LAP]; // break; // case FIT_MESG_NUM_RECORD: // def = fit_mesg_defs[FIT_MESG_RECORD]; // break; // case FIT_MESG_NUM_EVENT: // def = fit_mesg_defs[FIT_MESG_EVENT]; // break; // default: // fprintf(stderr, "Don't know how to write definition for message " // "number %hd\n", mesg_num); // return -1; // } /* Write header and definition */ write_data(&header, FIT_HDR_SIZE, fp); write_data(def, Fit_GetMesgDefSize(def), fp); /* Update local mesg num mapping */ local_mesg_nums[local_mesg_num] = mesg_num; printf("Wrote definition for local message number %hhd " "(matches global number %hd)\n", local_mesg_num, mesg_num); return local_mesg_num; }
FIT_UINT8 Fit_GetMesgSize(FIT_UINT16 global_mesg_num) { const FIT_MESG_DEF *mesg_def; FIT_UINT8 field; FIT_UINT8 size = 0; mesg_def = Fit_GetMesgDef(global_mesg_num); if (mesg_def == FIT_NULL) return 0; for (field = 0; field < mesg_def->num_fields; field++) { size += mesg_def->fields[FIT_MESG_DEF_FIELD_OFFSET(size, field)]; } return size; }