GoldEnbed Parser

6 views
Skip to first unread message

Zaikou

unread,
Mar 8, 2010, 11:20:05 AM3/8/10
to golden-cheetah-users-ja
実はGoldEnbed自体よりも大事だと分かったパーサーですが、勝手にゴチャゴチャ直してみました。
オリジナルより良くなっている気がするので使ってみてくださいまし。

ファイルは
GoldenEmbedParserK.jar
としてアップロードして有ります。

オリジナルからの変更点は
1)PowerTapに対応
2)トルク出力
3)パワーを出力するときの”データ変更なし”の場合の対応
4)その他意味の分からない処理の整理

なお、PTのみでの確認です、SRM、CinQoは持ってないので未確認です。
変だなぁと思われたら、.gceを貼りつけてみてください解析してみます。(もしくはSRMかCinQoを私宛に送りつけるか)。

ソースも一緒に圧縮して有りますので(めんどくさいからバッチファイルも…)、デバッグや変更はお気軽にやってみてください。

よろしくおねがいします。

Zaikou

unread,
Mar 8, 2010, 7:25:16 PM3/8/10
to golden-cheetah-users-ja
あー、ごめんなさい。
デバッグ用の出力をするようにしてるのを上げてしまったかもしれません。
後で差し替えます…。

Mitsukuni Sato

unread,
Mar 8, 2010, 8:16:08 PM3/8/10
to golden-chee...@googlegroups.com
手元で試してないんですが、Quarq / PT両対応であればパッチ作って本家に投げてみようかと思います。どうです?

-- Mitsukuni

Zaikou

unread,
Mar 8, 2010, 10:07:41 PM3/8/10
to golden-cheetah-users-ja
そーですね、大丈夫っぽいと自信が持てたら投げてみましょうか。
パッチの作り方とかしらないんですが、この際、勉強しますw

Zaikou

unread,
Mar 8, 2010, 10:10:26 PM3/8/10
to golden-cheetah-users-ja
デバッグ情報無しバージョンに差し替えました。

On 3月9日, 午前9:25, Zaikou <zai...@gmail.com> wrote:
> あー、ごめんなさい。
> デバッグ用の出力をするようにしてるのを上げてしまったかもしれません。
> 後で差し替えます…。

Mitsukuni Sato

unread,
Mar 8, 2010, 10:16:14 PM3/8/10
to golden-chee...@googlegroups.com
GoldenEmbedはgithub使ってるので、git-format-patchでくれ!と言われそうな予感ですw(GCでは前に言われた)
そういえば、PTは他のメンバも対応作業を行っているはず。。


-- Mitsukuni

Zaikou

unread,
Mar 8, 2010, 11:46:15 PM3/8/10
to golden-cheetah-users-ja
スピードとケイデンスが0にならない時が有ったので直しました。

Kouzai Shinsuke

unread,
Mar 9, 2010, 9:59:36 AM3/9/10
to golden-cheetah-users-ja
パッチってこんなんでいいのかな?

ここから=============================

@@ -41,10 +41,15 @@ public class GoldenEmbedParserMain {
static final byte MESG_CHANNEL_ID_ID = (byte) 0x51;
static final byte MESG_NETWORK_KEY_ID = 0x46;
static final byte MESG_CHANNEL_EVENT_ERROR = 0x01;
static final double PI = 3.14159265;

+ static final byte CINQO = 0x12;
+ static final byte PT = 0x11;
+
+ byte powerMeterDetect = 0;
+
float totalTrans = 0;
float totalErrors = 0;
boolean errorFlag = false;
long totalSpikes = 0;
boolean isGSC = false;
@@ -178,35 +183,88 @@ public class GoldenEmbedParserMain {
if (debug)
System.out.println("ID: MESG_CAPABILITIES_ID\n");
i = ANTCfgCapabilties(i, size); // rxBuf[3] .. skip sync,
size, msg
break;
case MESG_BROADCAST_DATA_ID:
- if (debug)
- System.out.println("ID: MESG_BROADCAST_DATA_ID\n");
Byte aByte = new Byte(rxIN[++i]);
int chan = aByte.intValue();
+
+ if(debug)
+ System.out.println("ID: MESG_BROADCAST_DATA_ID
Channel: " + chan +"\n");
+
if (chan == 0)
i = ANTparseHRM(rxIN, i + 2, gc);
else if(chan == 1)
i = ANTParsePower(rxIN, ++i, size, gc);
else if(chan == 2)
i = ANTParseSpeedCad(rxIN, ++i, size, gc);

if(gc.getPrevsecs() != gc.getSecs())
{
if(gc.getSecs() - gc.getPrevWattsecs() > 5)
- {
gc.setWatts(0);
- if(gc.getSecs() - gc.getPrevCadSecs() > 5)
- gc.setCad(0);
+ else
+ {
+ if(0 < power.getTotalWattCounter())
+ {
+ if (debug) System.out.println("Watt
Counter :"+ power.getTotalWattCounter());
+ gc.setWatts((int)Round(power.getWatts() /
power.getTotalWattCounter(),0));
+ power.setTotalWattCounter(0);
+ power.setWatts(0);
+ }
+ else
+ {
+ gc.setWatts(gc.getWatts());
+ if (debug) System.out.println("1sec NO SIGNAL
FROM PowerMeter\n");
+ }
}
- gc.setWatts((int)Round(power.getWatts() /
power.getTotalWattCounter(),0));
- gc.setCad((int)Round(power.getRpm() /
power.getTotalCadCounter(),0));
- power.setTotalWattCounter(0);
- power.setWatts(0);
- if(gc.getSecs() - gc.getPrevCadSecs() > 5)
+
+ if(gc.getSecs() - gc.getPrevCadSecs() > 5) /*5sec以上デー
タがこない場合は0とする*/
gc.setCad(0);
+ else
+ {
+ if(powerMeterDetect == CINQO)
+ {
+ if(0 < power.getTotalCadCounter())
+ {
+ gc.setCad((int)Round(power.getRpm() /
power.getTotalCadCounter(),0));
+ power.setTotalCadCounter(0);
+ power.setRpm(0);
+ }
+ else
+ {
+ gc.setCad(gc.getCad());
+ if (debug)
+ System.out.println("1sec NO SIGNAL
FROM PowerMeter-Cadence\n");
+ }
+ }
+ }
+
+ if(powerMeterDetect == PT)
+ {
+ if((gc.getCad() > 1) &&
(power.getTotalNmCounter()>0))
+ {
+ double gearRatio = power.getRpm() /
gc.getCad();
+ gc.setNm(Round((power.getNm() * gearRatio) /
power.getTotalNmCounter(),4));
+ power.setNm(0);
+ power.setRpm(0);
+ power.setTotalNmCounter(0);
+ }
+ else
+ {
+ gc.setNm(0);
+ power.setNm(0);
+ power.setRpm(0);
+ power.setTotalNmCounter(0);
+ }
+ }
+ else
+ {
+ gc.setNm(Round(power.getNm() /
power.getTotalNmCounter(),4));
+ power.setNm(0);
+ power.setTotalNmCounter(0);
+ }

if(gc.getSecs () - gc.getPrevSpeedSecs() > 5)
gc.setSpeed(0);

writeGCRecord(gc);
@@ -269,11 +327,11 @@ public class GoldenEmbedParserMain {

if (write)
gc.setSecs((hr * 60 * 60) + (min * 60) + sec);

if (debug)
- System.out.println("Time stamp: " + hr.intValue() + ":" +
min.intValue() + ":" + sec.intValue());
+ System.out.println("Time stamp: " + hr.intValue() + ":" +
min.intValue() + ":" + sec.intValue() +"\n");

return i;
}

public byte[] getBytesFromFile(File file) throws IOException {
@@ -436,14 +494,30 @@ public class GoldenEmbedParserMain {
public int ANTParsePower(byte[] msgData, int i, int size,
GoldenCheetah gc) {
int t1;
int p1;
int r1;

- if (msgData[i] != 0x12) // It's not real power data
+//10.Feb.26 S.Kouzai
+// if (msgData[i] != 0x12) // It's not real power data
+// return i + size + 2;
+// else
+// i += 2;
+
+ if (msgData[i] != 0x12 && msgData[i] != 0x11)
return i + size + 2;
else
+ {
+ if(msgData[i] == 0x12)
+ powerMeterDetect = CINQO;
+ else if(msgData[i] == 0x11)
+ powerMeterDetect = PT;
+ else
+ powerMeterDetect = CINQO;
+
i += 2;
+ }
+////////////

int end = i + size - 2;
double rdiff = 0;
double pdiff = 0;
double tdiff = 0;
@@ -466,71 +540,78 @@ public class GoldenEmbedParserMain {
// We can calculate and then store
aByte = new Byte(msgData[i]);
r1 = aByte.intValue();
rdiff = (r1 + 255 - power.getR()) % 255;
power.setR(aByte.intValue());
- if(megaDebug) System.out.println("rdiff is: " +
rdiff);
+ if(megaDebug) System.out.println("rdiff is: " +
rdiff +"\n");
}
msgN++;
} else if (msgN == 1) {
byte[] pRdiff = new byte[2];
i++;
pRdiff[1] = msgData[i];
- if(megaDebug) System.out.println("0x" +
UnicodeFormatter.byteToHex(msgData[i])+"\n");
+ if(megaDebug) System.out.println("0x" +
UnicodeFormatter.byteToHex(msgData[i]));
i++;
pRdiff[0] = msgData[i];
- if(megaDebug) System.out.println("0x" +
UnicodeFormatter.byteToHex(msgData[i])+"\n");
+ if(megaDebug) System.out.println("0x" +
UnicodeFormatter.byteToHex(msgData[i]));
p1 = byteArrayToInt(pRdiff, 0, 2);

if (power.first12) {
power.setP(p1);
if(megaDebug) System.out.println("P1: " + p1);
} else {
pdiff = (65536 + p1 - power.getP()) % 65536;
power.setP(p1);
- if(megaDebug) System.out.println("pdiff is: " +
pdiff);
+ if(megaDebug) System.out.println("pdiff is: " +
pdiff +"\n");
}
msgN++;
- } else if (msgN == 2) {
+ }
+ else if (msgN == 2)
+ {
byte[] pRdiff = new byte[2];
pRdiff[1] = msgData[i];
- if(megaDebug) System.out.println("0x" +
UnicodeFormatter.byteToHex(msgData[i])+"\n");
+ if(megaDebug) System.out.println("0x" +
UnicodeFormatter.byteToHex(msgData[i]));
i++;
pRdiff[0] = msgData[i];
- if(megaDebug) System.out.println("0x" +
UnicodeFormatter.byteToHex(msgData[i])+"\n");
+ if(megaDebug) System.out.println("0x" +
UnicodeFormatter.byteToHex(msgData[i]));

t1 = byteArrayToInt(pRdiff, 0, 2);

if (power.first12) {
power.setT(t1);
if(megaDebug) System.out.println("T: " + t1);
} else {
tdiff = (t1 + 65536 - power.getT()) % 65536;
power.setT(t1);
- if(megaDebug) System.out.println("tdiff is: " +
tdiff);
+ if(megaDebug) System.out.println("tdiff is: " +
tdiff +"\n");
}

i++;
msgN++;
}
}
+
if (tdiff != 0 && rdiff != 0) {
nm = (float)tdiff / ((float)rdiff * 32.0);
rpm = (double)rdiff * 122880.0 / (double)pdiff;
watts = rpm * nm * 2 * PI / 60;

if (debug)
System.out.println("nm: " + nm + " rpm: " + rpm + "
watts: " + watts + "\n");
+
i = setTimeStamp(msgData, i, gc, true);

if (rpm < 10000 && watts < 10000) {
power.setRpm(power.getRpm() + rpm);
power.setWatts(power.getWatts() + watts);
+ power.setNm(power.getNm() + nm);
double wattCounter = power.getTotalWattCounter();
double cadCounter = power.getTotalCadCounter();
+ double nmCounter = power.getTotalNmCounter();
power.setTotalWattCounter(wattCounter + 1);
power.setTotalCadCounter(cadCounter + 1);
+ power.setTotalNmCounter(nmCounter + 1);
gc.setPrevWattsecs(gc.getSecs());
gc.setPrevCadSecs(gc.getSecs());

} else {
if (debug)
@@ -596,11 +677,11 @@ public class GoldenEmbedParserMain {
Byte aByte = new Byte(rxBuf[i]);
msgN++; // Size
size = aByte.intValue();
} else {
if (rxBuf.length <= size + i + 1) {
- System.out.println("\nTotal Failed Checksums: : "
+ totalErrors + "Out of Total ANT Messages: "
+ System.out.println("\nTotal Failed Checksums: : "
+ totalErrors + " Out of Total ANT Messages: "
+ totalTrans);
System.out.println("% Failure: " + (totalErrors /
totalTrans) * 100.0);
System.out.println("Total CAD or Watt Spikes: " +
totalSpikes);
closeGCFile();
System.exit(0); // EOF
@@ -697,15 +778,15 @@ public class GoldenEmbedParserMain {
break;
case MESG_CHANNEL_EVENT_ERROR:
if(code == 0x01)
{
if(ch == 0)
- System.out.println("Dropped HRM");
+ System.out.println("Dropped HRM");
else if(ch == 1)
- System.out.println("Dropped Power");
+ System.out.println("Dropped Power");
else if(ch == 2)
- System.out.println("Dropped Cadence/Speed");
+ System.out.println("Dropped Cadence/Speed");
}
break;
default:
if (debug)
System.out.println("[unknown]: " +
UnicodeFormatter.byteToHex(id));
@@ -725,11 +806,11 @@ public class GoldenEmbedParserMain {
uShort uint = new uShort(b, offset);
return uint.getValue();
}

private void writeGCRecord(GoldenCheetah gc) {
- fout.write(spacer1 + "<sample cad=\"" + gc.getCad() + "\"
watts=\"" + gc.getWatts() + "\" kph=\"" + Round(gc.getSpeed(),1) + "\"
km=\"" + Round(gc.getDistance(),2) + "\" secs=\""
+ fout.write(spacer1 + "<sample cad=\"" + gc.getCad() + "\" nm=
\"" + gc.getNm() + "\" watts=\"" + gc.getWatts() + "\" kph=\"" +
Round(gc.getSpeed(),1) + "\" km=\"" + Round(gc.getDistance(),2) + "\"
secs=\""
+ gc.getSecs() + "\" hr=\"" + gc.getHr() + "\" len=
\"1\"/>\n");
}

public static double Round(double Rval, int Rpl)
{


=============================ここまで


On 3月9日, 午前10:16, Mitsukuni Sato <mitsukuni.s...@gmail.com> wrote:

Kouzai Shinsuke

unread,
Mar 9, 2010, 10:00:59 AM3/9/10
to golden-cheetah-users-ja
やべっ、日本語コメントが残ってた…
Reply all
Reply to author
Forward
0 new messages