biosiglite: merge upstream

parent e406fbf4
This diff is collapsed.
/*
Copyright (C) 2005-2016 Alois Schloegl <alois.schloegl@gmail.com>
Copyright (C) 2005-2017 Alois Schloegl <alois.schloegl@gmail.com>
Copyright (C) 2011 Stoyan Mihaylov
This file is part of the "BioSig for C/C++" repository
(biosig4c++) at http://biosig.sf.net/
......@@ -60,7 +60,7 @@
int VERBOSE_LEVEL = 0; // this variable is always available, but only used without NDEBUG
#include "biosig-dev.h"
#include "biosig.h"
#include "biosig-network.h"
......@@ -113,10 +113,8 @@ extern "C" {
int sopen_SCP_read (HDRTYPE* hdr);
int sopen_SCP_write (HDRTYPE* hdr);
#ifndef WITH_BIOSIGLITE
int sopen_HL7aECG_read (HDRTYPE* hdr);
void sopen_HL7aECG_write(HDRTYPE* hdr);
#endif
void sopen_abf_read (HDRTYPE* hdr);
void sopen_abf2_read (HDRTYPE* hdr);
void sopen_axg_read (HDRTYPE* hdr);
......@@ -124,9 +122,7 @@ void sopen_alpha_read (HDRTYPE* hdr);
void sopen_cfs_read (HDRTYPE* hdr);
void sopen_FAMOS_read (HDRTYPE* hdr);
void sopen_fiff_read (HDRTYPE* hdr);
#ifndef WITH_BIOSIGLITE
int sclose_HL7aECG_write(HDRTYPE* hdr);
#endif
void sopen_ibw_read (HDRTYPE* hdr);
void sopen_itx_read (HDRTYPE* hdr);
void sopen_smr_read (HDRTYPE* hdr);
......@@ -428,6 +424,7 @@ int ftoa8(char* buf, double num)
int is_nihonkohden_signature(char *str)
{
return (!(
strncmp(str, "EEG-1200A V01.00", 16) &&
strncmp(str, "EEG-1100A V01.00", 16) &&
strncmp(str, "EEG-1100B V01.00", 16) &&
strncmp(str, "EEG-1100C V01.00", 16) &&
......@@ -1405,7 +1402,9 @@ void destructHDR(HDRTYPE* hdr) {
if (VERBOSE_LEVEL>7) fprintf(stdout,"destructHDR: free HDR.AS.rawdata @%p\n",hdr->AS.rawdata);
if (hdr->AS.rawdata != NULL) free(hdr->AS.rawdata);
// in case of SCPv3, rawdata can be loaded into Header
if ( (hdr->AS.rawdata < hdr->AS.Header) || (hdr->AS.rawdata > (hdr->AS.Header+hdr->HeadLen)) )
if (hdr->AS.rawdata != NULL) free(hdr->AS.rawdata);
if (VERBOSE_LEVEL>7) fprintf(stdout,"destructHDR: free HDR.data.block @%p\n",hdr->data.block);
......@@ -1684,9 +1683,10 @@ HDRTYPE* getfiletype(HDRTYPE* hdr)
}
/* Nihon Kohden */
else if (is_nihonkohden_signature((char*)Header1) && is_nihonkohden_signature((char*)(Header1+0x81)))
else if (is_nihonkohden_signature((char*)Header1) && is_nihonkohden_signature((char*)(Header1+0x81))) {
hdr->TYPE = EEG1100;
hdr->VERSION = strtod((char*)Header1+11,NULL);
}
else if (!memcmp(Header1, "RIFF",4) && !memcmp(Header1+8, "CNT ",4))
hdr->TYPE = EEProbe;
else if (!memcmp(Header1, "EEP V2.0",8))
......@@ -1842,8 +1842,18 @@ HDRTYPE* getfiletype(HDRTYPE* hdr)
hdr->TYPE = Persyst;
else if (!memcmp(Header1,"SXDF",4))
hdr->TYPE = OpenXDF;
else if (!memcmp(Header1,"PLEX",4))
hdr->TYPE = PLEXON;
else if (!memcmp(Header1,"PLEX",4)) {
hdr->TYPE = PLEXON;
hdr->VERSION=1.0;
}
else if (!memcmp(Header1+10,"PLEXON",6)) {
hdr->TYPE = PLEXON;
hdr->VERSION=2.0;
}
else if (!memcmp(Header1,"\x02\x27\x91\xC6",4)) {
hdr->TYPE = RHD2000; // Intan RHD2000 format
hdr->FILE.LittleEndian = 1;
}
else if (!memcmp(Header1,"\x55\xAA\x00\xb0",2)) {
hdr->TYPE = RDF; // UCSD ERPSS aquisition system
hdr->FILE.LittleEndian = 1;
......@@ -2143,7 +2153,9 @@ const struct FileFormatStringTable_t FileFormatStringTable[] = {
{ Persyst, "Persyst" },
{ OGG, "OGG" },
{ PDP, "PDP" },
{ PLEXON, "PLEXON" },
{ RDF, "RDF" },
{ RHD2000, "RHD2000" },
{ RIFF, "RIFF" },
{ SASXPT, "SAS_XPORT" },
{ SCP_ECG, "SCP" },
......@@ -3298,7 +3310,7 @@ int RerefCHANNEL(HDRTYPE *hdr, void *arg2, char Mode)
switch (Mode) {
case 1: {
HDRTYPE *RR = sopen((char*)arg2,"r",NULL);
HDRTYPE *RR = sopen((const char*)arg2,"r",NULL);
ReRef = RR->Calib;
if (RR->rerefCHANNEL != NULL) {
flagLabelIsSet = 1;
......@@ -6768,8 +6780,9 @@ if (VERBOSE_LEVEL>8)
count = 0;
while (!feof(fid)) {
LOG = (char*) realloc(LOG,count+1025);
count += fread(LOG+count,1,1024,fid);
size_t r = max(count*2,1024);
LOG = (char*) realloc(LOG,r+1);
count += fread(LOG+count,1,r-count,fid);
}
fclose(fid);
......@@ -10169,6 +10182,11 @@ if (VERBOSE_LEVEL>2)
}
else if (hdr->TYPE==PLEXON) {
biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Format PLEXON not supported");
return(hdr);
}
else if (hdr->TYPE==RDF) {
// UCSD ERPSS aquisition system
......@@ -10234,10 +10252,34 @@ if (VERBOSE_LEVEL>2)
strncpy(hc->Label,(char*)(hdr->AS.Header+32+24+8*k),8);
hc->LeadIdCode = 0;
}
biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Format RDF (UCSD ERPSS) not supported");
}
else if (hdr->TYPE==RHD2000) {
float minor = leu16p(hdr->AS.Header+6);
minor *= (minor < 10) ? 0.1 : 0.01;
hdr->VERSION = leu16p(hdr->AS.Header+4) + minor;
hdr->NS = 1;
hdr->SampleRate = lef32p(hdr->AS.Header+8);
float HighPass = ( leu16p(hdr->AS.Header+12) ? 0.0 : lef32p(hdr->AS.Header+14) );
HighPass = max( HighPass, lef32p(hdr->AS.Header+18) );
float LowPass = lef32p(hdr->AS.Header+22);
const int ListNotch[] = {0,50,60};
uint16_t tmp = leu16p(hdr->AS.Header+34);
if (tmp>2) tmp=0;
float Notch = ListNotch[tmp];
float fZ = lef32p(hdr->AS.Header+40);
biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Format Intan RHD2000 not supported");
/*
hdr->CHANNEL = (CHANNEL_TYPE*)realloc(hdr->CHANNEL, hdr->NS * sizeof(CHANNEL_TYPE));
CHANNEL_TYPE *hc = hdr->CHANNEL;
*/
}
else if (hdr->TYPE==SCP_ECG) {
hdr->HeadLen = leu32p(hdr->AS.Header+2);
hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header,hdr->HeadLen);
......@@ -10944,7 +10986,6 @@ if (VERBOSE_LEVEL>2)
}
#endif
#ifndef WITH_BIOSIGLITE
else if (hdr->TYPE==HL7aECG || hdr->TYPE==XML) {
sopen_HL7aECG_read(hdr);
if (VERBOSE_LEVEL>7)
......@@ -10955,7 +10996,6 @@ if (VERBOSE_LEVEL>2)
hdr->FILE.LittleEndian = (__BYTE_ORDER == __LITTLE_ENDIAN); // no swapping
hdr->AS.length = hdr->NRec;
}
#endif
#ifdef WITH_MICROMED
else if (hdr->TYPE==TRC) {
......@@ -11740,14 +11780,12 @@ else if (!strncmp(MODE,"w",1)) /* --- WRITE --- */
}
}
#ifndef WITH_BIOSIGLITE
else if (hdr->TYPE==HL7aECG) {
sopen_HL7aECG_write(hdr);
// hdr->FLAG.SWAP = 0;
hdr->FILE.LittleEndian = (__BYTE_ORDER == __LITTLE_ENDIAN); // no byte-swapping
}
#endif
else if (hdr->TYPE==MFER) {
uint8_t tag;
......@@ -13594,6 +13632,11 @@ int sclose(HDRTYPE* hdr)
uint16_t crc = CRCEvaluate(hdr->AS.Header + aECG->Section6.StartPtr+2,aECG->Section6.Length-2); // compute CRC
leu16a(crc, hdr->AS.Header + aECG->Section6.StartPtr);
}
if ((aECG->Section12.Length>0) && (hdr->VERSION >2.5)){
// compute CRC for Section 12
uint16_t crc = CRCEvaluate(hdr->AS.Header + aECG->Section12.StartPtr+2,aECG->Section12.Length-2); // compute CRC
leu16a(crc, hdr->AS.Header + aECG->Section12.StartPtr);
}
// compute crc and len and write to preamble
ptr = hdr->AS.Header;
leu32a(hdr->HeadLen, ptr+2);
......@@ -13601,13 +13644,11 @@ int sclose(HDRTYPE* hdr)
leu16a(crc, ptr);
ifwrite(hdr->AS.Header, sizeof(char), hdr->HeadLen, hdr);
}
#ifndef WITH_BIOSIGLITE
else if ((hdr->FILE.OPEN>1) && (hdr->TYPE==HL7aECG))
{
sclose_HL7aECG_write(hdr);
hdr->FILE.OPEN = 0;
}
#endif
#endif //ONLYGDF
if (hdr->FILE.OPEN > 0) {
......
This diff is collapsed.
......@@ -26,7 +26,6 @@
#include <stdlib.h>
#include <string.h>
#include "biosig.h"
#include "biosig2.h"
/* =============================================================
......
This diff is collapsed.
......@@ -22,6 +22,7 @@
#include <ctype.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "physicalunits.h"
......
......@@ -82,7 +82,13 @@ char *trim_trailing_space(uint8_t *pstr, unsigned maxLength) {
const char *Signal6_StateTable[]={
"","State 1","State 2","State 3","State 4","State 5","State 6","State 7","State 8","State 9",
"State 10","State 11","State 12","State 13","State 14","State 15","State 16","State 17","State 18","State 19" };
"State 10","State 11","State 12","State 13","State 14","State 15","State 16","State 17","State 18","State 19",
"State 20","State 21","State 22","State 23","State 24","State 25","State 26","State 27","State 28","State 29",
"State 30","State 31","State 32","State 33","State 34","State 35","State 36","State 37","State 38","State 39",
"State 40","State 41","State 42","State 43","State 44","State 45","State 46","State 47","State 48","State 49",
"State 50","State 51","State 52","State 53","State 54","State 55","State 56","State 57","State 58","State 59",
"State 60","State 61","State 62","State 63","State 64","State 65","State 66","State 67","State 68","State 69",
"State 70" };
EXTERN_C void sopen_cfs_read(HDRTYPE* hdr) {
/*
......@@ -482,13 +488,13 @@ if (VERBOSE_LEVEL>7) {
}
if (Signal6_CodeDescLen > 0) {
if (Signal6_CodeDescLen > 19) {
if (Signal6_CodeDescLen > 70) {
// 19 is sizeof Signal6_StateTable
fprintf(stderr, "Warning %s (line %i): Event code description exceed table\n",__func__,__LINE__);
Signal6_CodeDescLen = 19;
fprintf(stderr, "Warning %s (line %i): Event code description exceed table (Signal6_CodeDescLen=%i)\n",__func__,__LINE__,Signal6_CodeDescLen);
Signal6_CodeDescLen = 70;
}
hdr->EVENT.LenCodeDesc = Signal6_CodeDescLen+1; //20 is sizeof(Signal6_StateTable)
hdr->EVENT.LenCodeDesc = Signal6_CodeDescLen+1; //70 is sizeof(Signal6_StateTable)
hdr->EVENT.CodeDesc = realloc(hdr->EVENT.CodeDesc, sizeof(char*) * (Signal6_CodeDescLen+1));
for (int k=0; k <= Signal6_CodeDescLen; k++) {
hdr->EVENT.CodeDesc[k] = Signal6_StateTable[k];
......
......@@ -26,7 +26,7 @@
#include <string.h>
#include <sys/stat.h>
#include "../biosig-dev.h"
#include "../biosig.h"
/* TODO:
- need to separate sopen_heka() and sread_heka()
......@@ -145,7 +145,7 @@ void sopen_heka(HDRTYPE* hdr, FILE *itx) {
/* get file size and read whole file */
count += ifread(hdr->AS.Header+count, 1, FileBuf.st_size - count, hdr);
if (VERBOSE_LEVEL>7) fprintf(stdout,"HEKA 114\n");
if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s(...): %i bytes read\n",__FILE__,__LINE__,__func__, count);
// double oTime;
uint32_t nItems;
......@@ -158,7 +158,7 @@ if (VERBOSE_LEVEL>7) fprintf(stdout,"HEKA 114\n");
nItems = beu32p(hdr->AS.Header+48);
}
if (VERBOSE_LEVEL>7) fprintf(stdout,"HEKA 121 nItems=%i\n",nItems);
if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s(...): nItems=%i\n",__FILE__,__LINE__,__func__, nItems);
if (hdr->VERSION == 1) {
Sizes.Rec.Root = 544;
......@@ -170,7 +170,7 @@ if (VERBOSE_LEVEL>7) fprintf(stdout,"HEKA 121 nItems=%i\n",nItems);
else if (hdr->VERSION == 2)
for (k=0; k < min(12,nItems); k++) {
if (VERBOSE_LEVEL>7) fprintf(stdout,"HEKA 131 nItems=%i\n",k);
if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): HEKA nItems=%i\n",__func__,__LINE__, k);
uint32_t start = *(uint32_t*)(hdr->AS.Header+k*16+64);
uint32_t length = *(uint32_t*)(hdr->AS.Header+k*16+64+4);
......@@ -180,10 +180,15 @@ if (VERBOSE_LEVEL>7) fprintf(stdout,"HEKA 131 nItems=%i\n",k);
}
uint8_t *ext = hdr->AS.Header + k*16 + 64 + 8;
if (VERBOSE_LEVEL>7) fprintf(stdout,"HEKA #%i: <%s> [%i:+%i]\n",k,ext,start,length);
if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): HEKA #%i: <%s> [%i:+%i]\n",__func__,__LINE__,k,ext,start,length);
if (!start) break;
if ((start+8) > count) {
biosigERROR(hdr, B4C_INCOMPLETE_FILE, "Heka/Patchmaster: file is corrupted - segment with pulse data is not available!");
return;
}
if (!memcmp(ext,".pul\0\0\0\0",8)) {
// find pulse data
ifseek(hdr, start, SEEK_SET);
......@@ -196,7 +201,7 @@ if (VERBOSE_LEVEL>7) fprintf(stdout,"HEKA #%i: <%s> [%i:+%i]\n",k,ext,start,leng
return;
}
if (VERBOSE_LEVEL>7) fprintf(stdout,"HEKA124 #%i Levels=%i\n",k,Levels);
if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): HEKA #%i Levels=%i\n",__func__,__LINE__,k,Levels);
memcpy(Sizes.all,hdr->AS.Header+start+8,sizeof(int32_t)*Levels);
if (SWAP) {
......@@ -204,7 +209,7 @@ if (VERBOSE_LEVEL>7) fprintf(stdout,"HEKA124 #%i Levels=%i\n",k,Levels);
for (l=0; l < Levels; l++) Sizes.all[l] = bswap_32(Sizes.all[l]);
}
if (VERBOSE_LEVEL>7) {int l; for (l=0; l < Levels; l++) fprintf(stdout,"HEKA #%i %i\n",l, Sizes.all[l]); }
if (VERBOSE_LEVEL>7) {int l; for (l=0; l < Levels; l++) fprintf(stdout,"%s (line %i): HEKA #%i %i\n",__func__,__LINE__,l, Sizes.all[l]); }
StartOfPulse = start + 8 + 4 * Levels;
}
......@@ -214,7 +219,7 @@ if (VERBOSE_LEVEL>7) {int l; for (l=0; l < Levels; l++) fprintf(stdout,"HEKA #%i
}
}
if (VERBOSE_LEVEL>7) fprintf(stdout,"HEKA 989: \n");
if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s(...): \n",__FILE__,__LINE__,__func__);
// if (!Sizes) free(Sizes); Sizes=NULL;
......@@ -257,14 +262,14 @@ if (VERBOSE_LEVEL>7) fprintf(stdout,"HEKA 989: \n");
t = (*(double*)(hdr->AS.Header + StartOfPulse + 520));
}
if (VERBOSE_LEVEL>7) fprintf(stdout,"HEKA 997\n");
if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s(...): \n",__FILE__,__LINE__,__func__);
hdr->T0 = heka2gdftime(t); // this is when when heka was started, data is recorded later.
hdr->SampleRate = 0.0;
double *DT = NULL; // list of sampling intervals per channel
hdr->SPR = 0;
if (VERBOSE_LEVEL>7) fprintf(stdout,"HEKA 999 %p\n",hdr->EVENT.CodeDesc);
if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s(...): %p\n",__FILE__,__LINE__,__func__,hdr->EVENT.CodeDesc);
/*******************************************************************************************************
HEKA: read structural information
......
......@@ -29,6 +29,7 @@
#include <sys/stat.h>
#include "../biosig-dev.h"
#include "../biosig.h"
// these functions are stubs
......
......@@ -5,15 +5,15 @@
# prEN ISO 11073-10101 (Nov 2003)
# ISO/IEEE 11073-10101:2004
# Health Informatics - Point-of-care medical device communications - Part 10101: Nomenclature
# p.62-75. Table A.6.3: Vital signs units of measurements
# p.62-75. Table A.6.3: Vital signs units of measurements
#
# CEN/TC251/PT40 2001
# File Exchange Format for Vital Signs - Annex A
# CEN/TC251/PT40 2001
# File Exchange Format for Vital Signs - Annex A
#
# $Id$
# Copyright (C) 2005,2006,2008,2012 Alois Schloegl <alois.schloegl@ist.ac.at>
# Copyright (C) 2005,2006,2008,2012,2016 Alois Schloegl <alois.schloegl@ist.ac.at>
# This file is part of the biosig project http://biosig.sf.net/
#
# In some cases, there are more than one text representation for a certain code.
#endif
{ 0, "?" },
{ 512, "-" },
......@@ -134,8 +134,6 @@
{ 4032, "W" },
{ 4064, "Pa s m-3" },
{ 4096, "Pa s l-1" },
{ 4128, "dyn s cm-5" },
{ 4128, "dyne*s/cm^5" },
{ 5888, "l (cmH2O)-1" },
{ 6272, "l (mmHg)-1" },
{ 6304, "l Pa-1" },
......@@ -210,9 +208,148 @@
{ 6656, "rad s2-2" },
{ 6688, "ft min-1" },
{ 6720, "in min-1" },
{ 6752, "step min-1" },
{ 6784, "kcal" },
{ 6816, "rpm" },
{ 7776, "<boolean>" },
{ 7808, "dB(V)" },
{ 7840, "dB(10V)" },
{ 7872, "dB(W)" },
{ 7744, "g m-2" },
{ 8032, "cm2" },
{ 8064, "s-2" },
{ 8096, "rpm" },
{ 8128, "drops min-1" },
{ 6784, "g lb-1 min-1" },
{ 6752, "g lb-1 h-1" },
{ 6848, "g m-2 min-1" },
{ 6816, "g m-2 h-1" },
{ 7168, "g m-2 d-1" },
{ 8160, "l cmH2O-1 kg-1" },
{ 8192, "Wb m-2" },
{ 8192, "T" },
{ 8224, "Vs" },
{ 8256, "V s-1" },
{ 8256, "V/s" },
{ 8288, "S" },
{ 7552, "mol m-2" },
{ 7584, "eq kg-1" },
{ 7616, "eq m-2" },
{ 7424, "mol m-2 s-1" },
{ 7456, "mol m-2 min-1" },
{ 7488, "mol m-2 h-1" },
{ 7520, "mol m-2 d-1" },
{ 7040, "eq lb-2 min-1" },
{ 7008, "eq lb-2 h-1" },
{ 7104, "eq m-2 min-1" },
{ 7072, "eq m-2 h-1" },
{ 7136, "eq m-2 d-1" },
{ 7680, "i.u. kg-1" },
{ 7712, "i.u. m-2" },
{ 6912, "i.u. lb-1 min-1" },
{ 10400, "i.u. lb-1 h-1" },
{ 6880, "i.u. lb-1 d-1" },
{ 7648, "i.u. m-2 s-1" },
{ 6976, "i.u. m-2 min-1" },
{ 6944, "i.u. m-2 h-1" },
{ 7200, "i.u. m-2 d-1" },
{ 8320, "dyne s m2 cm-5" },
{ 8352, "cal" },
{ 8384, "nutr cal" },
{ 8416, "cal d-1" },
{ 7264, "L kg-1 min-1" },
{ 7232, "L kg-1 h-1" },
{ 7296, "L kg-1 d-1" },
{ 7328, "L m-2 min-1" },
{ 7360, "L m-2 h-1" },
{ 7392, "L m-2 d-1" },
{ 8448, "J/breath" },
{ 8480, "J/L" },
{ 10528, "J/mL" },
{ 10496, "J/day" },
{ 8480, "J/L" },
{ 8512, "dyn s cm-5" },
{ 8512, "dyne s cm-5" },
{ 8544, "PRU" },
{ 8576, "WU" },
{ 8608, "b" },
{ 8640, "B" },
{ 8672, "drops/L" },
{ 8704, "breaths/min/L" },
{ 8736, "breaths^2/min/L" },
{ 8768, "L/min/kg" },
{ 8800, "sat-sec" },
{ 8832, "m/V" },
{ 8864, "gf m" },
{ 8896, "gf m L-1" },
{ 8928, "gf m m-2" },
{ 8960, "cal kg-1" },
{ 8992, "cal kg-1 d-1" },
{ 9024, "cal mL-1" },
{ 9056, "arb.u" },
{ 9088, "arb.u cm-3" },
{ 9120, "arb.u m-3" },
{ 9152, "arb.u l-1" },
{ 9184, "arb.u ml-1" },
{ 9216, "arb.u s-1" },
{ 9248, "arb.u min-1" },
{ 9280, "arb.u h-1" },
{ 9312, "arb.u d-1" },
{ 9344, "arb.u kg-1" },
{ 9376, "arb.u m-2" },
{ 9408, "arb.u kg-1 s-1" },
{ 9440, "arb.u kg-1 min-1" },
{ 9472, "arb.u kg-1 h-1" },
{ 9504, "arb.u kg-1 d-1" },
{ 9536, "arb.u lb-1 min-1" },
{ 10432, "arb.u lb-1 h-1" },
{ 9568, "arb.u lb-1 d-1" },
{ 9600, "arb.u m-2 s-1" },
{ 9632, "arb.u m-2 min-1" },
{ 9664, "arb.u m-2 h-1" },
{ 9696, "arb.u m-2 d-1" },
{ 9728, "USP.u" },
{ 9760, "USP.u cm-3" },
{ 9792, "USP.u m-3" },
{ 9824, "USP.u l-1" },
{ 9856, "USP.u ml-1" },
{ 9888, "USP.u s-1" },
{ 9920, "USP.u min-1" },
{ 9952, "USP.u h-1" },
{ 9984, "USP.u d-1" },
{ 10016, "USP.u kg-1" },
{ 10048, "USP.u m-2" },
{ 10080, "USP.u kg-1 s-1" },
{ 10112, "USP.u kg-1 min-1" },
{ 10144, "USP.u kg-1 h-1" },
{ 10176, "USP.u kg-1 d-1" },
{ 10208, "USP.u lb-1 min-1" },
{ 10464, "USP.u lb-1 h-1" },
{ 10240, "USP.u lb-1 d-1" },
{ 10272, "USP.u m-2 s-1" },
{ 10304, "USP.u m-2 min-1" },
{ 10336, "USP.u m-2 h-1" },
{ 10368, "USP.u m-2 d-1" },
{ 10560, "vol % L-1" },
{ 10592, "Pa L-1" },
{ 10624, "Pa mL-1" },
{ 10656, "bar L-1" },
{ 10688, "bar L-1 10-1" },
{ 10720, "bar mL-1" },
{ 10752, "bar s L-1" },
{ 10784, "bar s L-1 10-1" },
{ 10816, "L hPa-1" },
{ 10848, "L bar-1" },
{ 10880, "L mbar-1" },
{ 10912, "J/L/s" },
{ 10944, "mmHg min-1" },
{ 10976, "mmHg s-1" },
{ 11008, "bar s-1" },
{ 11040, "cmH2O min-1" },
{ 11072, "% per 1/2 h" },
{ 11104, "L beat-1 m-2" },
{ 11136, "V cm-1" },
{ 11168, "W cm-2 mm-1" },
{ 11200, "cmH2O uV-1" },
{ 65088, "mph" },
{ 65120, "Nm" },
{ 65152, "V/s" },
{ 65184, "m/m" },
{ 65216, "km/h" },
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment