From aae0d3c1166e9549d5f8b501e347b60ba024ce31 Mon Sep 17 00:00:00 2001 From: "Sean C. Rhea" Date: Wed, 6 Sep 2006 23:59:42 +0000 Subject: [PATCH] initial import --- COPYING | 340 +++++++++++++++++++ Makefile | 53 +++ compare_rows.pl | 83 +++++ cpint-cmd.c | 55 ++++ cpint.c | 251 ++++++++++++++ cpint.h | 29 ++ doc/Makefile | 42 +++ doc/contact.content | 5 + doc/contrib.content | 18 + doc/cpint.gp | 12 + doc/cpint.png | Bin 0 -> 14447 bytes doc/download.content | 43 +++ doc/faq.content | 62 ++++ doc/gc_2006-05-16.tgz | Bin 0 -> 12565 bytes doc/gc_2006-05-25.tgz | Bin 0 -> 14941 bytes doc/gc_2006-05-27.tgz | Bin 0 -> 16718 bytes doc/gc_2006-08-11.tgz | Bin 0 -> 18136 bytes doc/genpage.pl | 131 ++++++++ doc/gui-preview.png | Bin 0 -> 207458 bytes doc/index.content | 26 ++ doc/license.content | 68 ++++ doc/logo.jpg | Bin 0 -> 10356 bytes doc/logo.png | Bin 0 -> 229 bytes doc/sample.gp | 8 + doc/sample.png | Bin 0 -> 19286 bytes doc/search.content | 42 +++ doc/users-guide.content | 222 +++++++++++++ gui/AllPlot.cpp | 176 ++++++++++ gui/AllPlot.h | 67 ++++ gui/ChooseCyclistDialog.cpp | 112 +++++++ gui/ChooseCyclistDialog.h | 53 +++ gui/DownloadRideDialog.cpp | 312 ++++++++++++++++++ gui/DownloadRideDialog.h | 72 ++++ gui/GoldenCheetah.pro | 30 ++ gui/MainWindow.cpp | 279 ++++++++++++++++ gui/MainWindow.h | 66 ++++ gui/RawFile.cpp | 100 ++++++ gui/RawFile.h | 58 ++++ gui/RideItem.cpp | 138 ++++++++ gui/RideItem.h | 42 +++ gui/Settings.h | 36 ++ gui/TODO | 10 + gui/addqt.sh | 13 + gui/main.cpp | 69 ++++ gui/mkdmg.sh | 17 + intervals.pl | 113 +++++++ notes.txt | 75 +++++ package.sh | 8 + pt.c | 632 ++++++++++++++++++++++++++++++++++++ pt.h | 98 ++++++ ptdl.c | 231 +++++++++++++ ptpk.c | 229 +++++++++++++ ptunpk.c | 152 +++++++++ smooth.pl | 53 +++ test.sh | 30 ++ 55 files changed, 4761 insertions(+) create mode 100644 COPYING create mode 100644 Makefile create mode 100755 compare_rows.pl create mode 100644 cpint-cmd.c create mode 100644 cpint.c create mode 100644 cpint.h create mode 100644 doc/Makefile create mode 100644 doc/contact.content create mode 100644 doc/contrib.content create mode 100644 doc/cpint.gp create mode 100644 doc/cpint.png create mode 100644 doc/download.content create mode 100644 doc/faq.content create mode 100644 doc/gc_2006-05-16.tgz create mode 100644 doc/gc_2006-05-25.tgz create mode 100644 doc/gc_2006-05-27.tgz create mode 100644 doc/gc_2006-08-11.tgz create mode 100755 doc/genpage.pl create mode 100644 doc/gui-preview.png create mode 100644 doc/index.content create mode 100644 doc/license.content create mode 100644 doc/logo.jpg create mode 100644 doc/logo.png create mode 100644 doc/sample.gp create mode 100644 doc/sample.png create mode 100644 doc/search.content create mode 100644 doc/users-guide.content create mode 100644 gui/AllPlot.cpp create mode 100644 gui/AllPlot.h create mode 100644 gui/ChooseCyclistDialog.cpp create mode 100644 gui/ChooseCyclistDialog.h create mode 100644 gui/DownloadRideDialog.cpp create mode 100644 gui/DownloadRideDialog.h create mode 100644 gui/GoldenCheetah.pro create mode 100644 gui/MainWindow.cpp create mode 100644 gui/MainWindow.h create mode 100644 gui/RawFile.cpp create mode 100644 gui/RawFile.h create mode 100644 gui/RideItem.cpp create mode 100644 gui/RideItem.h create mode 100644 gui/Settings.h create mode 100644 gui/TODO create mode 100755 gui/addqt.sh create mode 100644 gui/main.cpp create mode 100755 gui/mkdmg.sh create mode 100755 intervals.pl create mode 100644 notes.txt create mode 100755 package.sh create mode 100644 pt.c create mode 100644 pt.h create mode 100644 ptdl.c create mode 100644 ptpk.c create mode 100644 ptunpk.c create mode 100755 smooth.pl create mode 100755 test.sh diff --git a/COPYING b/COPYING new file mode 100644 index 000000000..f90922eea --- /dev/null +++ b/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..64b14ecd8 --- /dev/null +++ b/Makefile @@ -0,0 +1,53 @@ +# +# $Id: Makefile,v 1.11 2006/09/06 23:23:03 srhea Exp $ +# +# Copyright (c) 2006 Sean C. Rhea (srhea@srhea.net) +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the Free +# Software Foundation; either version 2 of the License, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +# more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., 51 +# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# + +CC=gcc +CFLAGS=-g -W -Wall -Werror -ansi -pedantic +CXXFLAGS=-g -W -Wall -Werror + +all: ptdl ptpk ptunpk cpint subdirs +.PHONY: all clean subdirs + +clean: + rm -f *.o ptdl ptpk ptunpk cpint + $(MAKE) -wC gui clean + +subdirs: + @if test -d gui; \ + then \ + if ! test -f gui/Makefile; then cd gui; qmake; cd -; fi; \ + $(MAKE) -wC gui; \ + fi + +cpint: cpint-cmd.o cpint.o pt.o + $(CXX) -o $@ $^ + +ptdl: ptdl.o pt.o + $(CC) -o $@ $^ + +ptunpk: ptunpk.o pt.o + $(CC) -o $@ $^ + +ptpk: ptpk.o pt.o + $(CC) -o $@ $^ + +ptdl.o: pt.h +ptunpk.o: pt.h + diff --git a/compare_rows.pl b/compare_rows.pl new file mode 100755 index 000000000..6c6684fe4 --- /dev/null +++ b/compare_rows.pl @@ -0,0 +1,83 @@ +#!/usr/bin/perl -w +# +# $Id: compare_rows.pl,v 1.1 2006/05/12 21:50:51 srhea Exp $ +# +# Copyright (c) 2006 Russ Cox (rsc@swtch.com) and Sean Rhea (srhea@srhea.net) +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the Free +# Software Foundation; either version 2 of the License, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +# more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., 51 +# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# + +use strict; + +if ($#ARGV < 1) { + print STDERR "usage: compare_rows.pl [column]\n"; + exit 1; +} + +my $file1 = $ARGV[0]; +my $file2 = $ARGV[1]; +my $start_col = 0; +my $stop_col = 8; +if ($#ARGV >= 2) { + my $stop_col = $ARGV[2]; + my $start_col = $stop_col - 1; +} + +open(FILE1, $file1) or die "Couldn't open $file1\n"; +open(FILE2, $file2) or die "Couldn't open $file2\n"; + +my $row = 0; +while() { + ++$row; + $_ =~ s/^\s+//; + my @cols1 = split /\s+/, $_; + my $row2 = ; + if ($row2) { + my @cols2 = split /\s+/, $row2; + my $col; + for ($col = $start_col; $col < $stop_col; ++$col) { + if (($cols1[$col] =~ m/[0-9.]+/) && ($cols2[$col] =~ m/[0-9.]+/)) { + if ($col == 0) { + # Times are sometimes off by a bit; just make sure they're + # within a tenth of a percent. + if (($cols1[$col] * 0.999 > $cols2[$col]) + || ($cols1[$col] * 1.001 < $cols2[$col])) { + print "$file1: @cols1\n"; + print "$file2: @cols2\n"; + } + } + else { + # All other columns should match exactly. + if ($cols1[$col] != $cols2[$col]) { + print "$file1: @cols1\n"; + print "$file2: @cols2\n"; + } + } + } + elsif (!($cols1[$col] eq $cols2[$col])) { + print "$file1: @cols1\n"; + print "$file2: @cols2\n"; + } + } + } + else { + print "$file1 is longer.\n"; + } +} + +if () { + print "$file2 is longer.\n"; +} + diff --git a/cpint-cmd.c b/cpint-cmd.c new file mode 100644 index 000000000..260338b90 --- /dev/null +++ b/cpint-cmd.c @@ -0,0 +1,55 @@ +/* + * $Id: cpint-cmd.c,v 1.1 2006/08/11 19:53:07 srhea Exp $ + * + * Copyright (c) 2006 Sean C. Rhea (srhea@srhea.net) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "cpint.h" + +static void +one_done_cb(const char *longdate) +{ + fprintf(stderr, "Compiling data for ride on %s...", longdate); +} + +int +main(int argc, char *argv[]) +{ + int i; + double *bests; + int bestlen; + char *dir = "."; + if (argc > 1) + dir = argv[1]; + update_cpi_files(dir, one_done_cb); + combine_cpi_files(dir, &bests, &bestlen); + for (i = 0; i < bestlen; ++i) { + if (bests[i] != 0) + printf("%6.3f %3.0f\n", i * 0.021, round(bests[i])); + } + return 0; +} + diff --git a/cpint.c b/cpint.c new file mode 100644 index 000000000..1f412fd32 --- /dev/null +++ b/cpint.c @@ -0,0 +1,251 @@ +/* + * $Id: cpint.c,v 1.4 2006/08/11 19:53:07 srhea Exp $ + * + * Copyright (c) 2006 Sean C. Rhea (srhea@srhea.net) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "pt.h" + +struct point +{ + double secs; + int watts; + struct point *next; +}; + +static struct point *head, *tail; +time_t start_since_epoch; +static double last_secs; +static int rec_int_ms = 1.26 * 1000.0; + +static int +secs_to_interval(double secs) +{ + if (rec_int_ms == 0) { + fprintf(stderr, "Missing recording interval.\n"); + exit(1); + } + return (int) round(secs * 1000.0 / rec_int_ms); +} + +static void +add_point(double secs, double watts) +{ + struct point *p = (struct point*) malloc(sizeof(struct point)); + p->secs = secs; + p->watts = watts; + p->next = NULL; + if (tail) tail->next = p; else head = p; + tail = p; +} + +static void +time_cb(struct tm *time, time_t since_epoch, void *context) +{ + double secs; + context = NULL; + time = NULL; + if (start_since_epoch == 0) + start_since_epoch = since_epoch; + secs = since_epoch - start_since_epoch; + /* Be conservative: a sleep interval counts as all zeros. */ + add_point(secs, 0.0); + last_secs = secs; +} + +static void +data_cb(double secs, double nm, double mph, double watts, double miles, + unsigned cad, unsigned hr, unsigned interval, void *context) +{ + context = NULL; + nm = 0.0; miles = 0.0; cad = 0; hr = 0; interval = 0; + /* Be conservative: count NaN's as zeros. */ + add_point(secs, (mph == -1.0) ? 0.0 : watts); + last_secs = secs; +} + +static void +error_cb(const char *msg, void *context) +{ + context = NULL; + fprintf(stderr, "%s\n", msg); + exit(1); +} + +void +one_file(FILE *in, FILE *out) +{ + double start_secs, prev_secs, dur_secs, avg, sum; + int dur_ints, i, total_intervals; + double *bests; + struct point *p, *q; + + if (head) { + p = head; + while (p) { q = p; p = p->next; free(q); } + head = tail = NULL; + } + start_since_epoch = 0; + last_secs = 0.0; + + pt_read_raw(in, 0 /* not compat */, NULL, NULL, + &time_cb, &data_cb, &error_cb); + + total_intervals = secs_to_interval(tail->secs); + bests = (double*) calloc(total_intervals + 1, sizeof(double)); + + start_secs = prev_secs = 0.0; + for (p = head; p; p = p->next) { + sum = 0.0; + for (q = p; q; q = q->next) { + sum += (q->secs - prev_secs) * q->watts; + dur_secs = q->secs - start_secs; + dur_ints = secs_to_interval(dur_secs); + avg = sum / dur_secs; + if (bests[dur_ints] < avg) + bests[dur_ints] = avg; + prev_secs = q->secs; + } + start_secs = prev_secs = p->secs; + } + + for (i = 0; i <= total_intervals; ++i) { + if (bests[i] != 0) + fprintf(out, "%6.3f %3.0f\n", i * rec_int_ms / 1000.0 / 60.0, + round(bests[i])); + } +} + +void +update_cpi_files(const char *dir, void (*one_done_cb)(const char *date)) +{ + DIR *dirp; + struct dirent *dp; + regex_t reg; + struct stat sbi, sbo; + FILE *in, *out; + char *outname; + char year[5], mon[3], day[3], hour[3], min[3], sec[3]; + char longdate[26]; + struct tm time; + time_t t; + + int nmatch = 7; + regmatch_t *pmatch = (regmatch_t*) calloc(nmatch, sizeof(regmatch_t)); + + if (regcomp(®, "^([0-9][0-9][0-9][0-9])_([0-9][0-9])_([0-9][0-9])" + "_([0-9][0-9])_([0-9][0-9])_([0-9][0-9])\\.raw$", REG_EXTENDED)) + assert(0); + + outname = malloc(strlen(dir) + 25); + dirp = opendir(dir); + while ((dp = readdir(dirp)) != NULL) { + if (regexec(®, dp->d_name, nmatch, pmatch, 0) == 0) { + if (stat(dp->d_name, &sbi)) + assert(0); + sprintf(outname, "%s/%s", dir, dp->d_name); + strcpy(outname + strlen(outname) - 4, ".cpi"); + if ((stat(outname, &sbo)) || (sbo.st_mtime < sbi.st_mtime)) { + strncpy(year, dp->d_name + pmatch[1].rm_so, 4); year[4] = '\0'; + strncpy(mon, dp->d_name + pmatch[2].rm_so, 2); mon[2] = '\0'; + strncpy(day, dp->d_name + pmatch[3].rm_so, 2); day[2] = '\0'; + strncpy(hour, dp->d_name + pmatch[4].rm_so, 2); hour[2] = '\0'; + strncpy(min, dp->d_name + pmatch[5].rm_so, 2); min[2] = '\0'; + strncpy(sec, dp->d_name + pmatch[6].rm_so, 2); sec[2] = '\0'; + memset(&time, 0, sizeof(time)); + time.tm_year = atoi(year) - 1900; + time.tm_mon = atoi(mon) - 1; + time.tm_mday = atoi(day); + time.tm_hour = atoi(hour); + time.tm_min = atoi(min); + time.tm_sec = atoi(sec); + time.tm_isdst = -1; + t = mktime(&time); + assert(t != -1); + ctime_r(&t, longdate); + longdate[24] = '\0'; /* get rid of newline */ + one_done_cb(longdate); + fflush(stderr); + in = fopen(dp->d_name, "r"); + assert(in); + out = fopen(outname, "w"); + assert(out); + one_file(in, out); + fclose(in); + fclose(out); + fprintf(stderr, "done.\n"); + } + } + } + closedir(dirp); + free(pmatch); +} + +void +combine_cpi_files(const char *dir, double *bests[], int *bestlen) +{ + DIR *dirp; + struct dirent *dp; + FILE *in; + char line[40]; + int lineno; + double mins; + int watts; + double *tmp; + int interval; + + *bestlen = 1000; + + *bests = calloc(*bestlen, sizeof(double)); + dirp = opendir(dir); + while ((dp = readdir(dirp)) != NULL) { + if (strcmp(".cpi", dp->d_name + dp->d_namlen - 4) == 0) { + in = fopen(dp->d_name, "r"); + assert(in); + lineno = 1; + while (fgets(line, sizeof(line), in) != NULL) { + if (sscanf(line, "%lf %d\n", &mins, &watts) != 2) { + fprintf(stderr, "Bad match on line %d: %s", lineno, line); + exit(1); + } + interval = secs_to_interval(mins * 60.0); + while (interval >= *bestlen) { + tmp = calloc(*bestlen * 2, sizeof(double)); + memcpy(tmp, *bests, *bestlen * sizeof(double)); + free(*bests); + *bests = tmp; + *bestlen *= 2; + } + if ((*bests)[interval] < watts) + (*bests)[interval] = watts; + ++lineno; + } + fclose(in); + } + } + closedir(dirp); +} + + diff --git a/cpint.h b/cpint.h new file mode 100644 index 000000000..330412f8e --- /dev/null +++ b/cpint.h @@ -0,0 +1,29 @@ +/* + * $Id: cpint.h,v 1.1 2006/08/11 19:53:07 srhea Exp $ + * + * Copyright (c) 2006 Sean C. Rhea (srhea@srhea.net) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __cpint_h +#define __cpint_h 1 + +extern void update_cpi_files(const char *dir, + void (*one_done_cb)(const char *date)); +extern void combine_cpi_files(const char *dir, double *bests[], int *bestlen); + +#endif /* __cpint_h */ + diff --git a/doc/Makefile b/doc/Makefile new file mode 100644 index 000000000..0514ec7bf --- /dev/null +++ b/doc/Makefile @@ -0,0 +1,42 @@ + +CONTENT=$(wildcard *.content) +HTML=$(subst .content,.html,$(CONTENT)) +TARBALLS=$(wildcard gc_*.tgz) +OTHER=logo.png sample.gp sample.png cpint.gp cpint.png gui-preview.png + +all: $(HTML) +.PHONY: all clean install + +clean: + rm -f $(HTML) + +install: + rsync -avz -e ssh $(HTML) $(TARBALLS) $(OTHER) \ + srhea.net:public_html/goldencheetah/ + +# ftp -u ftp://srhea@ftp.goldencheetah.org/ $(HTML) $(TARBALLS) $(OTHER) + +contact.html: contact.content genpage.pl + ./genpage.pl "Contact Us" $< > $@ + +contrib.html: contrib.content genpage.pl + ./genpage.pl "Contributors" $< > $@ + +download.html: download.content genpage.pl + ./genpage.pl "Download" $< > $@ + +faq.html: faq.content genpage.pl + ./genpage.pl "Frequently Asked Questions" $< > $@ + +index.html: index.content genpage.pl + ./genpage.pl "Introduction" $< > $@ + +license.html: license.content genpage.pl + ./genpage.pl "License" $< > $@ + +search.html: search.content genpage.pl + ./genpage.pl "Search" $< > $@ + +users-guide.html: users-guide.content genpage.pl + ./genpage.pl "User's Guide" $< > $@ + diff --git a/doc/contact.content b/doc/contact.content new file mode 100644 index 000000000..6cd3d04f7 --- /dev/null +++ b/doc/contact.content @@ -0,0 +1,5 @@ + + +Please send all correspondence to +info@goldencheetah.org. + diff --git a/doc/contrib.content b/doc/contrib.content new file mode 100644 index 000000000..939e82fda --- /dev/null +++ b/doc/contrib.content @@ -0,0 +1,18 @@ + + +Sean Rhea bought a PowerTap Pro on April 20, 2006, and immediately set to +figuring out how to use it from his Mac Powerbook without using Virtual PC. +Within a week, he was able to download the raw data. Shortly thereafter, Russ +Cox asked what he was up to, and the two worked together to figure out the +packing format used. By May 4, they could reproduce the numbers given by the +PowerTap software except for minor discrepancies in the time values. David +Easter then pointed out how the checksum bytes in the download protocol were +used, and Sean Rhea coded up their combined discoveries into the two +utilities, ptdl and ptunpk. + +

+Rob Carlsen helped get the serial port version of the PowerTap Pro working +with the Keyspan USB-to-serial adaptor. Scott Overfield helped me figure out +that we should be using the /dev/cu.* devices instead of the +/dev/tty.* ones. + diff --git a/doc/cpint.gp b/doc/cpint.gp new file mode 100644 index 000000000..bb62814a9 --- /dev/null +++ b/doc/cpint.gp @@ -0,0 +1,12 @@ +set title "Critical Power Output" +set xlabel "Interval Duration (MM:SS)" +set ylabel "Average Power (Watts)" +set mxtics 5 +set mytics 2 +set yrange [0:] +set xrange [0.021:120] +set logscale x +set xtics ("0:01.26" 0.021, "0:05" 0.08333, "0:12" 0.2, "1:00" 1, "5:00" 5, \ + "12:00" 12, "30:00" 30, "60:00" 60, "120:00" 120) +plot 'cpint.out' noti with li lt 1 +pause -1 diff --git a/doc/cpint.png b/doc/cpint.png new file mode 100644 index 0000000000000000000000000000000000000000..b65f28c198761742018bf0a4a1fb61b48d595f9f GIT binary patch literal 14447 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 + +Right now we're only distributing tarballs of the Golden Cheetah source. + +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + +
DateSourceDescription
Aug 11, 2006gc_2006-08-11.tgzptdl now works with Keyspan USB-to-serial adaptor, after +debugging help from Rob Carlsen. +
May 27, 2006gc_2006-05-27.tgzAdds the cpint program for computing critical +power intervals and the ptpk program for converting from +PowerTuned data files (see the User's +Guide).
May 16, 2006gc_2006-05-16.tgzThe first code release, containing ptdl and +ptunpk.
+
+ +

+We hope to have anonymous CVS access set up soon. + diff --git a/doc/faq.content b/doc/faq.content new file mode 100644 index 000000000..4a292ed8f --- /dev/null +++ b/doc/faq.content @@ -0,0 +1,62 @@ + + +

+Why does Golden Cheetah only include command-line utilities? Where's the +GUI? + +

+Because this project is only a hobby of ours, and we haven't had time to +finish it yet. That said, we are working on it. Here's a teaser screenshot +to keep you interested: + +

+GUI Screen Shot +
+ +

+Does the output of ptunpk exactly match that of the software +included with the PowerTap? + +

+Almost. If you run it in compatibility mode, using the -c +option, it matches the PowerTap software's output exactly on everything but +the time values, at least for the five sample rides we've tried it with. +The times are a little off, but not by more than 0.1%, so we don't consider it +a big deal. + +

+That said, the PowerTap software does some weird things, like converting from +kilometers to miles by multiplying by 0.62, but then reporting the miles +values with five digits after the decimal place. If you run +ptunpk without the -c option, it will unpack the +data in the way we think it should. The results mostly match up with the +official ones, and are almost certainly identical within the range of accuracy +of the device. + +

+I've downloaded and unpacked the data. Now what do I do with it? + +

+We highly recommend that you buy and read both Joe Friel's The +Cyclist's Training Bible and Allen and Coggan's Training and +Racing with a Power Meter. The former is the definitive book about all +aspects of cycling training (although we think he's off his rocker in the +chapter about diet), and the latter is the definitive book about power-based +training. + +

+Also, if you buy either of these books through the links below, we'll get a +referral fee in return, helping us to support this web site. Thanks! + +

+ + + +
+ diff --git a/doc/gc_2006-05-16.tgz b/doc/gc_2006-05-16.tgz new file mode 100644 index 0000000000000000000000000000000000000000..bc2db38f0039e5f16e02fbad24588e7b5d75749a GIT binary patch literal 12565 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 ONc4E)9U$1CApZjzK(XWi literal 0 HcmV?d00001 diff --git a/doc/gc_2006-05-27.tgz b/doc/gc_2006-05-27.tgz new file mode 100644 index 0000000000000000000000000000000000000000..0d25ff19cc8c6fb08ea87becfdb0e617143284a9 GIT binary patch literal 16718 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 D1l|{z literal 0 HcmV?d00001 diff --git a/doc/genpage.pl b/doc/genpage.pl new file mode 100755 index 000000000..5ed0b9bc7 --- /dev/null +++ b/doc/genpage.pl @@ -0,0 +1,131 @@ +#!/usr/bin/perl -w +# +# Copyright (c) 2001-2003 Regents of the University of California. +# All rights reserved. +# +# See the file LICENSE included in this distribution for details. +# +# $Id: genpage.pl,v 1.3 2006/07/05 16:59:56 srhea Exp $ + +use strict; + +my $title = shift; +my $content_file = shift; +open (FILE, "$content_file") or die "Could not open $content_file"; + +print< + + + +Golden Cheetah: Power for the Masses + + + + + + + + + + + + + + + + +
+Picture of Cheetah + +

Introduction +
User's Guide +
FAQ +
License +
Download +
Contributors +
Search +
Mailing List + +

+ + + + +

+ + + + + + +
+ +

+

+Golden +Cheetah +
+ +Power for the Masses + +

+

+ +$title + +
+EOF + +my $match = "\\\$" . "Id:.* (\\d\\d\\d\\d\\/\\d\\d\\/\\d\\d " + . "\\d\\d:\\d\\d:\\d\\d) .*\\\$"; + +my $last_mod; +while () { + + if (m/$match/) { + $last_mod = $1; + } + print; +} +close (FILE); + +if (defined $last_mod) { + print "


Last modified $last_mod.\n"; +} + +print<
+
+ + + +EOF + diff --git a/doc/gui-preview.png b/doc/gui-preview.png new file mode 100644 index 0000000000000000000000000000000000000000..79464f8e2e759a3dee00d9006f2d4e60589eedbf GIT binary patch literal 207458 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%0D^ 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 + +

+The goal of the Golden Cheetah project is to develop a software package that: +

+ +

+In short, we believe that cyclists should be able to download their power data +to the computer of their choice, analyze it in whatever way they see fit, and +share their methods of analysis with others. + diff --git a/doc/license.content b/doc/license.content new file mode 100644 index 000000000..29469b01c --- /dev/null +++ b/doc/license.content @@ -0,0 +1,68 @@ + + +Golden Cheetah is licensed under the +GNU General Public License, +the preamble of which states: + +

+ The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + +

+

+ When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + +

+

+ To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + +

+

+ For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + +

+

+ We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + +

+

+ Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + +

+

+ Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + +

+ +For the full text of the license, please click the link above. + diff --git a/doc/logo.jpg b/doc/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d5947b50ce523c542b60997ba327d871672b4068 GIT binary patch literal 10356 zcmbVxcQjnx_xFe%Er{L{y+lOsBm@yrqh*wdh%iPkG5Uk(EeH}3B61Z(E-V z_a&c@F&f*E^LpNu3QNhO;M1t;WHK4U@Jqk(3a7ly%)-jXE+8l*EFvl+D<`j@sHFK+ zOIzoe?(>(XX66=_uYmS%9o{)Qft|g5eBb*){R1LCL`Fr&#KxtjeM-;B{QM>BM}9$J zQE^G>&+3}my84F3KTTcTJ-sk^U;n`P#N^a8VrCYJT0yU_t#52@ZDS9Qj!$r>__OnW zc@Y7K|C`p${lA(0AH3*qc-^|O0SWoPyohf3-E?Al64LvUWDHM?$?ZHDd8NWA?rNmu zRdrJGNtEpiN~ME?nN+0=D%M30r5sVG$ztGbh&^!T z`R7*({lVR?whF$kAF{dYcCP`nvSL01c<`!TFId?KT*=CR`@RF% zG8^#cAnSySOqB!mE+JE$Q{n^?Y_K9V1_nBZJma$+bp>N)RSJsZ4yT$%c)kn00w_vfztHk4(AuL3G=ad7JoWT&-Sgwh zfIbY9;Bd{WNfv=qYWh(N`pPt!T|&y91rU6|n!il@&3ULj>TP;DoAm)#ps|QoM&9m; zqTbtgxqsM}=|OH+uw2>$7Mw;q;&_%nZW*%V*szeT@_CrNNIC1QQVZ|#v~)d6v6DwU z`0E8T;Q>}YQjK}WIoHi9k;lAQq!|3L1J_sTs$e$Kzo5Gfe)nVdQ;`R#a)ZlbRZqwAx1B&#$Pp`e_1Mkd2PEz%eB^M6CB3 z;Izc()KuKv3~dotZQXX3m+N`4$>#{8wEIY>f*2a@F)!}hU;*1M{0eRhKE+~Y?iW;N3tYQnHHT-sg@TB6#VX?Il$0fnEL!Sx^%l>bVAabeF(LDg z7?$o-=nWQFhER!XuonE$^5NrZgaglNI=H3Aeg!cWbfQ)p8>hH3eHyBNhd6~}R=&sh7Ixq9A`dc&mQ)2)$0inU`$C%?xMOjq_t%3JO) z4?Wy4_oj$KX1kAV(e6mOXwY5B@Rs zEJynA_@uH+o%m}0bdl|L$r**tP;*J81*U;;*I<9oENI_z;;-xgW@6LzcC6DFHa)YO z*yktrE#o9E5)bU4s-)}wg9&gg4W3t+(_*p?TVgMOU*M*&P zJ2-oRDA(T&>D)Okw^2tePlU%WdlY!@*>?X>%k+h;zj*u!Cs;)=^Mrss%5IBg z-V@%|6#`iB{~UPUm3TYdECOZGAr3*)=J`2b76-&ij|X*HTeAE~%24=Ex#W1+fHlbG*S8k>Or4s$)JIqrUcJx#Md2ri@=6pMhLQMJJLS?ieBVKj}L73DUY2#23U6ZO$C`1{8&1a$pD?BSs?5AU^o}Y3Qap;%~}t?|u&p;=`Y!gra5Lqs_C- z|A6h(e&KGfI9jVHu)PTDP^RFC435Pz?4Ne=5Z4Yd0^8%%??A5s#&r`ezOTpzgUu%& zWm%ru6NQU(Ts=%b8@mROa^aWI5;HrvuhX?4Zm10(Ch2F_(bK7X!Dp2#d_+vq8e~K- z@$V`r!+YOsu+zU^TX#NK^%-P~>K3s`#s8{3oII1q#f%>3vIjxpXfzaFPoV3C9GdOD zg(`~;AhGQe<}jp!&)ei(^YXQ}-VO33!+=c{KlG3ed~61yloL;zFuq8?7K3Z*f`=Oh zP2=*HeMgTi-%Wnh;q0}2WO%-&stbQX2fP4UPl{-yskynyZV&vj-H=7O-_^{A{v4(h z^1oMO_|S|#YO%*2qSIkF^5Re|A3M0IganU*yI_XA3q@ak@df$_7@k^v>qa)t)|L&4 zd~XeWmdds!z)#aSFznHS>$RTht(z|U9P07>hhoe}JH7*^lOago*O%HBK`jZ}ZYs7a zhDG4_N*O7xMYfhtH5NEH>iP$;s(JFn{=-IjJt3rk5ZsSr@{^0@}^ zY$9{R5B3cTswHFeSu-JTX$mPj$=ZtXvW2rjZ!jmrg(%-d{g$P7O(vgtJx^g{r`}Ju zMa?HP)g49-xTUVxTMjYz?XCetK>_n=WUWEFP>lo{Y_qjx|3cmDSo1Z0TSRA?;|u`XLS*kv-I-AB_bBk)!;UNj@XJ$yb^>Q22s^u z)$;SLkDIsi*0%DwFER6a;I74 z7ih|1($@AIU2hwF*wa;DrYkU1b=a6KgH|+2?*6kH!h*Nw=~=CtZh2Jz+VXV297-5> z{OgvNd~xrXYr7am)$A%}dng+?BR=qS$0w{&_%6yUI9Tf)Fl4mt!PR0Me8snHtIUJM zXaPtwN+xuh5~dB^U>aW7%F;sg2ul4qd#@9(UwjJ}&eqZ(%z5KR{KCnl& zJ;T^!x6v^;XL?p;2};4)L)nD>QD;B@dPO->2#sDj-J_Fh4Rv^+)}4LS zcXDfUt1o)_B=N6^h?Yrf?2c{0jyAh_pJNX<@hA5_-j3Q-9FbjrXOak{rBDA_O)$SQ zS5;|BE3}nz-m*p?CnIki;i9nFArHonOOA&iMpG3o2R<2!>@6vhiRDwt)GPqXl)bKODL1=V4wdW;BO_=v!g zAh9&V9Nh3ZWKipsO3Cp~SaiCvQko7t!zk7@E>PB z=)RIOqy{p*lH5Ap--uI8yW?Uxj)1)U8AQBtQ5lQODaJlrbMvLbM?@u> znc1xh4XACYrJq#9zIM5yum-=}mgD9@oa`Bmtb8-+!dwF!^`I8cvK9MGpHWqC-ZtgS z8kSd>_7v0-1->4{V2hlmtfP63n;T3;*Aqt^k)GSfogQw91V(B7=GLyYj*zM` zAS7BGxmqWGo{L2G><*k$`9ZB-xeLSo6!Xh z*X@7l1=(~~=znv*r@ul3e&G7o;g97=F@9=r5O)pu5E?w}>TXx>w01A3K+F+*!XIEB z+!5%1_kj`8+OT;zcvioa5~M-qj7Sondof|>3VbVEb%i48H~h@ib2{Wo33+QTGd?+n z$?Oh8r-yIYwx=1^)~daEwCUM56p|9!$>S4KenpK>>tV0WIDGi0%>PbG5(Cetu)W20 zxgb7l_`ngnSr0XA$3^sg0*i{U$}xZ3W$0ykyF(}DCYOq?rFz9wbmy{qD>FUyl}As) z(LZ#Y7MaH>@Uzz~BsM-;n75qgXJG7fEr{g9hbgcgSi43in|2d^Kq2$UmUzrt#QKx|!c^ zTkPvZh(u>8KL6F%&i8)j-0>B?yt>6R)}PCl)2rpRi_=wd{C_Hq^fXsS*%DXP<01CG z0p()7e$2&EgFbK`f2&k-p~7G$C8=U{ze+_qtJmQ=c>6udZ^=ya&beh&)ObR>rD&Hv$NL^R+FA)UNulE;BUK;XgOEl zwxX}PULOXu)T?rrU*90Ea{_HnTOfDeXBxcFtu{%T6@A=Ku38F%9WG?)1rA|ZoX`m( z=I=EJ9JyGr_$dw$$>2)-H?7)>sHnhJBAe8EKrDDi zoe9@+bj#$4GW0w2*A(+(8_6PXaAo94lcXk!M+-TAnf#kQr5&b;i$55Mo%pqwRfM*np=j zwgKsTgPr4g4%WPF(OJa>3nSc;S1;AITWee;flqQG4WzTq9j_?S%jKp!=gEmJr1|<~ z^H5(Pm6%UU)WSxyuOfwmf>%CX=Vh<|LB};<=BTIr?ndZtF!#AD?G)DAk0Gq_mQ>3A zavL4-bXy)?ohO1I3HB$2|D$44;-tn&Lt38~SPZxKbp3}iM}at5Mnq96RmrcCk0-8} zxwN=>azFpMFE7%fT15<3aamNyLyJ$^xMEx|hg}1@Lj>yNvpyiFb28+WTqh;20o+yg zm-c)gz2Wtc^=m*z7rEmKF6)fI=# zw$q(}$nlrH%3o>ddV$}L&udTF(zFx#xUCB(4-*~_9Ftgds?)f@yFoDr1$c;2no*S1 zR2azLselycc(M(tl;|$n)|D%2Fdrif_70C0{_w27P;We50HLOH!7JoVn6;kjCwvaX z74yWKsu1EHZsMAzsmNhBtz*ZvY)RIWzAcdTPHvUWak$0r)>|g|Z{Io)2YZfJsVHCE z!pB=Bq1@IZh1i^C?7^zd2vbkmho@53spe`r({7C2r&3m%k3gW2e|D4RK1FODEdF|$ z26cS$)gtnRMJB)hE?n(-?(-8vBo!_Mo7@5M`D!-)6asy3WgSl9)h6{sHHNDUR(s@+ z+GEy}V2W}3kgJ%at7e{(JUH@Qp<+N*G4-8Pace?wU>C9>s)gzrKv@PpO@sRGuhuj) zeWfV!MPVzu zMo92_+TpKWb{$!d_;RbiKV_(2*tuM;iX^`0S6O%sSWZ#Dbszr?%WwpPEh;`}VIN$} z0A=nas6B>m14d9b-X)u(-dU5VI9$3({OIMa%a7`gWpuO3%jTJ=Qimj0=PfNAiXRi(249{3x5bp7Ha02<7TOh^#U(kZz^wKnxF;R2b{FP} z>|tuMvX{%rPgwj=Jp4FL&41d@#db(vo51TyufKcnwHm;U! z?pDr*@EY&)3V1z6@vz{JT!@R%p6}hPZB6DL2L+@K(vt5F zrm26Wiul8i-qY*Ow8Ka`{A zilsGDmNNgs4E9wPo(7g-;QYeDWi4bFfJdVn_H5AZr1+YZkTQ&SuiQ`(m;xu=TRJaO zO<7^8vpT13C>qVbLA(R<44De$s+E|HxT4I>-wu(`1Hb)^+0Q9yG~r7}>9-J1W)axO zf{cT)Ah^;}!ok}&r-)?rzZ-+^RfH)g0QOnF#mpY%b2U72!hQE5X;8d|MxvWi3~G{i1*UER%9U&oleDGNO%gn+hw0eis|8 z`bo}1?I$Ahj&_eIuiRdCu;h5#2;MG_pm&oj?(VHrauaSxP45`hx$h3P@~#E-ov>2* z0heG=Xtt&+!V*gtf@W zWV#^6$6*{%*K%rjtX6qb^8s^w3$(nkm#e(p6PMS-*MRMcjTiV0vJ{tbX)pR&sW@z6Z2}YtWz(Mx$D;vA5E3Vwo zr`6h6>#hzvw69%ibOWcwhC)oGalA7T#=Y0XN}pY! z%GZGWWwyn-P8@;H6IHHXd4DP_9CgZ+*yi^pAoTeJl>z0Uj%I$2b<4O#!Xy zQ=Qh@M=}vE{OufmzIHP!?T>GcSGq)f4Egd1&LX`&zn$kj6LXfDWe#0vW97n5hF73@R2R>p1f zu3QF-T3W%stble;-D^*}CcU2ch&*@fSmd}&^Swya62jiUGpC5U)CWV;aE4RMYQY6N zF)?DbtGR`NQ8nlxmL4zlXo7$z*VM72_p@<3ql>I9t%Ucb&Tisee;!NG`q6LMw&Nll z$`qJs85}=CBW{X+_{wEhAw6tvY>-xo6>{FcW^Ue^rJ?b59-p>mhZ$g6w)o~BP-Smv zyae6dSaM>Q$M*OBC!<(Zi z1iB8zlV72D0a%_wL@zf5mS&;#AVzJ`ef2Px_qA!+9i7V)+jlJVz^R|Q{PRuXuE9&* z2pFpLaID}fSSvsXQjoHzj`?|PxM#UnzVG%#tRDoNY`_y0^~|j_HF|Zc23VAXL8QpV z)jxGeji|oW6vGxwh~v`+^Ba#7h652hzWfK?(c7aobUEta_DJ&(n#*r3X2H}+yW&AV zDrU@RJ#(kq1&c6U;I{j6QZEp16rYw!e`E?o8TeNs4(1N^XvA=@vG2dFoUQ9o#n5wh zbr0V}KHGp4P{uWYtcAxBE3vZi;h1VH_^w2W4rkR+0-Sc2*?Vb?{8p<R*US zg6muJYHSm5KBl(NpSAi4H$VJF(!aWF5codj=iRQ;mz?C}}nmIMkm9Y>Dr*LYP$NALNKsawHPZ`*7v$XQ zRkh7ob4}_GLzoF7`XbE1WV#YLZ-V+c4jdO-i@UC95%XG}6}4WvfLZ48yS%uSY8jsB zo0RPi@ejB+#pksF-JD>xx~hDLQhN5`oR-sJ+Q2i!lQ4KmZ!pQ_Y2da$rSNX@3rz2a zCS6{IxU+wx9nN!s?cOVr4vjVxye^&@9Lb{=UwVH+qtM3BDr(P=nhE^+*_9QLpW_m) zg*S%Oi8>Lh)$VS3CNFY2;=Ed_Rqsw&KJu-7IbZbL?aOz3*^}wD)W99E-GwN;Nxs`_ zE2Z;fSe^ZB2S@@S*9O;0IM%J?hSl(MC-lHCU!fK6tTU7gHgaFjTh!iov^H&JK{B}tF3mFWr~olcrNx(l0`Xnct+iL*YXBiF zx@$nzR&_syK`t%~3NuL@p4+-xwizsoKUQ0Ae86l_EI|51`Ndd}q|?z8RN!3gpN6If z+^A|B4=Kr9V4e6{Le_Zxe51JrCEI#SzwA`bWnNWMpTVEOeh;d*hgNarc3eYyo$AOt zJr;^EU9y%2-G=u=XjM9!ahZ5aK1UXD$=IX*4es3MrKOuUTdD_#FfmveSD5jC-VHd% zKt7HVB;`uI9O|(AMw!;Es~+v2i_|+49o&kNMqqb%Y! z8j5~w8CpdE|8UkPek=Z0;eo1@Qn1r=2BfA}wx6aBLqZ$0s5(fWO4v`w_2<6rhFM5 z#!~;5`tI>(Q*mRC6|9fM2Rd>LnVi!HgjG-y1MF zH??s8QD^=7Cx5M_(z2J2Mr6C8VmOy^H4cJV8&)UW&H;jFSFR2?OYomjre+-S@qn&X zzMEr>G=D)x@p*3BU)6b`p|?!=RjOF(ThZIi-@8s=6#LGMSubiQgj_|IjH7g3we*?x zx5*>tp6x3iy#n?;;!o3al6Cl+GG!%nZq{nmgD}>_U9th**;Hk3h@=uGPnqZK^r@p4d)hkZAfRBo^cbz)IZ44JHliG*~ zvMt!9o&{-xam}aYqOyZO2^rYD{@1}}$MQWPlo37ZE5yON6p!Gi_>WO+^X~A9?@5LQbm=kbk($#G?nshG&Bw zjc$-Z_gvkCygTN-RJZ?z-2R4A zAI%X(T5AOZBxjrhJCSg=amuY%7rLr5XD)AmP;M)TS)4071&Kq1q_3JCylU&EKBi4y zn=1>rg^O@o8J^$R+OlCz4lJ3~uxEFej|*S}3_~7oGXlHzO27ugs(>Noww~>g^f{d2 zn2f$+Vnc$g75w9#){)NsWptg+HQ+YKi<(ADq(!qY$KTZFR{s0a$3NnV<9?ogY^&6F zNo-|A{nZtIh3rJld+?Jmk-Vm5U2lS3ac&_P&rVCRUB^CboGI^7wM zW^(t~WQFh6Q>XN>yg7AAn=ALe2CxuZ3%5d8QW4z&T*K|boOTQ%LQju4s`^#DJq&YMgqr#+W6{I0Q0ouXi>CkXKu{b7xxb~sx5GT(Q{YUhi43u&44$JsD;k1|%c zi8tb?tomxAsUXuov-=i|FB}FQ{BW|&?ersEMODOkC2GesuqIIBvf$yqYrZScCm~^v z9$6~djsj-o?)fyy=Btc3TNro%pB;}5hRtzp{%9zSDq5`KH7jb$4!#Bu?n3laQ5jUO xHYBghc2BR0pdfpRr>`sfHC6#W3C={}hAyB`k*AAeNX4AD2N`*Ryh97V`{(kr eivXFl0_WKZjx#XEGmGhgZ18mTb6Mw<&;$U*4kA?m literal 0 HcmV?d00001 diff --git a/doc/sample.gp b/doc/sample.gp new file mode 100644 index 000000000..b46ef782b --- /dev/null +++ b/doc/sample.gp @@ -0,0 +1,8 @@ +set title "May 3, 2006 16:24:04" +set xlabel "Ride Time (minutes)" +plot \ + "< awk '/^[^#]/ {print $1, $4}' 2006_05_03_16_24_04.dat | ./smooth.pl 10" ti 'Watts' wi li, \ + "< awk '/^[^#]/ {print $1, $7}' 2006_05_03_16_24_04.dat | ./smooth.pl 10" ti 'Heartrate' wi li, \ + "< awk '/^[^#]/ {print $1, $6}' 2006_05_03_16_24_04.dat | ./smooth.pl 10" ti 'Cadence' wi li, \ + "< awk '/^[^#]/ {print $1, $3}' 2006_05_03_16_24_04.dat | ./smooth.pl 10" ti 'MPH' wi li +pause -1 diff --git a/doc/sample.png b/doc/sample.png new file mode 100644 index 0000000000000000000000000000000000000000..98209d69b73f35ed27988b7554476b588f0ae6e2 GIT binary patch literal 19286 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 LNkvXXu0mjfuKV6& literal 0 HcmV?d00001 diff --git a/doc/search.content b/doc/search.content new file mode 100644 index 000000000..d9222a2f9 --- /dev/null +++ b/doc/search.content @@ -0,0 +1,42 @@ + + +
+ +
+ + + +
+ +Google +
+ + + +
+ + + + + +
+ +Web + + +goldencheetah.org +
+ + + + + + + +
+
+ +
+ diff --git a/doc/users-guide.content b/doc/users-guide.content new file mode 100644 index 000000000..dab33ad4f --- /dev/null +++ b/doc/users-guide.content @@ -0,0 +1,222 @@ + +Currently, Golden Cheetah consists of several command line utilities: +ptdl, which downloads ride data from a PowerTap Pro version 2.21 +cycling computer, ptunpk, which unpacks the raw bytes downloaded +by ptdl and outputs more human-friendly ride information, and +cpint, which computes your critical power (see below). All three +are written in simple C code but have only been tested on Mac OS X so far. +We've also written several Perl scripts to help you graph and summarize the +data. + +

+ +Extracting the Data + +

+To use ptdl, you'll first need to install +the drivers for the +FTDI chip the PowerTap Pro USB Downloader uses. Once these are installed, you +should be able to just run ptdl without arguments: + +

+$ ./ptdl 
+Reading from /dev/tty.usbserial-3B1.
+Reading version information...done.
+Reading ride time...done.
+Writing to 2006_05_15_11_34_03.raw.
+Reading ride data..............done.
+$ head -5 2006_05_15_11_34_03.raw
+57 56 55 64 02 15
+60 06 05 0f 6b 22
+40 08 30 00 00 00
+86 0e 74 99 00 55
+81 06 77 a8 40 55
+
+ +

+If everything goes well, ptdl will automatically detect the +device (/dev/tty.usbserial-3B1 in the example above), read the +ride data from it, and write to a file named by the date and time at which the +ride started (2006_05_15_11_34_03.raw in the example; the format +is YYYY_MM_DD_hh_mm_ss.raw). + +

+ +Unpacking the Data + +

As shown by the head command above, the data in this +.raw file is just the raw bytes that represent your ride. To +unpack those bytes and display them in a more human-friendly format, use +ptunpk: + +

+$ ./ptunpk 2006_05_15_11_34_03.raw
+$ head -5 2006_05_15_11_34_03.dat 
+# Time Torq MPH Watts Miles Cad HR Int
+# 2006/5/15 11:34:03 1147707243
+# wheel size=2096 mm, interval=0, rec int=1
+0.021 13.1 2.450 43 0.00781 0 85 0
+0.042 13.4 5.374 97 0.00912 64 85 0
+
+ +ptunpk takes a .raw file for input and writes a +.dat file as output. Lines that start with an ampersand ("#") in +this file are comments; the other lines represent measured samples. As shown +by the first comment in the file, the columns are: time in minutes, torque in +Newton-meters, speed in miles per hour, power in watts, distance in miles, +cadence, heart rate, and interval number. + +

+ +Summarizing the Data + +

+We hope to have a graphical interface to these programs soon, but until then, +the only summarization tools we have are command-line programs. The script +intervals.pl summarizes the intervals performed in a workout: + + +

+$ ./intervals.pl 2006_05_03_16_24_04.dat 
+                        Power           Heart Rate      Cadence         Speed
+Int      Dur    Dist     Avg     Max    Avg     Max     Avg     Max     Avg     Max
+ 0      77:10    19.3    213     693    134     167      82     141     16.0    27.8
+ 1       4:03     0.9    433     728    175     203      84     122     13.0    18.8
+ 2       7:23     1.0     86     502    135     179      71     141     16.0    28.2
+ 3       4:27     0.9    390     628    170     181      70     100     12.0    17.6
+ 4       8:04     0.9     60     203    130     178      50     120     18.0    30.1
+ 5       4:30     0.9    384     682    170     179      79     113     11.0    18.6
+ 6       8:51     1.1     53     245    125     176      70     141     8.0     26.6
+ 7       2:48     0.4    400     614    164     178      62      91     8.0     13.6
+ 8       7:01     1.1     46     268    128     170      71     141     12.0    28.8
+ 9       4:30     0.9    379     560    168     180      81     170     11.0    18.3
+10      28:46     6.5    120     409    128     179      79     141     15.0    31.0
+
+ + +

+In the example above, a rider performed five hill intervals, four of which +climbed a medium size hill that took about 4-5 minutes to climb (intervals +1, 3, 5, and 9), and one on a shorter hill that took just under 3 minutes to +climb (interval 7). + +

+ +Graphing the Data + +

+For graphing the data in the ride, we use smooth.pl and the +gnuplot program. You can use sample.gp +to graph the power, heart rate, cadence, and speed for the hill workout above: + +

+$ gnuplot sample.gp
+
+ +Sample Plot + +

+ +Finding Your "Critical Power" + +

+Joe Friel calls the maximum average power a rider can sustain over an interval +the rider's "critical power" for that duration. The cpint +program automatically computes your critical power over all interval lengths +using the data from all your past rides. This program looks at all the +.raw files in a directory, calculating your maximum power over +every subinterval length and storing them in a corresponding .cpi +file. It then combines the data in all of the .cpi files to find +your critical power over all subintervals of all your rides. + +

+$ ls *.raw
+2006_04_28_10_48_33.raw 2006_05_10_17_08_30.raw 2006_05_18_16_32_53.raw
+2006_05_03_16_24_04.raw 2006_05_13_10_29_12.raw 2006_05_21_12_25_07.raw
+2006_05_05_10_52_05.raw 2006_05_15_11_34_03.raw 2006_05_22_18_28_47.raw
+...
+2006_05_09_09_54_29.raw 2006_05_17_16_44_35.raw
+$ ./cpint 
+Compiling data for ride on Fri Apr 28 10:48:33 2006...done.
+Compiling data for ride on Sat Apr 29 10:07:48 2006...done.
+Compiling data for ride on Sun Apr 30 14:00:17 2006...done.
+ ...
+Compiling data for ride on Mon May 22 18:28:47 2006...done.
+ 0.021 1264
+ 0.042 1221
+ 0.063 1216
+ ...
+ 5.019 391
+ ...
+171.885 163
+
+ +

+Over this set of rides, the rider's maximum power is 1264 watts, achieved over +an interval of 0.021 minutes (1.26 seconds). Over all five-minute +subintervals, he has achieved a maximum average power of 391 watts. The +longest ride in this set was 171.885 minutes long, and he averaged 163 watts +over it. + +

+We can graph the output of cpint using gnuplot with +cpint.gp: + +

+$ ./cpint > cpint.out
+$ gnuplot cpint.gp
+
+ + + +

+The first time you run cpint it will take a while, as it has to +analyze all your past rides. On subsequent runs, however, it will only +analyze new files. + +

Training and Racing with a Power Meter (see the FAQ) contains a table of critical powers of Cat 5 cyclists +up through international pros at interval lengths of 5 seconds, 1 minute, 5 +minutes, and 60 minutes. Using this table and the cpint program, +you can determine whether you're stronger than others in your racing category +at each interval length and adapt your training program accordingly. + +

+ +Converting Old Data + + +

+If you've used the PowerTuned software that comes with the PowerTap you may +have lots of old ride data in that program that you'd like to include in your +critical power graph. You can convert the .xml files that +PowerTuned produces to .raw files using the ptpk +program: + +

+

+$ ./ptpk 2006_04_27_00_23_28.xml 
+$ head -5 2006_04_27_00_23_28.raw 
+57 56 55 64 02 15
+60 06 04 7b 80 17
+40 08 30 00 00 00
+84 04 00 24 00 ff
+83 03 00 d7 00 ff
+
+ +

+ptpk assumes the input .xml file was generated with +a wheel size of 2,096 mm and a recording interval of 1. If this is not the +case, you should specify the correct values with the -w and +-r options. + +

+Note that the PowerTuned software computes the output speed in miles per hour +by multiplying the measured speed in kilometers per hour by 0.62, and the +miles per hour values in a .xml file are thus only accurate to +two significant figures, even though they're printed out to three decimal +places. Because of this limitation, the sequence ptpk, +ptunpk is not quite the identity function; in particular, the +wattage values from ptpk may only be accurate to two significant +digits. + diff --git a/gui/AllPlot.cpp b/gui/AllPlot.cpp new file mode 100644 index 000000000..ddb3ce539 --- /dev/null +++ b/gui/AllPlot.cpp @@ -0,0 +1,176 @@ +/* + * $Id: AllPlot.cpp,v 1.2 2006/07/12 02:13:57 srhea Exp $ + * + * Copyright (c) 2006 Sean C. Rhea (srhea@srhea.net) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "AllPlot.h" +#include "RawFile.h" +#include "Settings.h" + +#include +#include +#include +#include + +static const inline double +max(double a, double b) { if (a > b) return a; else return b; } + +AllPlot::AllPlot() : + hrArray(NULL), wattsArray(NULL), timeArray(NULL), smooth(30) +{ + insertLegend(new QwtLegend(), QwtPlot::BottomLegend); + setCanvasBackground(Qt::white); + + setAxisTitle(xBottom, "Time (minutes)"); + setAxisTitle(yLeft, "Power / HR"); + + wattsCurve = new QwtPlotCurve("Power"); + wattsCurve->setRenderHint(QwtPlotItem::RenderAntialiased); + wattsCurve->setPen(QPen(Qt::red)); + wattsCurve->attach(this); + + hrCurve = new QwtPlotCurve("Heart Rate"); + hrCurve->setRenderHint(QwtPlotItem::RenderAntialiased); + hrCurve->setPen(QPen(Qt::blue)); + hrCurve->attach(this); + + grid = new QwtPlotGrid(); + grid->enableX(false); + QPen gridPen; + gridPen.setStyle(Qt::DotLine); + grid->setPen(gridPen); + grid->attach(this); +} + +struct DataPoint { + double time, hr, watts; + DataPoint(double t, double h, double w) : time(t), hr(h), watts(w) {} +}; + +void +AllPlot::recalc() +{ + int rideTimeSecs = (int) ceil(timeArray[arrayLength - 1]); + double ymax = 0.0; + double totalWatts = 0.0; + double totalHr = 0.0; + QList list; + int i = 0; + double *smoothWatts = new double[rideTimeSecs + 1]; + double *smoothHr = new double[rideTimeSecs + 1]; + double *smoothTime = new double[rideTimeSecs + 1]; + for (int secs = 0; secs < smooth; ++secs) { + smoothWatts[secs] = 0.0; + smoothHr[secs] = 0.0; + smoothTime[secs] = secs / 60.0; + } + for (int secs = smooth; secs <= rideTimeSecs; ++secs) { + while ((i < arrayLength) && (timeArray[i] <= secs)) { + DataPoint *dp = + new DataPoint(timeArray[i], hrArray[i], wattsArray[i]); + totalWatts += wattsArray[i]; + totalHr += hrArray[i]; + list.append(dp); + ++i; + } + while (!list.empty() && (list.front()->time < secs - smooth)) { + DataPoint *dp = list.front(); + list.removeFirst(); + totalWatts -= dp->watts; + totalHr -= dp->hr; + delete dp; + } + // TODO: this is wrong. We should do a weighted average over the + // seconds represented by each point... + if (list.empty()) { + smoothWatts[secs] = 0.0; + smoothHr[secs] = 0.0; + } + else { + smoothWatts[secs] = totalWatts / list.size(); + if (smoothWatts[secs] > ymax) + ymax = smoothWatts[secs]; + smoothHr[secs] = totalHr / list.size(); + if (smoothHr[secs] > ymax) + ymax = smoothHr[secs]; + } + smoothTime[secs] = secs / 60.0; + } + wattsCurve->setData(smoothTime, smoothWatts, rideTimeSecs + 1); + hrCurve->setData(smoothTime, smoothHr, rideTimeSecs + 1); + setAxisScale(xBottom, 0.0, smoothTime[rideTimeSecs]); + setAxisScale(yLeft, 0.0, ymax + 30); + replot(); + delete [] smoothWatts; + delete [] smoothHr; + delete [] smoothTime; +} + +void +AllPlot::setData(RawFile *raw) +{ + delete [] hrArray; + delete [] wattsArray; + delete [] timeArray; + setTitle(raw->startTime.toString(GC_DATETIME_FORMAT)); + hrArray = new double[raw->points.size()]; + wattsArray = new double[raw->points.size()]; + timeArray = new double[raw->points.size()]; + arrayLength = 0; + QListIterator i(raw->points); + while (i.hasNext()) { + RawFilePoint *point = i.next(); + timeArray[arrayLength] = point->secs; + hrArray[arrayLength] = max(0, point->hr); + wattsArray[arrayLength] = max(0, point->watts); + ++arrayLength; + } + recalc(); +} + +void +AllPlot::showPower(int state) +{ + assert(state != Qt::PartiallyChecked); + wattsCurve->setVisible(state == Qt::Checked); + replot(); +} + +void +AllPlot::showHr(int state) +{ + assert(state != Qt::PartiallyChecked); + hrCurve->setVisible(state == Qt::Checked); + replot(); +} + +void +AllPlot::showGrid(int state) +{ + assert(state != Qt::PartiallyChecked); + grid->setVisible(state == Qt::Checked); + replot(); +} + +void +AllPlot::setSmoothing(int value) +{ + smooth = value; + recalc(); +} + diff --git a/gui/AllPlot.h b/gui/AllPlot.h new file mode 100644 index 000000000..831eb08e3 --- /dev/null +++ b/gui/AllPlot.h @@ -0,0 +1,67 @@ +/* + * $Id: AllPlot.h,v 1.2 2006/07/12 02:13:57 srhea Exp $ + * + * Copyright (c) 2006 Sean C. Rhea (srhea@srhea.net) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef _GC_AllPlot_h +#define _GC_AllPlot_h 1 + +#include + +class QwtPlotCurve; +class QwtPlotGrid; +class RawFile; + +class AllPlot : public QwtPlot +{ + Q_OBJECT + + public: + + QwtPlotCurve *wattsCurve; + QwtPlotCurve *hrCurve; + + AllPlot(); + + int smoothing() const { return smooth; } + + void setData(RawFile *raw); + + public slots: + + void showPower(int state); + void showHr(int state); + void showGrid(int state); + void setSmoothing(int value); + + protected: + + QwtPlotGrid *grid; + + double *hrArray; + double *wattsArray; + double *timeArray; + int arrayLength; + + int smooth; + + void recalc(); +}; + +#endif // _GC_AllPlot_h + diff --git a/gui/ChooseCyclistDialog.cpp b/gui/ChooseCyclistDialog.cpp new file mode 100644 index 000000000..194d32e1d --- /dev/null +++ b/gui/ChooseCyclistDialog.cpp @@ -0,0 +1,112 @@ +/* + * $Id: ChooseCyclistDialog.cpp,v 1.3 2006/07/04 12:55:40 srhea Exp $ + * + * Copyright (c) 2006 Sean C. Rhea (srhea@srhea.net) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "ChooseCyclistDialog.h" +#include + +ChooseCyclistDialog::ChooseCyclistDialog(const QDir &home, bool allowNew) : + home(home) +{ + setWindowTitle("Choose a Cyclist"); + + listWidget = new QListWidget(this); + listWidget->setSelectionMode(QAbstractItemView::SingleSelection); + + QStringListIterator i(home.entryList(QDir::Dirs | QDir::NoDotAndDotDot)); + while (i.hasNext()) { + QString name = i.next(); + new QListWidgetItem(name, listWidget); + } + + if (allowNew) + newButton = new QPushButton(tr("&New..."), this); + okButton = new QPushButton(tr("&Open"), this); + cancelButton = new QPushButton(tr("&Cancel"), this); + + okButton->setEnabled(false); + + connect(okButton, SIGNAL(clicked()), this, SLOT(accept())); + if (allowNew) + connect(newButton, SIGNAL(clicked()), this, SLOT(newClicked())); + connect(cancelButton, SIGNAL(clicked()), this, SLOT(cancelClicked())); + connect(listWidget, + SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), + this, SLOT(enableOk(QListWidgetItem*))); + connect(listWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), + this, SLOT(accept())); + + QHBoxLayout *buttonLayout = new QHBoxLayout; + buttonLayout->addWidget(okButton); + if (allowNew) + buttonLayout->addWidget(newButton); + buttonLayout->addWidget(cancelButton); + + QVBoxLayout *mainLayout = new QVBoxLayout(this); + mainLayout->addWidget(listWidget); + mainLayout->addLayout(buttonLayout); +} + +QString +ChooseCyclistDialog::choice() +{ + return listWidget->currentItem()->text(); +} + +void +ChooseCyclistDialog::enableOk(QListWidgetItem *item) +{ + okButton->setEnabled(item != NULL); +} + +void +ChooseCyclistDialog::cancelClicked() +{ + reject(); +} + +QString +ChooseCyclistDialog::newCyclistDialog(QDir &homeDir, QWidget *parent) +{ + QDir home(homeDir); + bool ok; + QString name = QInputDialog::getText(parent, tr("Create New Cyclist"), + tr("Enter New Cyclist's Name"), + QLineEdit::Normal, "", &ok); + if (ok && !name.isEmpty()) { + fprintf(stderr, "New name: %s\n", name.toAscii().data()); + if (!home.exists(name)) { + if (home.mkdir(name)) + return name; + QMessageBox::critical(0, tr("Fatal Error"), + tr("Can't create new directory ") + + home.path() + "/" + name, "OK"); + } + } + return QString(); +} + +void +ChooseCyclistDialog::newClicked() +{ + QString name = newCyclistDialog(home, this); + if (!name.isEmpty()) + new QListWidgetItem(name, listWidget); +} + diff --git a/gui/ChooseCyclistDialog.h b/gui/ChooseCyclistDialog.h new file mode 100644 index 000000000..900c0c1e9 --- /dev/null +++ b/gui/ChooseCyclistDialog.h @@ -0,0 +1,53 @@ +/* + * $Id: ChooseCyclistDialog.h,v 1.3 2006/07/04 12:55:40 srhea Exp $ + * + * Copyright (c) 2006 Sean C. Rhea (srhea@srhea.net) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef _GC_ChooseCyclistDialog_h +#define _GC_ChooseCyclistDialog_h 1 + +#include +#include + +class QListWidget; +class QListWidgetItem; +class QPushButton; + +class ChooseCyclistDialog : public QDialog +{ + Q_OBJECT + + public: + ChooseCyclistDialog(const QDir &home, bool allowNew); + QString choice(); + static QString newCyclistDialog(QDir &homeDir, QWidget *parent); + + private slots: + void newClicked(); + void cancelClicked(); + void enableOk(QListWidgetItem *item); + + private: + + QDir home; + QListWidget *listWidget; + QPushButton *okButton, *newButton, *cancelButton; +}; + +#endif // _GC_ChooseCyclistDialog_h + diff --git a/gui/DownloadRideDialog.cpp b/gui/DownloadRideDialog.cpp new file mode 100644 index 000000000..96640e131 --- /dev/null +++ b/gui/DownloadRideDialog.cpp @@ -0,0 +1,312 @@ +/* + * $Id: DownloadRideDialog.cpp,v 1.4 2006/08/11 20:02:13 srhea Exp $ + * + * Copyright (c) 2006 Sean C. Rhea (srhea@srhea.net) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "DownloadRideDialog.h" +#include "MainWindow.h" +#include +#include +#include + +#define MAX_DEVICES 10 + +DownloadRideDialog::DownloadRideDialog(MainWindow *mainWindow, + const QDir &home) : + mainWindow(mainWindow), home(home), fd(-1), out(NULL), device(NULL), + notifier(NULL), timer(NULL), blockCount(0) +{ + setAttribute(Qt::WA_DeleteOnClose); + setWindowTitle("Download Ride Data"); + + listWidget = new QListWidget(this); + listWidget->setSelectionMode(QAbstractItemView::SingleSelection); + + QLabel *availLabel = new QLabel(tr("Available devices:"), this); + QLabel *instructLabel = new QLabel(tr("Instructions:"), this); + label = new QLabel(this); + label->setIndent(10); + + downloadButton = new QPushButton(tr("&Download"), this); + rescanButton = new QPushButton(tr("&Rescan"), this); + cancelButton = new QPushButton(tr("&Cancel"), this); + + connect(downloadButton, SIGNAL(clicked()), this, SLOT(downloadClicked())); + connect(rescanButton, SIGNAL(clicked()), this, SLOT(scanDevices())); + connect(cancelButton, SIGNAL(clicked()), this, SLOT(cancelClicked())); + connect(listWidget, + SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), + this, SLOT(setReadyInstruct())); + connect(listWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), + this, SLOT(downloadClicked())); + + QHBoxLayout *buttonLayout = new QHBoxLayout; + buttonLayout->addWidget(downloadButton); + buttonLayout->addWidget(rescanButton); + buttonLayout->addWidget(cancelButton); + + QVBoxLayout *mainLayout = new QVBoxLayout(this); + mainLayout->addWidget(availLabel); + mainLayout->addWidget(listWidget); + mainLayout->addWidget(instructLabel); + mainLayout->addWidget(label); + mainLayout->addLayout(buttonLayout); + + scanDevices(); +} + +DownloadRideDialog::~DownloadRideDialog() +{ + if (device) + free(device); + if (fd >= 0) + ::close(fd); + if (out) + fclose(out); +} + +void +DownloadRideDialog::setReadyInstruct() +{ + label->setText(tr("Make sure the PowerTap unit is turned on,\n" + "and that the screen display says, \"Host\",\n" + "then click Download to begin downloading.")); +} + +void +DownloadRideDialog::scanDevices() +{ + listWidget->clear(); + char *devices[MAX_DEVICES]; + int devcnt = pt_find_device(devices, MAX_DEVICES); + for (int i = 0; i < devcnt; ++i) { + new QListWidgetItem(devices[i], listWidget); + free(devices[i]); + } + if (listWidget->count() == 1) { + listWidget->setCurrentRow(0); + setReadyInstruct(); + downloadButton->setEnabled(true); + downloadButton->setFocus(); + } + else { + downloadButton->setEnabled(false); + if (listWidget->count() > 1) { + label->setText(tr("Select the device from the above list from\n" + "which you would like to download a ride.")); + } + else { + label->setText(tr("No devices found. Make sure the PowerTap\n" + "unit is plugged into the computer's USB port,\n" + "then click \"Rescan\" to check again.")); + } + } +} + +static void +time_cb(struct tm *time, void *self) +{ + ((DownloadRideDialog*) self)->time_cb(time); +} + +static void +record_cb(unsigned char *buf, void *self) +{ + ((DownloadRideDialog*) self)->record_cb(buf); +} + +void +DownloadRideDialog::time_cb(struct tm *time) +{ + timer->stop(); + if (!out) { + if (!time) { + QMessageBox::critical(this, tr("Read error"), + tr("Can't find ride time")); + reject(); + } + sprintf(outname, "%04d_%02d_%02d_%02d_%02d_%02d.raw", + time->tm_year + 1900, time->tm_mon + 1, time->tm_mday, + time->tm_hour, time->tm_min, time->tm_sec); + assert(strlen(outname) == sizeof(outname) - 1); + label->setText(label->text() + tr("done.\nWriting to ") + + outname + "."); + std::string path = home.absolutePath().toStdString() + "/" + outname; + if ((out = fopen(path.c_str(), "r")) != NULL) { + if (QMessageBox::warning(this, + tr("Ride Already Downloaded"), + tr("This ride appears to have already ") + + tr("been downloaded. Do you want to ") + + tr("download it again and overwrite ") + + tr("the previous download?"), + tr("&Overwrite"), tr("&Cancel"), + QString(), 1, 1) == 1) { + reject(); + } + } + if ((out = fopen(path.c_str(), "w")) == NULL) { + QMessageBox::critical(this, tr("Write error"), + tr("Can't open ") + path.c_str() + + tr(" for writing: ") + strerror(errno)); + reject(); + } + label->setText(label->text() + tr("\nReading ride data...")); + } + timer->start(5000); +} + +void +DownloadRideDialog::record_cb(unsigned char *buf) +{ + timer->stop(); + if (!out) { + QMessageBox::critical(this, tr("Read error"), + tr("Can't find ride time.")); + reject(); + } + for (int i = 0; i < 6; ++i) + fprintf(out, "%02x%s", buf[i], (i == 5) ? "\n" : " "); + if ((++blockCount % 256) == 0) { + label->setText(label->text() + "."); + } + timer->start(5000); +} + +void +DownloadRideDialog::readVersion() +{ + if (notifier) + notifier->setEnabled(false); + int r = pt_read_version(&vstate, fd, hwecho); + if (r == PT_DONE) { + if (notifier) { + delete notifier; + notifier = NULL; + } + if (timer) { + delete timer; + timer = NULL; + } + label->setText(label->text() + tr("done.")); + ::close(fd); + fd = open(device, O_RDWR | O_NOCTTY); + if (fd < 0) { + QMessageBox::critical(this, tr("Read error"), + tr("Could not open device, ") + device + + + ": " + strerror(errno)); + reject(); + } + pt_make_async(fd); + label->setText(label->text() + tr("\nReading ride time...")); + memset(&dstate, 0, sizeof(dstate)); + readData(); + } + else { + assert(r == PT_NEED_READ); + if (notifier) + notifier->setEnabled(true); + else { + notifier = new QSocketNotifier(fd, QSocketNotifier::Read, this); + connect(notifier, SIGNAL(activated(int)), this, SLOT(readVersion())); + } + if (!timer) { + timer = new QTimer(this); + connect(timer, SIGNAL(timeout()), this, SLOT(versionTimeout())); + timer->start(5000); + } + } +} + +void +DownloadRideDialog::versionTimeout() +{ + timer->stop(); + label->setText(label->text() + tr("timeout.")); + QMessageBox::critical(this, tr("Read Error"), + tr("Timed out reading device ") + device + + tr(". Check that the device is plugged in and ") + + tr("try again.")); + reject(); +} + +void +DownloadRideDialog::readData() +{ + if (notifier) + notifier->setEnabled(false); + int r = pt_read_data(&dstate, fd, hwecho, ::time_cb, ::record_cb, this); + if (r == PT_DONE) { + if (notifier) { + delete notifier; + notifier = NULL; + } + if (timer) { + delete timer; + timer = NULL; + } + label->setText(label->text() + tr("done.")); + QMessageBox::information(this, tr("Success"), tr("Download complete.")); + fclose(out); + out = NULL; + mainWindow->addRide(outname); + accept(); + } + else { + assert(r == PT_NEED_READ); + if (notifier) + notifier->setEnabled(true); + else { + notifier = new QSocketNotifier(fd, QSocketNotifier::Read, this); + connect(notifier, SIGNAL(activated(int)), this, SLOT(readData())); + } + if (!timer) { + timer = new QTimer(this); + connect(timer, SIGNAL(timeout()), this, SLOT(versionTimeout())); + timer->start(5000); + } + } +} + +void +DownloadRideDialog::downloadClicked() +{ + downloadButton->setEnabled(false); + rescanButton->setEnabled(false); + if (device) + free(device); + device = strdup(listWidget->currentItem()->text().toAscii().data()); + hwecho = pt_hwecho(device); + fd = open(device, O_RDWR | O_NOCTTY); + if (fd < 0) { + QMessageBox::critical(this, tr("Read error"), + tr("Could not open device, ") + device + + + ": " + strerror(errno)); + reject(); + } + pt_make_async(fd); + label->setText(tr("Reading version information...")); + memset(&vstate, 0, sizeof(vstate)); + readVersion(); +} + +void +DownloadRideDialog::cancelClicked() +{ + reject(); +} + diff --git a/gui/DownloadRideDialog.h b/gui/DownloadRideDialog.h new file mode 100644 index 000000000..3b8d892a5 --- /dev/null +++ b/gui/DownloadRideDialog.h @@ -0,0 +1,72 @@ +/* + * $Id: DownloadRideDialog.h,v 1.4 2006/08/11 20:02:13 srhea Exp $ + * + * Copyright (c) 2006 Sean C. Rhea (srhea@srhea.net) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef _GC_DownloadRideDialog_h +#define _GC_DownloadRideDialog_h 1 + +#include +extern "C" { +#include "../pt.h" +} + +class MainWindow; + +class DownloadRideDialog : public QDialog +{ + Q_OBJECT + + public: + DownloadRideDialog(MainWindow *mainWindow, const QDir &home); + ~DownloadRideDialog(); + + void time_cb(struct tm *time); + void record_cb(unsigned char *buf); + + private slots: + void downloadClicked(); + void cancelClicked(); + void setReadyInstruct(); + void scanDevices(); + void readVersion(); + void readData(); + void versionTimeout(); + + private: + + MainWindow *mainWindow; + QDir home; + QListWidget *listWidget; + QPushButton *downloadButton, *rescanButton, *cancelButton; + QLabel *label; + int fd; + FILE *out; + char outname[24]; + + char *device; + struct pt_read_version_state vstate; + struct pt_read_data_state dstate; + QSocketNotifier *notifier; + QTimer *timer; + int blockCount; + int hwecho; +}; + +#endif // _GC_DownloadRideDialog_h + diff --git a/gui/GoldenCheetah.pro b/gui/GoldenCheetah.pro new file mode 100644 index 000000000..408976efc --- /dev/null +++ b/gui/GoldenCheetah.pro @@ -0,0 +1,30 @@ +###################################################################### +# Automatically generated by qmake (2.00a) Sun May 28 19:43:48 2006 +###################################################################### + +TEMPLATE = app +TARGET += +DEPENDPATH += . +INCLUDEPATH += ../qwt-20060130/include +CONFIG += static +OBJECTS += ../pt.o +LIBS += /usr/local/lib/libqwt.a +LIBS += -lz -framework Carbon + +# Input +HEADERS += \ + AllPlot.h \ + ChooseCyclistDialog.h \ + DownloadRideDialog.h \ + MainWindow.h \ + RawFile.h \ + RideItem.h +SOURCES += \ + AllPlot.cpp \ + ChooseCyclistDialog.cpp \ + DownloadRideDialog.cpp \ + MainWindow.cpp \ + RawFile.cpp \ + RideItem.cpp \ + \ + main.cpp diff --git a/gui/MainWindow.cpp b/gui/MainWindow.cpp new file mode 100644 index 000000000..0affa5e92 --- /dev/null +++ b/gui/MainWindow.cpp @@ -0,0 +1,279 @@ +/* + * $Id: MainWindow.cpp,v 1.7 2006/07/12 02:13:57 srhea Exp $ + * + * Copyright (c) 2006 Sean C. Rhea (srhea@srhea.net) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "MainWindow.h" +#include "AllPlot.h" +#include "ChooseCyclistDialog.h" +#include "DownloadRideDialog.h" +#include "RawFile.h" +#include "RideItem.h" +#include "Settings.h" +#include +#include +#include + +#define FOLDER_TYPE 0 +#define RIDE_TYPE 1 + +static char *rideFileRegExp = ("^(\\d\\d\\d\\d)_(\\d\\d)_(\\d\\d)" + "_(\\d\\d)_(\\d\\d)_(\\d\\d)\\.raw$"); + +MainWindow::MainWindow(const QDir &home) : + home(home), settings(GC_SETTINGS_CO, GC_SETTINGS_APP) +{ + setWindowTitle(home.dirName()); + settings.setValue(GC_SETTINGS_LAST, home.dirName()); + + QVariant geom = settings.value(GC_SETTINGS_MAIN_GEOM); + if (geom == QVariant()) + resize(640, 480); + else + setGeometry(geom.toRect()); + + splitter = new QSplitter(this); + setCentralWidget(splitter); + + treeWidget = new QTreeWidget; + treeWidget->setColumnCount(3); + treeWidget->setSelectionMode(QAbstractItemView::SingleSelection); + // TODO: + // treeWidget->header()->resizeSection(0,80); + treeWidget->header()->hide(); + + allRides = new QTreeWidgetItem(treeWidget, FOLDER_TYPE); + allRides->setText(0, tr("All Rides")); + treeWidget->expandItem(allRides); + splitter->addWidget(treeWidget); + + QRegExp rx(rideFileRegExp); + QStringList filters; + filters << "*.raw"; + QTreeWidgetItem *last = NULL; + QStringListIterator i(home.entryList(filters, QDir::Files)); + while (i.hasNext()) { + QString name = i.next(); + if (rx.exactMatch(name)) { + assert(rx.numCaptures() == 6); + QDate date(rx.cap(1).toInt(), rx.cap(2).toInt(),rx.cap(3).toInt()); + QTime time(rx.cap(4).toInt(), rx.cap(5).toInt(),rx.cap(6).toInt()); + QDateTime dt(date, time); + last = new RideItem(allRides, RIDE_TYPE, home.path(), name, dt); + } + } + + tabWidget = new QTabWidget; + rideSummary = new QTextEdit; + rideSummary->setReadOnly(true); + tabWidget->addTab(rideSummary, "Ride Summary"); + + QWidget *window = new QWidget; + QVBoxLayout *vlayout = new QVBoxLayout; + + QHBoxLayout *showLayout = new QHBoxLayout; + QLabel *showLabel = new QLabel("Show:", this); + showLayout->addWidget(showLabel); + + QCheckBox *showGrid = new QCheckBox("Grid", this); + showGrid->setCheckState(Qt::Checked); + showLayout->addWidget(showGrid); + + QCheckBox *showPower = new QCheckBox("Power", this); + showPower->setCheckState(Qt::Checked); + showLayout->addWidget(showPower); + + QCheckBox *showHr = new QCheckBox("Heart Rate", this); + showHr->setCheckState(Qt::Checked); + showLayout->addWidget(showHr); + + QHBoxLayout *smoothLayout = new QHBoxLayout; + QLabel *smoothLabel = new QLabel(tr("Smoothing (secs)"), this); + smoothLineEdit = new QLineEdit(this); + smoothLineEdit->setFixedWidth(30); + + smoothLayout->addWidget(smoothLabel); + smoothLayout->addWidget(smoothLineEdit); + smoothSlider = new QSlider(Qt::Horizontal); + smoothSlider->setTickPosition(QSlider::TicksBelow); + smoothSlider->setTickInterval(1); + smoothSlider->setMinimum(2); + smoothSlider->setMaximum(60); + smoothLineEdit->setValidator(new QIntValidator(smoothSlider->minimum(), + smoothSlider->maximum(), + smoothLineEdit)); + smoothLayout->addWidget(smoothSlider); + allPlot = new AllPlot; + smoothSlider->setValue(allPlot->smoothing()); + smoothLineEdit->setText(QString("%1").arg(allPlot->smoothing())); + vlayout->addWidget(allPlot); + vlayout->addLayout(showLayout); + vlayout->addLayout(smoothLayout); + window->setLayout(vlayout); + window->show(); + + tabWidget->addTab(window, "All-in-One Graph"); + splitter->addWidget(tabWidget); + + QVariant splitterSizes = settings.value(GC_SETTINGS_SPLITTER_SIZES); + if (splitterSizes != QVariant()) + splitter->restoreState(splitterSizes.toByteArray()); + else { + QList sizes; + sizes.append(250); + sizes.append(390); + splitter->setSizes(sizes); + } + + connect(treeWidget, SIGNAL(itemSelectionChanged()), + this, SLOT(rideSelected())); + connect(splitter, SIGNAL(splitterMoved(int,int)), + this, SLOT(splitterMoved())); + connect(showPower, SIGNAL(stateChanged(int)), + allPlot, SLOT(showPower(int))); + connect(showHr, SIGNAL(stateChanged(int)), + allPlot, SLOT(showHr(int))); + connect(showGrid, SIGNAL(stateChanged(int)), + allPlot, SLOT(showGrid(int))); + connect(smoothSlider, SIGNAL(valueChanged(int)), + this, SLOT(setSmoothingFromSlider())); + connect(smoothLineEdit, SIGNAL(returnPressed()), + this, SLOT(setSmoothingFromLineEdit())); + + QMenu *fileMenu = new QMenu(tr("&File"), this); + fileMenu->addAction(tr("&New..."), this, + SLOT(newCyclist()), tr("Ctrl+N")); + fileMenu->addAction(tr("&Open..."), this, + SLOT(openCyclist()), tr("Ctrl+O")); + fileMenu->addAction(tr("&Download ride..."), this, + SLOT(downloadRide()), tr("Ctrl+D")); + + QMenuBar *menuBar = new QMenuBar(this); + menuBar->addMenu(fileMenu); + + if (last != NULL) { + treeWidget->setCurrentItem(last); + rideSelected(); + } +} + +void +MainWindow::addRide(QString name) +{ + QRegExp rx(rideFileRegExp); + if (!rx.exactMatch(name)) + assert(false); + assert(rx.numCaptures() == 6); + QDate date(rx.cap(1).toInt(), rx.cap(2).toInt(),rx.cap(3).toInt()); + QTime time(rx.cap(4).toInt(), rx.cap(5).toInt(),rx.cap(6).toInt()); + QDateTime dt(date, time); + RideItem *last = new RideItem(allRides, RIDE_TYPE, home.path(), name, dt); + treeWidget->setCurrentItem(last); +} + +void +MainWindow::newCyclist() +{ + QDir newHome = home; + newHome.cdUp(); + QString name = ChooseCyclistDialog::newCyclistDialog(newHome, this); + if (!name.isEmpty()) { + newHome.cd(name); + if (!newHome.exists()) + assert(false); + MainWindow *main = new MainWindow(newHome); + main->show(); + } +} + +void +MainWindow::openCyclist() +{ + QDir newHome = home; + newHome.cdUp(); + ChooseCyclistDialog d(newHome, false); + d.setModal(true); + if (d.exec() == QDialog::Accepted) { + newHome.cd(d.choice()); + if (!newHome.exists()) + assert(false); + MainWindow *main = new MainWindow(newHome); + main->show(); + } +} + +void +MainWindow::downloadRide() +{ + (new DownloadRideDialog(this, home))->show(); +} + +void +MainWindow::rideSelected() +{ + assert(treeWidget->selectedItems().size() <= 1); + if (treeWidget->selectedItems().size() == 1) { + QTreeWidgetItem *which = treeWidget->selectedItems().first(); + if (which->type() == RIDE_TYPE) { + RideItem *ride = (RideItem*) which; + rideSummary->setHtml(ride->htmlSummary()); + rideSummary->setAlignment(Qt::AlignCenter); + allPlot->setData(ride->raw); + return; + } + } + rideSummary->clear(); +} + +void +MainWindow::resizeEvent(QResizeEvent*) +{ + settings.setValue(GC_SETTINGS_MAIN_GEOM, geometry()); +} + +void +MainWindow::moveEvent(QMoveEvent*) +{ + settings.setValue(GC_SETTINGS_MAIN_GEOM, geometry()); +} + +void +MainWindow::splitterMoved() +{ + settings.setValue(GC_SETTINGS_SPLITTER_SIZES, splitter->saveState()); +} + +void +MainWindow::setSmoothingFromSlider() +{ + if (allPlot->smoothing() != smoothSlider->value()) { + allPlot->setSmoothing(smoothSlider->value()); + smoothLineEdit->setText(QString("%1").arg(allPlot->smoothing())); + } +} + +void +MainWindow::setSmoothingFromLineEdit() +{ + int value = smoothLineEdit->text().toInt(); + if (value != allPlot->smoothing()) { + allPlot->setSmoothing(value); + smoothSlider->setValue(value); + } +} + diff --git a/gui/MainWindow.h b/gui/MainWindow.h new file mode 100644 index 000000000..d408f7cb7 --- /dev/null +++ b/gui/MainWindow.h @@ -0,0 +1,66 @@ +/* + * $Id: MainWindow.h,v 1.6 2006/07/11 21:20:21 srhea Exp $ + * + * Copyright (c) 2006 Sean C. Rhea (srhea@srhea.net) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef _GC_MainWindow_h +#define _GC_MainWindow_h 1 + +#include +#include + +class AllPlot; + +class MainWindow : public QMainWindow +{ + Q_OBJECT + + public: + MainWindow(const QDir &home); + void addRide(QString name); + + protected: + virtual void resizeEvent(QResizeEvent*); + virtual void moveEvent(QMoveEvent*); + + private slots: + void rideSelected(); + void splitterMoved(); + void newCyclist(); + void openCyclist(); + void downloadRide(); + void setSmoothingFromSlider(); + void setSmoothingFromLineEdit(); + + private: + + QDir home; + QSettings settings; + + QSplitter *splitter; + QTreeWidget *treeWidget; + QTabWidget *tabWidget; + QTextEdit *rideSummary; + AllPlot *allPlot; + QSlider *smoothSlider; + QLineEdit *smoothLineEdit; + QTreeWidgetItem *allRides; +}; + +#endif // _GC_MainWindow_h + diff --git a/gui/RawFile.cpp b/gui/RawFile.cpp new file mode 100644 index 000000000..b03d077ad --- /dev/null +++ b/gui/RawFile.cpp @@ -0,0 +1,100 @@ +/* + * $Id: RawFile.cpp,v 1.2 2006/08/11 19:58:07 srhea Exp $ + * + * Copyright (c) 2006 Sean C. Rhea (srhea@srhea.net) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "RawFile.h" +#include +extern "C" { +#include "../pt.h" +} + +struct RawFileReadState +{ + QList &points; + QStringList &errors; + double last_secs, last_miles; + unsigned last_interval; + time_t start_since_epoch; + unsigned rec_int; + RawFileReadState(QList &points, QStringList &errors) : + points(points), errors(errors), last_secs(0.0), last_miles(0.0), + last_interval(0), start_since_epoch(0), rec_int(0) {} +}; + +static void +config_cb(unsigned /*interval*/, unsigned rec_int, + unsigned /*wheel_sz_mm*/, void *context) +{ + RawFileReadState *state = (RawFileReadState*) context; + // Assume once set, rec_int should never change. + assert((state->rec_int == 0) || (state->rec_int == rec_int)); + state->rec_int = rec_int; +} + +static void +time_cb(struct tm *, time_t since_epoch, void *context) +{ + RawFileReadState *state = (RawFileReadState*) context; + if (state->start_since_epoch == 0) + state->start_since_epoch = since_epoch; + double secs = since_epoch - state->start_since_epoch; + RawFilePoint *point = new RawFilePoint(secs, -1.0, -1.0, -1.0, + state->last_miles, 0, 0, + state->last_interval); + state->points.append(point); + state->last_secs = secs; +} + +static void +data_cb(double secs, double nm, double mph, double watts, double miles, + unsigned cad, unsigned hr, unsigned interval, void *context) +{ + RawFileReadState *state = (RawFileReadState*) context; + RawFilePoint *point = new RawFilePoint(secs, nm, mph, watts, miles, + cad, hr, interval); + state->points.append(point); + state->last_secs = secs; + state->last_miles = miles; + state->last_interval = interval; +} + +static void +error_cb(const char *msg, void *context) +{ + RawFileReadState *state = (RawFileReadState*) context; + state->errors.append(QString(msg)); +} + +RawFile *RawFile::readFile(const QFile &file, QStringList &errors) +{ + RawFile *result = new RawFile(file.fileName()); + if (!result->file.open(QIODevice::ReadOnly)) { + delete result; + return NULL; + } + FILE *f = fdopen(result->file.handle(), "r"); + assert(f); + RawFileReadState state(result->points, errors); + pt_read_raw(f, 0 /* not compat */, &state, config_cb, + time_cb, data_cb, error_cb); + result->rec_int = state.rec_int; + return result; +} + + diff --git a/gui/RawFile.h b/gui/RawFile.h new file mode 100644 index 000000000..7d7fa821e --- /dev/null +++ b/gui/RawFile.h @@ -0,0 +1,58 @@ +/* + * $Id: RawFile.h,v 1.3 2006/08/11 19:58:07 srhea Exp $ + * + * Copyright (c) 2006 Sean C. Rhea (srhea@srhea.net) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef _GC_RawFile_h +#define _GC_RawFile_h 1 + +#include +#include +#include +#include + +struct RawFilePoint +{ + double secs, nm, mph, watts, miles; + unsigned cad, hr, interval; + RawFilePoint(double secs, double nm, double mph, double watts, + double miles, unsigned cad, unsigned hr, unsigned interval) : + secs(secs), nm(nm), mph(mph), watts(watts), miles(miles), + cad(cad), hr(hr), interval(interval) {} +}; + +class RawFile +{ + private: + + QFile file; + + RawFile(QString fileName) { + file.setFileName(fileName); + } + + public: + + QDateTime startTime; + int rec_int; + QList points; + static RawFile *readFile(const QFile &file, QStringList &errors); +}; + +#endif // _GC_RawFile_h + diff --git a/gui/RideItem.cpp b/gui/RideItem.cpp new file mode 100644 index 000000000..530676153 --- /dev/null +++ b/gui/RideItem.cpp @@ -0,0 +1,138 @@ +/* + * $Id: RideItem.cpp,v 1.3 2006/07/09 15:30:34 srhea Exp $ + * + * Copyright (c) 2006 Sean C. Rhea (srhea@srhea.net) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "RideItem.h" +#include "RawFile.h" +#include "Settings.h" +#include + +static QString +time_to_string(double secs) { + QString result; + unsigned rounded = (unsigned) round(secs); + bool needs_colon = false; + if (rounded >= 3600) { + result += QString("%1").arg(rounded / 3600); + rounded %= 3600; + needs_colon = true; + } + if (needs_colon || rounded >= 60) { + if (needs_colon) + result += ":"; + result += QString("%1").arg(rounded / 60, 2, 10, QLatin1Char('0')); + rounded %= 60; + needs_colon = true; + } + if (needs_colon) + result += ":"; + result += QString("%1").arg(rounded, 2, 10, QLatin1Char('0')); + return result; +} + +RideItem::RideItem(QTreeWidgetItem *parent, int type, QString path, + QString fileName, const QDateTime &dateTime) : + QTreeWidgetItem(parent, type), path(path), + fileName(fileName), dateTime(dateTime) +{ + setText(0, dateTime.toString("ddd")); + setText(1, dateTime.toString("MMM d, yyyy")); + setText(2, dateTime.toString("h:mm AP")); + setTextAlignment(1, Qt::AlignRight); + setTextAlignment(2, Qt::AlignRight); +} + +QString +RideItem::htmlSummary() +{ + if (summary.isEmpty()) { + QFile file(path + "/" + fileName); + QStringList errors; + raw = RawFile::readFile(file, errors); + summary = ("

" + + dateTime.toString("dddd MMMM d, yyyy, h:mm AP") + + "

"); + if (raw == NULL) { + summary += "

Error: Can't read file."; + } + else if (errors.empty()) { + double secs_moving = 0.0; + double total_watts = 0.0; + double secs_watts = 0.0; + double secs_hr = 0.0; + double total_hr = 0.0; + double secs_cad = 0.0; + double total_cad = 0.0; + double last_secs = 0.0; + QListIterator i(raw->points); + while (i.hasNext()) { + RawFilePoint *point = i.next(); + double secs_delta = point->secs - last_secs; + if (point->mph > 0.0) + secs_moving += secs_delta; + if (point->watts >= 0.0) { + total_watts += point->watts * secs_delta; + secs_watts += secs_delta; + } + if (point->hr > 0) { + total_hr += point->hr * secs_delta; + secs_hr += secs_delta; + } + if (point->cad > 0) { + total_cad += point->cad * secs_delta; + secs_cad += secs_delta; + } + last_secs = point->secs; + } + summary += "
"; + summary += ""; + summary += QString("" + "") + .arg(raw->points.back()->miles, 0, 'f', 1); + summary += QString("" + "") + .arg(raw->points.back()->miles / secs_moving * 3600.0, + 0, 'f', 1); + summary += QString("" + "") + .arg((unsigned) round(total_watts / secs_watts)); + summary +=QString("" + "") + .arg((unsigned) round(total_hr / secs_hr)); + summary += QString("" + "") + .arg((unsigned) round(total_cad / secs_cad)); + summary += "
Total workout time:" + + time_to_string(raw->points.back()->secs); + summary += "
Total time riding:" + + time_to_string(secs_moving) + "
Total distance:%1
Average speed:%1
Average power:%1
Average heart rate:%1
Average cadence:%1
"; + } + else { + summary += "
Errors reading file:

    "; + QStringListIterator i(errors); + while(i.hasNext()) + summary += "
  • " + i.next(); + summary += "
"; + } + } + return summary; +} + + diff --git a/gui/RideItem.h b/gui/RideItem.h new file mode 100644 index 000000000..58fb8d0ee --- /dev/null +++ b/gui/RideItem.h @@ -0,0 +1,42 @@ +/* + * $Id: RideItem.h,v 1.2 2006/07/04 12:55:40 srhea Exp $ + * + * Copyright (c) 2006 Sean C. Rhea (srhea@srhea.net) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef _GC_RideItem_h +#define _GC_RideItem_h 1 + +#include + +class RawFile; + +struct RideItem : public QTreeWidgetItem { + QString path; + QString fileName; + QDateTime dateTime; + QString summary; + RawFile *raw; + + RideItem(QTreeWidgetItem *parent, int type, QString path, + QString fileName, const QDateTime &dateTime); + + QString htmlSummary(); +}; + +#endif // _GC_RideItem_h + diff --git a/gui/Settings.h b/gui/Settings.h new file mode 100644 index 000000000..5c317df11 --- /dev/null +++ b/gui/Settings.h @@ -0,0 +1,36 @@ +/* + * $Id: Settings.h,v 1.2 2006/07/04 12:55:40 srhea Exp $ + * + * Copyright (c) 2006 Sean C. Rhea (srhea@srhea.net) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef _GC_Settings_h +#define _GC_Settings_h 1 + +#define GC_SETTINGS_CO "goldencheetah.org" +#define GC_SETTINGS_APP "GoldenCheetah" +#define GC_SETTINGS_LAST "mainwindow/lastOpened" +#define GC_SETTINGS_MAIN_WIDTH "mainwindow/width" +#define GC_SETTINGS_MAIN_HEIGHT "mainwindow/height" +#define GC_SETTINGS_MAIN_X "mainwindow/x" +#define GC_SETTINGS_MAIN_Y "mainwindow/y" +#define GC_SETTINGS_MAIN_GEOM "mainwindow/geometry" +#define GC_SETTINGS_SPLITTER_SIZES "mainwindow/splitterSizes" +#define GC_DATETIME_FORMAT "ddd MMM dd, yyyy, hh:mm AP" + +#endif // _GC_Settings_h + diff --git a/gui/TODO b/gui/TODO new file mode 100644 index 000000000..7163df4fa --- /dev/null +++ b/gui/TODO @@ -0,0 +1,10 @@ + + - Recalc y-max after changing showPower or showHr + - Add cadence, speed, torque to graph + - Remember last settings for showPower, showHr, etc. + - Add interval summary to ride summary + - Switch x-axis from minutes to miles + - Add units to ride summary + - Add weekly summary + - Add cpint + diff --git a/gui/addqt.sh b/gui/addqt.sh new file mode 100755 index 000000000..7b10a0294 --- /dev/null +++ b/gui/addqt.sh @@ -0,0 +1,13 @@ +#!/bin/sh +# $Id: addqt.sh,v 1.1 2006/08/11 20:01:16 srhea Exp $ +QT_PATH=/usr/local/Trolltech/Qt-4.1.1 +APP=GoldenCheetah +rm -rf $APP.app/Contents/Frameworks +mkdir -p $APP.app/Contents/Frameworks +cp -R $QT_PATH/lib/QtCore.framework $APP.app/Contents/Frameworks +cp -R $QT_PATH/lib/QtGui.framework $APP.app/Contents/Frameworks +install_name_tool -id @executable_path/../Frameworks/QtCore.framework/Versions/4.0/QtCore $APP.app/Contents/Frameworks/QtCore.framework/Versions/4.0/QtCore +install_name_tool -id @executable_path/../Frameworks/QtGui.framework/Versions/4.0/QtGui $APP.app/Contents/Frameworks/QtGui.framework/Versions/4.0/QtGui +install_name_tool -change $QT_PATH/lib/QtCore.framework/Versions/4.0/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/4.0/QtCore $APP.app/Contents/MacOs/$APP +install_name_tool -change $QT_PATH/lib/QtGui.framework/Versions/4.0/QtGui @executable_path/../Frameworks/QtGui.framework/Versions/4.0/QtGui $APP.app/Contents/MacOs/$APP +install_name_tool -change $QT_PATH/lib/QtCore.framework/Versions/4.0/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/4.0/QtCore $APP.app/Contents/Frameworks/QtGui.framework/Versions/4.0/QtGui diff --git a/gui/main.cpp b/gui/main.cpp new file mode 100644 index 000000000..1eac332f4 --- /dev/null +++ b/gui/main.cpp @@ -0,0 +1,69 @@ +/* + * $Id: main.cpp,v 1.3 2006/07/04 12:55:40 srhea Exp $ + * + * Copyright (c) 2006 Sean C. Rhea (srhea@srhea.net) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include "ChooseCyclistDialog.h" +#include "MainWindow.h" +#include "Settings.h" + +int +main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + QDir home = QDir::home(); + if (!home.exists("Library")) + assert(false); + home.cd("Library"); + if (!home.exists("GoldenCheetah")) + if (!home.mkdir("GoldenCheetah")) + assert(false); + home.cd("GoldenCheetah"); + QSettings settings(GC_SETTINGS_CO, GC_SETTINGS_APP); + QVariant lastOpened = settings.value(GC_SETTINGS_LAST); + bool anyOpened = false; + if (lastOpened != QVariant()) { + QStringList list = lastOpened.toStringList(); + QStringListIterator i(list); + while (i.hasNext()) { + QString cyclist = i.next(); + if (home.cd(cyclist)) { + MainWindow *main = new MainWindow(home); + main->show(); + home.cdUp(); + anyOpened = true; + } + } + } + if (!anyOpened) { + ChooseCyclistDialog d(home, true); + d.setModal(true); + if (d.exec() != QDialog::Accepted) + return 0; + home.cd(d.choice()); + if (!home.exists()) + assert(false); + MainWindow *main = new MainWindow(home); + main->show(); + } + return app.exec(); +} + + diff --git a/gui/mkdmg.sh b/gui/mkdmg.sh new file mode 100755 index 000000000..5e2062c51 --- /dev/null +++ b/gui/mkdmg.sh @@ -0,0 +1,17 @@ +#!/bin/sh +# $Id: mkdmg.sh,v 1.2 2006/09/06 23:23:03 srhea Exp $ +CMD_FILES="COPYING ptdl ptunpk intervals.pl smooth.pl cpint ptpk" +GUI_FILE="GoldenCheetah.app" +VERS=`date +'%Y-%m-%d'` +strip GoldenCheetah.app/Contents/MacOS/GoldenCheetah +rm -rf tmp.dmg +SIZE=`cd ..; du -csk $CMD_FILES gui/GoldenCheetah.app | grep total | awk '{printf "%.0fm", $1/1024+5}'` +echo "SIZE=$SIZE, VERS=$VERS" +hdiutil create -size $SIZE -fs HFS+ -volname "Golden Cheetah $VERS" tmp.dmg +hdiutil attach tmp.dmg +cp -R GoldenCheetah.app /Volumes/Golden\ Cheetah\ $VERS/ +cd .. && cp $CMD_FILES /Volumes/Golden\ Cheetah\ $VERS/ && cd - +hdiutil detach /Volumes/Golden\ Cheetah\ $VERS/ +hdiutil convert tmp.dmg -format UDZO -o GoldenCheetah_$VERS.dmg +hdiutil internet-enable -yes GoldenCheetah_$VERS.dmg +rm -rf tmp.dmg diff --git a/intervals.pl b/intervals.pl new file mode 100755 index 000000000..f61b28a7d --- /dev/null +++ b/intervals.pl @@ -0,0 +1,113 @@ +#!/usr/bin/perl -w +# +# $Id: intervals.pl,v 1.2 2006/08/11 19:53:50 srhea Exp $ +# +# Copyright (c) 2006 Sean C. Rhea (srhea@srhea.net) +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the Free +# Software Foundation; either version 2 of the License, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +# more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., 51 +# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# + +use strict; + +my $interval = -1; +my $time_start = 0; +my $time_end = 0; +my $mile_start = 0; +my $mile_end = 0; +my $watts_max = 0; +my $watts_sum = 0; +my $watts_cnt = 0; +my $hrate_max = 0; +my $hrate_sum = 0; +my $hrate_cnt = 0; +my $caden_max = 0; +my $caden_sum = 0; +my $caden_cnt = 0; +my $speed_max = 0; +my $speed_sum = 0; +my $speed_cnt = 0; + +sub sumarize { + my $dur = $time_end - $time_start; + my $len = $mile_end - $mile_start; + my $minutes = int($dur); + my $seconds = int(60 * ($dur - int($dur))); + my $watts_avg = int($watts_sum / $watts_cnt); + my $hrate_avg = ($hrate_cnt == 0) ? 0 : int($hrate_sum / $hrate_cnt); + my $caden_avg = ($caden_cnt == 0) ? 0 : int($caden_sum / $caden_cnt); + my $speed_avg = int($speed_sum / $speed_cnt); + printf "%2d\t%2d:%02d\t%5.1f\t%4d\t%4d\t%3d\t%3d\t%3d\t%3d\t%0.1f\t%0.1f\n", $interval, $minutes, $seconds, $len, $watts_avg, $watts_max, $hrate_avg, $hrate_max, $caden_avg, $caden_max, $speed_avg, $speed_max; + $watts_sum = 0; + $watts_cnt = 0; + $watts_max = 0; + $hrate_max = 0; + $hrate_sum = 0; + $hrate_cnt = 0; + $caden_max = 0; + $caden_sum = 0; + $caden_cnt = 0; + $speed_max = 0; + $speed_sum = 0; + $speed_cnt = 0; +} + +print "\t\t\tPower\t\tHeart Rate\tCadence\t\tSpeed\n"; +print "Int\t Dur\tDist\t Avg\t Max\tAvg\tMax\tAvg\tMax\tAvg\tMax\n"; + +while (<>) { + if (m/^#/) { + } + else { + my @cols = split; + if ($#cols != 7) { + print STDERR "Wrong number of columns: $_"; + exit 1; + } + my ($min, $torq, $speed, $watts, $miles, $caden, $hrate, $id) = @cols; + $mile_end = $miles; + $time_end = $min; + if ($watts != "NaN") { + $watts_sum += $watts; + $watts_cnt += 1; + if ($watts > $watts_max) { $watts_max = $watts; } + } + if ($hrate != "NaN") { + $hrate_sum += $hrate; + $hrate_cnt += 1; + if ($hrate > $hrate_max) { $hrate_max = $hrate; } + } + if ($caden != "NaN") { + $caden_sum += $caden; + $caden_cnt += 1; + if ($caden > $caden_max) { $caden_max = $caden; } + } + if ($speed != "NaN") { + $speed_sum += $speed; + $speed_cnt += 1; + if ($speed > $speed_max) { $speed_max = $speed; } + } + if ($id != $interval) { + if ($interval != -1) { + sumarize(); + } + $interval = $id; + $time_start = $min; + $mile_start = $miles; + } + } +} + +sumarize(); + diff --git a/notes.txt b/notes.txt new file mode 100644 index 000000000..7a30ab8ee --- /dev/null +++ b/notes.txt @@ -0,0 +1,75 @@ + +Version header: + +sometimes bytes added before 0x56 + +00 56 45 52 20 30 .VER 0 +32 2e 32 31 20 50 2.21 P +52 4f 00 00 00 00 RO.... +00 00 00 00 00 00 ...... +00 00 00 00 0d 0a ....\r\n + + +Data: + +Get 12 packets of 1542 (0x606) bytes each. +Where is that encoded? + +Each row is 6 bytes. +Rows that start with 0x8? are the data for one period. + +Column Meaning Format +1 ??? +2, n1 torque 4 most sig bits, N m +2, n2 km/h 4 most sig bits, 0x24000 / value * 0.1 +3 torque 8 least sig bits, N m +4 km/h 8 least sig bits, 0x24000 / value * 0.1 +5 Cadence 1-byte integer +6 Heartrate 1-byte integer + + +First row is always: + +57 56 55 64 02 15 + +Base period in thousands of a minute = 0x15... + + +A row starting with 0x60 encodes the time of day that measurements started. +This is always the second record in the stream. Also, when the computer goes +to sleep and then wakes up again, it writes one of these records first. + +Example: 60 06 04 9c 2a 30 + +byte 2 year +byte 3 month +byte 4, bottom 5 bits day +byte 5, bottom 5 bits hour +byte 6, bottom 6 bits minute + +top 3 bits of byte 4 followed by top 3 bits of byte 5 is pretty close to the +right seconds value, but not perfect... + + +A row starting with 0x40 encodes: + + bytes 2-3 the wheel circumference in mm + byte 4 the interval number + byte 5 the recording interval, where + + byte value interval + 0x0 1 + 0x1 2 + 0x3 5 + 0x7 10 + 0x17 30 + +Example: + +40 08 30 02 07 00 + wheel size in mm = 0x0830 + interval 2 + recording interval 10 + + + diff --git a/package.sh b/package.sh new file mode 100755 index 000000000..7ac321ff7 --- /dev/null +++ b/package.sh @@ -0,0 +1,8 @@ +#!/bin/sh +VERSION=`date +'%Y-%m-%d'` +FILES="COPYING Makefile pt.h pt.c ptdl.c ptunpk.c intervals.pl smooth.pl" +FILES="$FILES cpint.c cpint.h cpint-cmd.c ptpk.c" +mkdir gc_$VERSION +cp $FILES gc_$VERSION +tar cvzf gc_$VERSION.tgz gc_$VERSION +rm -rf gc_$VERSION diff --git a/pt.c b/pt.c new file mode 100644 index 000000000..a30f36bb2 --- /dev/null +++ b/pt.c @@ -0,0 +1,632 @@ +/* + * $Id: pt.c,v 1.9 2006/09/06 23:23:03 srhea Exp $ + * + * Copyright (c) 2006 Sean C. Rhea (srhea@srhea.net) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "pt.h" + +#define MAGIC_CONSTANT 147375.0 +#define PI 3.14159265 +#define TIME_UNIT_MIN 0.021 + +#define LBFIN_TO_NM 0.11298483 +#define KM_TO_MI 0.62137119 + +#define BAD_LBFIN_TO_NM_1 0.112984 +#define BAD_LBFIN_TO_NM_2 0.1129824 +#define BAD_KM_TO_MI 0.62 + +unsigned pt_debug_level; + +static unsigned char +check(unsigned value) +{ + assert(value < 256); + return (unsigned char) value; +} + +int +pt_find_device(char *result[], int capacity) +{ + regex_t reg; + DIR *dirp; + struct dirent *dp; + int count = 0; + if (regcomp(®, "^cu\\.(usbserial-[0-9A-F]+|KeySerial[0-9])$", + REG_EXTENDED|REG_NOSUB)) { + assert(0); + } + dirp = opendir("/dev"); + while ((count < capacity) && ((dp = readdir(dirp)) != NULL)) { + if (regexec(®, dp->d_name, 0, NULL, 0) == 0) { + result[count] = malloc(6 + strlen(dp->d_name)); + sprintf(result[count], "/dev/%s", dp->d_name); + ++count; + } + } + return count; +} + +#define KSDEVSTR "/dev/cu.KeySerial" +int +pt_hwecho(const char *device) +{ + return strncmp(device, KSDEVSTR, strlen(KSDEVSTR)) == 0; +} + +void +pt_make_async(int fd) +{ + int flags = fcntl(fd, F_GETFL, 0); + if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1) { + perror("fcntl"); + assert(0); + } +} + +int +pt_read_version(struct pt_read_version_state *state, int fd, int hwecho) +{ + char c = 0x56; + int n; + + if (state->state == 0) { + if (pt_debug_level >= PT_DEBUG_MAX) + fprintf(stderr, "Writing 0x%x to device.\n", (unsigned) c); + if ((n = write(fd, &c, 1)) < 1) { + perror("write"); + exit(1); + } + state->state = 1; + state->i = 0; + } + + if (state->state == 1) { + if (hwecho) { + if (pt_debug_level >= PT_DEBUG_MAX) + fprintf(stderr, "Calling read on device.\n"); + n = read(fd, &c, 1); + if (n <= 0) { + if ((n < 0) && (errno == EAGAIN)) { + if (pt_debug_level >= PT_DEBUG_MAX) + fprintf(stderr, "Need read.\n"); + return PT_NEED_READ; + } + perror("read"); + exit(1); + } + if (pt_debug_level >= PT_DEBUG_MAX) + fprintf(stderr, "Read %d bytes.\n", n); + assert(n == 1); + } + state->state = 2; + } + + assert(state->state == 2); + while (state->i < 29) { + if (pt_debug_level >= PT_DEBUG_MAX) + fprintf(stderr, "Need %d bytes. Calling read on device.\n", + 29 - state->i); + n = read(fd, state->buf + state->i, sizeof(state->buf) - state->i); + if (n <= 0) { + if ((n < 0) && (errno == EAGAIN)) { + if (pt_debug_level >= PT_DEBUG_MAX) + fprintf(stderr, "Need read.\n"); + return PT_NEED_READ; + } + perror("read"); + exit(1); + } + if (pt_debug_level >= PT_DEBUG_MAX) + fprintf(stderr, "Read %d bytes.\n", n); + state->i += n; + } + + return PT_DONE; +} + +int +pt_read_data(struct pt_read_data_state *state, + int fd, int hwecho, + void (*time_cb)(struct tm *, void *), + void (*record_cb)(unsigned char *, void *), + void *user_data) +{ + char c = 0x44; + int j, n; + unsigned csum; + struct tm time; + + if (state->state == 0) { + if (pt_debug_level >= PT_DEBUG_MAX) + fprintf(stderr, "Writing 0x%x to device.\n", (unsigned) c); + if ((n = write(fd, &c, 1)) < 1) { + perror("write"); + exit(1); + } + state->block = 1; + state->i = 0; + state->state = 1; + } + + if (state->state == 1) { + if (hwecho) { + if (pt_debug_level >= PT_DEBUG_MAX) + fprintf(stderr, "Calling read on device.\n"); + n = read(fd, &c, 1); + if (n <= 0) { + if ((n < 0) && (errno == EAGAIN)) { + if (pt_debug_level >= PT_DEBUG_MAX) + fprintf(stderr, "Need read.\n"); + return PT_NEED_READ; + } + perror("read"); + exit(1); + } + if (pt_debug_level >= PT_DEBUG_MAX) + fprintf(stderr, "Read %d bytes.\n", n); + assert(n == 1); + } + state->state = 2; + } + + if (state->state == 2) { + while (state->i < (int) sizeof(state->header)) { + if (pt_debug_level >= PT_DEBUG_MAX) + fprintf(stderr, "Calling read on device.\n"); + n = read(fd, state->header + state->i, + sizeof(state->header) - state->i); + if (n <= 0) { + if ((n < 0) && (errno == EAGAIN)) { + if (pt_debug_level >= PT_DEBUG_MAX) + fprintf(stderr, "Need read.\n"); + return PT_NEED_READ; + } + perror("read"); + exit(1); + } + if (pt_debug_level >= PT_DEBUG_MAX) + fprintf(stderr, "Read %d bytes.\n", n); + state->i += n; + } + state->state = 3; + state->i = 0; + } + + while (1) { + if (state->state == 3) { + while (state->i < (int) sizeof(state->buf)) { + if (pt_debug_level >= PT_DEBUG_MAX) + fprintf(stderr, "Calling read on device.\n"); + n = read(fd, state->buf + state->i, + sizeof(state->buf) - state->i); + if (n <= 0) { + if ((n < 0) && (errno == EAGAIN)) { + if (pt_debug_level >= PT_DEBUG_MAX) + fprintf(stderr, "Need read.\n"); + return PT_NEED_READ; + } + perror("read"); + exit(1); + } + if (pt_debug_level >= PT_DEBUG_MAX) + fprintf(stderr, "Read %d bytes.\n", n); + state->i += n; + /* TODO: why is this next if statement here? */ + if ((state->i == 2) && (state->buf[0] == 0x0d) + && (state->buf[1] == 0x0a)) { + return PT_DONE; + } + } + if (state->block == 1) { + n = 0; + if (pt_is_config(state->buf + n)) + n += 6; + if (!pt_is_time(state->buf + n) + || (pt_unpack_time(state->buf + n, &time) == -1)) + time_cb(NULL, user_data); + else + time_cb(&time, user_data); + record_cb(state->header, user_data); + } + csum = 0; + for (j = 0; j < state->i - 1; ++j) + csum += state->buf[j]; + if ((csum % 256) != state->buf[state->i-1]) { + fprintf(stderr, "\nbad checksum on block %d: %d vs %d", + state->block, state->buf[state->i-1], csum); + } + for (j = 0; j < state->i - 1; j += 6) { + if (state->buf[j]) + record_cb(state->buf + j, user_data); + else + break; + } + c = 0x71; + if (pt_debug_level >= PT_DEBUG_MAX) + fprintf(stderr, "Writing 0x%x to device.\n", (unsigned) c); + n = write(fd, &c, 1); + if (n < 1) { + perror("write"); + exit(1); + } + ++(state->block); + state->i = 0; + state->state = 4; + } + + assert(state->state == 4); + if (hwecho) { + if (pt_debug_level >= PT_DEBUG_MAX) + fprintf(stderr, "Calling read on device.\n"); + n = read(fd, &c, 1); + if (n <= 0) { + if ((n < 0) && (errno == EAGAIN)) { + if (pt_debug_level >= PT_DEBUG_MAX) + fprintf(stderr, "Need read.\n"); + return PT_NEED_READ; + } + perror("read"); + exit(1); + } + if (pt_debug_level >= PT_DEBUG_MAX) + fprintf(stderr, "Read %d bytes.\n", n); + assert(n == 1); + } + state->state = 3; + } + + return PT_DONE; +} + +int +pt_is_time(unsigned char *buf) +{ + return buf[0] == 0x60; +} + +time_t +pt_unpack_time(unsigned char *buf, struct tm *time) +{ + memset(time, 0, sizeof(*time)); + time->tm_year = 2000 + buf[1] - 1900; + time->tm_mon = buf[2] - 1; + time->tm_mday = buf[3] & 0x1f; + time->tm_hour = buf[4] & 0x1f; + time->tm_min = buf[5] & 0x3f; + time->tm_sec = ((buf[3] >> 5) << 3) | (buf[4] >> 5); + time->tm_isdst = -1; + return mktime(time); +} + +int +pt_is_config(unsigned char *buf) +{ + return buf[0] == 0x40; +} + +int +pt_unpack_config(unsigned char *buf, unsigned *interval, + unsigned *last_interval, unsigned *rec_int, + unsigned *wheel_sz_mm) +{ + *wheel_sz_mm = (buf[1] << 8) | buf[2]; + /* Data from device wraps interval after 9... */ + if (buf[3] != *last_interval) { + *last_interval = buf[3]; + ++*interval; + } + switch (buf[4]) { + case 0x0: *rec_int = 1; break; + case 0x1: *rec_int = 2; break; + case 0x3: *rec_int = 5; break; + case 0x7: *rec_int = 10; break; + case 0x17: *rec_int = 30; break; + default: + return -1; + } + return 0; +} + +int +pt_is_data(unsigned char *buf) +{ + return (buf[0] & 0x80) == 0x80; +} + +static double +my_round(double x) +{ + int i = (int) x; + double z = x - i; + /* For some unknown reason, the PowerTap software rounds 196.5 down... */ + if ((z > 0.5) || ((z == 0.5) && (i != 196))) + ++i; + return i; +} + +void +pt_unpack_data(unsigned char *buf, int compat, unsigned rec_int, + unsigned wheel_sz_mm, double *time_secs, double *torque_Nm, + double *mph, double *watts, double *dist_m, unsigned *cad, + unsigned *hr) +{ + double kph10; + unsigned speed; + unsigned torque_inlbs; + double rotations; + double radians; + double joules; + + *time_secs += rec_int * TIME_UNIT_MIN * 60.0; + torque_inlbs = ((buf[1] & 0xf0) << 4) | buf[2]; + if (torque_inlbs == 0xfff) + torque_inlbs = 0; + speed = ((buf[1] & 0x0f) << 8) | buf[3]; + if ((speed == 0) || (speed == 0xfff)) { + *mph = -1.0; + *watts = -1.0; + } + else { + if (compat) + *torque_Nm = torque_inlbs * BAD_LBFIN_TO_NM_2; + else + *torque_Nm = torque_inlbs * LBFIN_TO_NM; + kph10 = MAGIC_CONSTANT / speed; + if (compat) + *mph = my_round(kph10) / 10.0 * BAD_KM_TO_MI; + else + *mph = kph10 / 10.0 * KM_TO_MI; + rotations = rec_int * TIME_UNIT_MIN * 100000.0 * kph10 + / wheel_sz_mm / 60.0; + radians = rotations * 2.0 * PI; + joules = *torque_Nm * radians; + *watts = joules / (rec_int * TIME_UNIT_MIN * 60); + if (compat) + *watts = my_round(*watts); + else + *watts = round(*watts); + } + if (compat) + *torque_Nm = torque_inlbs * BAD_LBFIN_TO_NM_1; + *dist_m += (buf[0] & 0x7f) * wheel_sz_mm / 1000.0; + *cad = buf[4]; + if (*cad == 0xff) + *cad = 0; + *hr = buf[5]; + if (*hr == 0xff) + *hr = 0; +} + +void +pt_write_data(FILE *out, unsigned char *buf) +{ + int i; + for (i = 0; i < 5; ++i) + fprintf(out, "%02x ", buf[i]); + fprintf(out, "%02x\n", buf[i]); +} + +void +pt_pack_header(unsigned char *buf) +{ + unsigned char src[] = { 0x57, 0x56, 0x55, 0x64, 0x02, 0x15 }; + memcpy(buf, src, 6); +} + +void +pt_pack_time(unsigned char *buf, struct tm *time) +{ + buf[0] = 0x60; + buf[1] = check(time->tm_year + 1900 - 2000); + buf[2] = check(time->tm_mon + 1); + buf[3] = check(time->tm_mday) | check((time->tm_sec >> 3) << 5); + buf[4] = check(time->tm_hour) | check((time->tm_sec & 0x7) << 5); + buf[5] = check(time->tm_min); +} + +void +pt_pack_config(unsigned char *buf, unsigned interval, + unsigned rec_int, unsigned wheel_sz_mm) +{ + buf[0] = 0x40; + buf[1] = check(wheel_sz_mm >> 8); + buf[2] = wheel_sz_mm & 0xff; + buf[3] = check(interval % 9); + switch (rec_int) { + case 1: buf[4] = 0x0; break; + case 2: buf[4] = 0x1; break; + case 5: buf[4] = 0x3; break; + case 10: buf[4] = 0x7; break; + case 30: buf[4] = 0x17; break; + default: assert(0); + } + buf[5] = 0x0; +} + +void +pt_pack_data(unsigned char *buf, unsigned wheel_sz_mm, double nm, + double mph, double miles, unsigned cad, unsigned hr) +{ + double rotations = miles / BAD_KM_TO_MI * 1000.00 * 1000.0 / wheel_sz_mm; + unsigned inlbs = round(nm / BAD_LBFIN_TO_NM_2); + double kph10 = mph * 10.0 / BAD_KM_TO_MI; + unsigned speed; + if (mph == -1.0) + speed = 0xfff; + else + speed = round(MAGIC_CONSTANT / kph10); + buf[0] = 0x80 | check(round(rotations)); + buf[1] = ((inlbs & 0xf00) >> 4) | ((speed & 0xf00) >> 8); + buf[2] = inlbs & 0xff; + buf[3] = speed & 0xff; + buf[4] = check(cad); + buf[5] = check(hr); +} + + +void +pt_read_raw(FILE *in, int compat, void *context, + void (*config_cb)(unsigned interval, unsigned rec_int, + unsigned wheel_sz_mm, void *context), + void (*time_cb)(struct tm *time, time_t since_epoch, void *context), + void (*data_cb)(double secs, double nm, double mph, + double watts, double miles, unsigned cad, + unsigned hr, unsigned interval, void *context), + void (*error_cb)(const char *msg, void *context)) +{ + unsigned interval = 0; + unsigned last_interval = 0; + unsigned wheel_sz_mm = 0; + unsigned rec_int = 0; + int i, n, row = 0; + unsigned char buf[6]; + unsigned sbuf[6]; + double meters = 0.0; + double secs = 0.0, start_secs = 0.0; + double miles; + double mph; + double nm; + double watts; + unsigned cad; + unsigned hr; + struct tm time; + time_t since_epoch; + char ebuf[256]; + + while ((n = fscanf(in, "%x %x %x %x %x %x\n", + sbuf, sbuf+1, sbuf+2, sbuf+3, sbuf+4, sbuf+5)) == 6) { + ++row; + for (i = 0; i < 6; ++i) { + if (sbuf[i] > 0xff) { n = 1; break; } + buf[i] = sbuf[i]; + } + if (row == 1) { + /* Serial number? */ + } + else if (pt_is_config(buf)) { + if (pt_unpack_config(buf, &interval, &last_interval, + &rec_int, &wheel_sz_mm) < 0) { + sprintf(ebuf, "Couldn't unpack config record."); + if (error_cb) error_cb(ebuf, context); + return; + } + if (config_cb) config_cb(interval, rec_int, wheel_sz_mm, context); + } + else if (pt_is_time(buf)) { + since_epoch = pt_unpack_time(buf, &time); + if (start_secs == 0.0) + start_secs = since_epoch; + else + secs = since_epoch - start_secs; + if (time_cb) time_cb(&time, since_epoch, context); + } + else if (pt_is_data(buf)) { + if (wheel_sz_mm == 0) { + sprintf(ebuf, "Read data row before wheel size set."); + if (error_cb) error_cb(ebuf, context); + return; + } + pt_unpack_data(buf, compat, rec_int, wheel_sz_mm, &secs, + &nm, &mph, &watts, &meters, &cad, &hr); + if (compat) + miles = round(meters) / 1000.0 * BAD_KM_TO_MI; + else + miles = meters / 1000.0 * KM_TO_MI; + if (data_cb) + data_cb(secs, nm, mph, watts, miles, cad, + hr, interval, context); + } + else { + sprintf(ebuf, "Unknown record type 0x%x on row %d.", buf[0], row); + if (error_cb) error_cb(ebuf, context); + return; + } + } + if (n != -1) { + sprintf(ebuf, "Parse error on row %d.", row); + if (error_cb) error_cb(ebuf, context); + return; + } +} + +#define NMATCH 9 +void +pt_read_dat(FILE *in, void (*record_cb)(double, double, double, int, + double, int, int, int, void*), + void *user_data) +{ + regex_t reg_com, reg_dat; + regmatch_t pmatch[NMATCH]; + char line[256]; + double min, nm, mph, miles; + int watts, cad, hr, intv; + int i, len; + + if (regcomp(®_com, "^#", REG_EXTENDED | REG_NOSUB)) + assert(0); + if (regcomp(®_dat, "^([0-9]+\\.[0-9]+) +([0-9]+\\.[0-9]+) +" + "([0-9]+\\.[0-9]+|NaN) +([0-9]+|NaN) +([0-9]+\\.[0-9]+) +" + "([0-9]+) +([0-9]+|NaN) +([0-9]+)$", REG_EXTENDED)) + assert(0); + + while (fgets(line, sizeof(line), in)) { + len = strlen(line); + if (!line[len-1] == '\n') + assert(0); + line[len-1] = '\0'; + if (regexec(®_com, line, 0, NULL, 0) == 0) { + /* do nothing */ + } + else if (regexec(®_dat, line, NMATCH, pmatch, 0) == 0) { + for (i = 0; i < NMATCH; ++i) + line[pmatch[i].rm_eo] = '\0'; + if (sscanf(line + pmatch[1].rm_so, "%lf", &min) != 1) + assert(0); + if (sscanf(line + pmatch[2].rm_so, "%lf", &nm) != 1) + assert(0); + if (sscanf(line + pmatch[3].rm_so, "%lf", &mph) != 1) + mph = -1.0; + if (sscanf(line + pmatch[4].rm_so, "%d", &watts) != 1) + watts = -1; + if (sscanf(line + pmatch[5].rm_so, "%lf", &miles) != 1) + assert(0); + if (sscanf(line + pmatch[6].rm_so, "%d", &cad) != 1) + assert(0); + if (sscanf(line + pmatch[7].rm_so, "%d", &hr) != 1) + hr = -1; + if (sscanf(line + pmatch[8].rm_so, "%d", &intv) != 1) + assert(0); + record_cb(min, nm, mph, watts, miles, cad, hr, intv, user_data); + } + else { + fprintf(stderr, "Bad line: \"%s\"\n", line); + exit(1); + } + } +} + diff --git a/pt.h b/pt.h new file mode 100644 index 000000000..9b2a1c667 --- /dev/null +++ b/pt.h @@ -0,0 +1,98 @@ +/* + * $Id: pt.h,v 1.9 2006/09/06 23:23:03 srhea Exp $ + * + * Copyright (c) 2006 Sean C. Rhea (srhea@srhea.net) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __pt_h +#define __pt_h 1 + +#include +#include +#include + +#define PT_DEBUG_NONE 0 +#define PT_DEBUG_MAX 1 +extern unsigned pt_debug_level; + +extern int pt_find_device(char *result[], int capacity); +extern int pt_hwecho(const char *device); + +#define PT_DONE 0 +#define PT_NEED_READ 1 + +extern void pt_make_async(int fd); + +struct pt_read_version_state { + int state; + int i; + unsigned char buf[30]; +}; +extern int pt_read_version(struct pt_read_version_state *state, + int fd, int hwecho); + +struct pt_read_data_state { + int state; + int i; + unsigned block; + unsigned char header[6]; + unsigned char buf[256 * 6 + 1]; +}; +extern int pt_read_data(struct pt_read_data_state *state, + int fd, int hwecho, + void (*time_cb)(struct tm *, void *), + void (*record_cb)(unsigned char *, void *), + void *user_data); + +extern int pt_is_time(unsigned char *buf); +extern time_t pt_unpack_time(unsigned char *buf, struct tm *time); + +extern int pt_is_config(unsigned char *buf); +extern int pt_unpack_config(unsigned char *buf, unsigned *interval, + unsigned *last_interval, unsigned *rec_int, + unsigned *wheel_sz_mm); + +extern int pt_is_data(unsigned char *buf); +extern void pt_unpack_data(unsigned char *buf, int compat, unsigned rec_int, + unsigned wheel_sz_mm, double *time_secs, + double *torque_Nm, double *mph, double *watts, + double *dist_m, unsigned *cad, unsigned *hr); + +void pt_write_data(FILE *out, unsigned char *buf); +void pt_pack_header(unsigned char *buf); +void pt_pack_time(unsigned char *buf, struct tm *time); +void pt_pack_config(unsigned char *buf, unsigned interval, + unsigned rec_int, unsigned wheel_sz_mm); +void pt_pack_data(unsigned char *buf, unsigned wheel_sz_mm, double nm, + double mph, double miles, unsigned cad, unsigned hr); + +extern void pt_read_raw(FILE *in, int compat, void *context, + void (*config_cb)(unsigned interval, unsigned rec_int, + unsigned wheel_sz_mm, void *context), + void (*time_cb)(struct tm *time, time_t since_epoch, void *context), + void (*data_cb)(double secs, double nm, double mph, + double watts, double miles, unsigned cad, + unsigned hr, unsigned interval, void *context), + void (*error_cb)(const char *msg, void *context)); + +extern void pt_read_dat(FILE *in, + void (*record_cb)(double, double, double, int, + double, int, int, int, void*), + void *user_data); + +#endif /* __pt_h */ + diff --git a/ptdl.c b/ptdl.c new file mode 100644 index 000000000..8a1c53eab --- /dev/null +++ b/ptdl.c @@ -0,0 +1,231 @@ +/* + * $Id: ptdl.c,v 1.10 2006/09/06 23:23:03 srhea Exp $ + * + * Copyright (c) 2006 Sean C. Rhea (srhea@srhea.net) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include "pt.h" + +#define MAX_DEVICES 20 + +int force; + +static void +time_cb(struct tm *time, void *user_data) +{ + char outname[24]; + FILE **out = (FILE**) user_data; + if (!*out) { + if (!time) { + fprintf(stderr, "Can't find ride time;" + " specify output file with -o.\n"); + exit(1); + } + sprintf(outname, "%04d_%02d_%02d_%02d_%02d_%02d.raw", + time->tm_year + 1900, time->tm_mon + 1, time->tm_mday, + time->tm_hour, time->tm_min, time->tm_sec); + assert(strlen(outname) == sizeof(outname) - 1); + fprintf(stderr, "done.\nWriting to %s.\n", outname); + if ((*out = fopen(outname, "r")) != NULL) { + if (force) + fclose(*out); + else { + fprintf(stderr, "Error: %s already exists! " + "Specify -f to overwrite it.\n", outname); + exit(1); + } + } + if ((*out = fopen(outname, "w")) == NULL) { + fprintf(stderr, "Couldn't open %s for writing: %s", + outname, strerror(errno)); + exit(1); + } + fprintf(stderr, "Reading ride data..."); + fflush(stderr); + } +} + +static void +record_cb(unsigned char *buf, void *user_data) +{ + static int count = 0; + int i; + FILE **out = (FILE**) user_data; + for (i = 0; i < 6; ++i) + fprintf(*out, "%02x%s", buf[i], (i == 5) ? "\n" : " "); + if ((++count % 256) == 0) { + fprintf(stderr, "."); + fflush(stderr); + } +} + +static void +usage(const char *progname) +{ + fprintf(stderr, "usage: %s [-d ] [-e] [-f] [-o ]\n", + progname); + exit(1); +} + +int +main(int argc, char *argv[]) +{ + int i, ch, fd, r; + char *devices[MAX_DEVICES]; + int dev_cnt = 0; + char *outname; + FILE *out = NULL; + struct pt_read_version_state vstate; + struct pt_read_data_state dstate; + struct timeval timeout; + fd_set readfds; + int hwecho = 0; + + while ((ch = getopt(argc, argv, "d:efho:v")) != -1) { + switch (ch) { + case 'd': + devices[0] = optarg; + dev_cnt = 1; + break; + case 'e': + hwecho = 1; + break; + case 'f': + force = 1; + break; + case 'o': + outname = optarg; + if (strcmp(outname, "-") == 0) + out = stdout; + else if ((out = fopen(outname, "w")) == NULL) { + fprintf(stderr, "Couldn't open %s for writing: %s", + outname, strerror(errno)); + exit(1); + } + break; + case 'v': + pt_debug_level = PT_DEBUG_MAX; + break; + case 'h': + case '?': + default: + usage(argv[0]); + } + } + argc -= optind; + argv += optind; + + if (!dev_cnt) { + dev_cnt = pt_find_device(devices, MAX_DEVICES); + if (dev_cnt == 0) { + fprintf(stderr, "Can't find device; specify one with -d.\n"); + exit(1); + } + if (dev_cnt > 1) { + fprintf(stderr, "Multiple devices present; specify one with -d:\n"); + for (i = 0; i < dev_cnt; ++i) + fprintf(stderr, " %s\n", devices[i]); + exit(1); + } + } + + fprintf(stderr, "Reading from %s.\n", devices[0]); + if (pt_hwecho(devices[0])) + hwecho = 1; + + if (hwecho) + fprintf(stderr, "Expecting hardware echo.\n"); + + if (pt_debug_level >= PT_DEBUG_MAX) + fprintf(stderr, "Opening device %s.\n", devices[0]); + fd = open(devices[0], O_RDWR | O_NOCTTY | O_NONBLOCK); + if (fd < 0) { + perror("open"); + exit(1); + } + fprintf(stderr, "Reading version information..."); + fflush(stderr); + + pt_make_async(fd); + memset(&vstate, 0, sizeof(vstate)); + if (pt_debug_level >= PT_DEBUG_MAX) + fprintf(stderr, "\nCalling pt_read_version.\n"); + while ((r = pt_read_version(&vstate, fd, hwecho)) != PT_DONE) { + assert(r == PT_NEED_READ); + FD_ZERO(&readfds); + FD_SET(fd, &readfds); + timeout.tv_sec = 5; + timeout.tv_usec = 0; + if (pt_debug_level >= PT_DEBUG_MAX) + fprintf(stderr, "Calling select.\n"); + select(fd + 1, &readfds, NULL, NULL, &timeout); + if (!FD_ISSET(fd, &readfds)) { + fprintf(stderr, "timeout.\n"); + exit(1); + } + if (pt_debug_level >= PT_DEBUG_MAX) + fprintf(stderr, "\nCalling pt_read_version.\n"); + } + fprintf(stderr, "done.\n"); + close(fd); + + if (pt_debug_level >= PT_DEBUG_MAX) + fprintf(stderr, "Opening device %s.\n", devices[0]); + fd = open(devices[0], O_RDWR | O_NOCTTY | O_NONBLOCK); + if (fd < 0) { + perror("open"); + exit(1); + } + if (out) + fprintf(stderr, "Writing to %s.\nReading ride data...", outname); + else + fprintf(stderr, "Reading ride time..."); + fflush(stderr); + + pt_make_async(fd); + memset(&dstate, 0, sizeof(dstate)); + if (pt_debug_level >= PT_DEBUG_MAX) + fprintf(stderr, "\nCalling pt_read_data.\n"); + while ((r = pt_read_data(&dstate, fd, hwecho, time_cb, + record_cb, &out)) != PT_DONE) { + assert(r == PT_NEED_READ); + FD_ZERO(&readfds); + FD_SET(fd, &readfds); + timeout.tv_sec = 5; + timeout.tv_usec = 0; + if (pt_debug_level >= PT_DEBUG_MAX) + fprintf(stderr, "Calling select.\n"); + select(fd + 1, &readfds, NULL, NULL, &timeout); + if (!FD_ISSET(fd, &readfds)) { + fprintf(stderr, "timeout.\n"); + exit(1); + } + if (pt_debug_level >= PT_DEBUG_MAX) + fprintf(stderr, "\nCalling pt_read_data.\n"); + } + fprintf(stderr, "done.\n"); + + return 0; +} + diff --git a/ptpk.c b/ptpk.c new file mode 100644 index 000000000..0ee8b55eb --- /dev/null +++ b/ptpk.c @@ -0,0 +1,229 @@ +/* + * $Id: ptpk.c,v 1.1 2006/05/27 16:17:25 srhea Exp $ + * + * Copyright (c) 2006 Sean C. Rhea (srhea@srhea.net) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "pt.h" + +void +pt_pack(FILE *in, FILE *out, int wheel_sz_mm, int rec_int) +{ + double mins, nm, mph, watts, miles; + int cad, hr, interval = 0; + double last_mins = 0.0, last_miles = 0.0; + int last_interval = 0; + int i; + struct tm start_tm, inc_tm; + time_t start_time, inc_time; + int lineno = 1; + char line[256]; + unsigned char buf[6]; + regex_t date_reg; + int date_nmatch = 7; + regmatch_t *date_pmatch = + (regmatch_t*) calloc(date_nmatch, sizeof(regmatch_t)); + regex_t rider_reg; + int rider_nmatch = 12; + regmatch_t *rider_pmatch = + (regmatch_t*) calloc(rider_nmatch, sizeof(regmatch_t)); + + if (regcomp(&date_reg, "^([0-9][0-9]?)\\\\([0-9][0-9]?)\\\\" + "([0-9][0-9][0-9][0-9]) +([0-9][0-9]?):([0-9][0-9]?):" + "([0-9][0-9]?) *$", REG_EXTENDED)) + assert(0); + + if (regcomp(&rider_reg, "^([0-9]+\\.[0-9]+)" + "([0-9]+(\\.[0-9]+)?)" + "([0-9]+(\\.[0-9]+)?|NaN)([0-9]+|NaN)" + "([0-9]+(\\.[0-9]+)?)([0-9]+)" + "([0-9]+|NaN)([0-9]+)$", + REG_EXTENDED)) + assert(0); + + pt_pack_header(buf); + pt_write_data(out, buf); + + while (fgets(line, sizeof(line), in)) { + line[strlen(line) - 1] = '\0'; /* drop newline */ + if (strcmp(line, "") == 0) { + /* ignore it */ + } + else if (strcmp(line, "") == 0) { + /* ignore it */ + } + else if (strcmp(line, "") == 0) { + /* ignore it */ + } + else if (!regexec(&date_reg, line, date_nmatch, date_pmatch, 0)) { + for (i = 1; i < date_nmatch; ++i) + line[date_pmatch[i].rm_eo] = '\0'; + memset(&start_tm, 0, sizeof(start_tm)); + start_tm.tm_year = atoi(line + date_pmatch[3].rm_so) - 1900; + start_tm.tm_mon = atoi(line + date_pmatch[1].rm_so) - 1; + start_tm.tm_mday = atoi(line + date_pmatch[2].rm_so); + start_tm.tm_hour = atoi(line + date_pmatch[4].rm_so); + start_tm.tm_min = atoi(line + date_pmatch[5].rm_so); + start_tm.tm_sec = atoi(line + date_pmatch[6].rm_so); + start_tm.tm_isdst = -1; + start_time = mktime(&start_tm); + assert(start_time != -1); + pt_pack_time(buf, &start_tm); + pt_write_data(out, buf); + pt_pack_config(buf, interval, rec_int, wheel_sz_mm); + pt_write_data(out, buf); + } + else if (!regexec(&rider_reg, line, rider_nmatch, rider_pmatch, 0)) { + for (i = 1; i < rider_nmatch; ++i) + line[rider_pmatch[i].rm_eo] = '\0'; + mins = atof(line + rider_pmatch[1].rm_so); + nm = atof(line + rider_pmatch[2].rm_so); + if (strcmp(line + rider_pmatch[4].rm_so, "NaN") == 0) + mph = -1.0; + else + mph = atof(line + rider_pmatch[4].rm_so); + if (strcmp(line + rider_pmatch[6].rm_so, "NaN") == 0) + watts = -1.0; + else + watts = atof(line + rider_pmatch[6].rm_so); + miles = atof(line + rider_pmatch[7].rm_so); + cad = atoi(line + rider_pmatch[9].rm_so); + if (strcmp(line + rider_pmatch[10].rm_so, "NaN") == 0) + hr = 255; + else + hr = atoi(line + rider_pmatch[10].rm_so); + interval = atoi(line + rider_pmatch[11].rm_so); + if (mins - last_mins - 0.021 > 1.0 / 60.0) { + inc_time = start_time + round((mins - 0.021000001) * 60.0); + if (!localtime_r(&inc_time, &inc_tm)) + assert(0); + pt_pack_time(buf, &inc_tm); + pt_write_data(out, buf); + pt_pack_config(buf, interval, rec_int, wheel_sz_mm); + pt_write_data(out, buf); + } + else if (last_interval != interval) { + pt_pack_config(buf, interval, rec_int, wheel_sz_mm); + pt_write_data(out, buf); + } + pt_pack_data(buf, wheel_sz_mm, nm, mph, + miles - last_miles, cad, hr); + pt_write_data(out, buf); + last_mins = mins; + last_interval = interval; + last_miles = miles; + } + else { + fprintf(stderr, "ERROR: line %d unrecognized: \"%s\"\n", + lineno, line); + exit(1); + } + ++lineno; + } +} + +static void +usage(const char *progname) +{ + fprintf(stderr, "usage: %s [-o ] [-r ]" + "[-w ] []\n", + progname); + exit(1); +} + +int +main(int argc, char *argv[]) +{ + int ch, i; + int wheel_sz_mm = 2096; + int rec_int = 1; + char *inname = NULL, *outname = NULL; + FILE *in, *out = NULL; + + while ((ch = getopt(argc, argv, "ho:r:w:")) != -1) { + switch (ch) { + case 'o': + outname = optarg; + if (strcmp(outname, "-") == 0) { + out = stdout; + outname = "STDOUT"; + } + break; + case 'r': + rec_int = atoi(optarg); + break; + case 'w': + wheel_sz_mm = atoi(optarg); + break; + case 'h': + case '?': + default: + usage(argv[0]); + } + } + argc -= optind; + argv += optind; + + if (argc == 0) { + in = stdin; + inname = "STDIN"; + if (outname == NULL) { + out = stdout; + outname = "STDOUT"; + } + } + else { + inname = argv[0]; + if ((in = fopen(inname, "r")) == NULL) { + fprintf(stderr, "Couldn't open %s for reading: %s\n", + inname, strerror(errno)); + exit(1); + } + if (outname == NULL) { + outname = malloc(strlen(inname) + 5); + strcpy(outname, inname); + for (i = strlen(outname); i >= 0; --i) + if (outname[i] == '.') break; + if (i >= 0) + strcpy(outname + i + 1, "raw"); + else + strcpy(outname + strlen(outname), ".raw"); + } + } + + if ((out == NULL) && ((out = fopen(outname, "w")) == NULL)) { + fprintf(stderr, "Couldn't open %s for writing: %s\n", + outname, strerror(errno)); + exit(1); + } + + pt_pack(in, out, wheel_sz_mm, rec_int); + + fclose(in); + fclose(out); + + return 0; +} + diff --git a/ptunpk.c b/ptunpk.c new file mode 100644 index 000000000..eb0bc889b --- /dev/null +++ b/ptunpk.c @@ -0,0 +1,152 @@ +/* + * $Id: ptunpk.c,v 1.4 2006/06/04 14:32:34 srhea Exp $ + * + * Copyright (c) 2006 Sean C. Rhea (srhea@srhea.net) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include +#include +#include "pt.h" + +#define KM_TO_MI 0.62137119 +#define BAD_KM_TO_MI 0.62 + +static FILE *out; + +static void +config_cb(unsigned interval, unsigned rec_int, unsigned wheel_sz_mm, + void *context) +{ + context = NULL; + fprintf(out, "# wheel size=%d mm, interval=%d, rec int=%d\n", + wheel_sz_mm, interval, rec_int); +} + +static void +time_cb(struct tm *time, time_t since_epoch, void *context) +{ + context = NULL; + fprintf(out, "# %d/%d/%d %d:%02d:%02d %d\n", + time->tm_year + 1900, time->tm_mon + 1, time->tm_mday, + time->tm_hour, time->tm_min, time->tm_sec, (int) since_epoch); +} + +static void +data_cb(double secs, double nm, double mph, double watts, double miles, + unsigned cad, unsigned hr, unsigned interval, void *context) +{ + context = NULL; + fprintf(out, "%.3f %.1f", secs / 60.0, nm); + if (mph == -1.0) + fprintf(out, " NaN NaN"); + else + fprintf(out, " %0.3f %.0f", mph, watts); + fprintf(out, " %.5f %d", miles, cad); + if (hr == 0) + fprintf(out, " NaN"); + else + fprintf(out, " %d", hr); + fprintf(out, " %d\n", interval); +} + +static void +error_cb(const char *msg, void *context) +{ + context = NULL; + fprintf(stderr, "%s\n", msg); + exit(1); +} + +static void +usage(const char *progname) +{ + fprintf(stderr, "usage: %s [-c] [-o ] []\n", + progname); + exit(1); +} + +int +main(int argc, char *argv[]) +{ + int ch, i, compat = 0; + char *inname = NULL, *outname = NULL; + FILE *in; + + while ((ch = getopt(argc, argv, "cho:")) != -1) { + switch (ch) { + case 'c': + compat = 1; + break; + case 'o': + outname = optarg; + if (strcmp(outname, "-") == 0) { + out = stdout; + outname = "STDOUT"; + } + break; + case 'h': + case '?': + default: + usage(argv[0]); + } + } + argc -= optind; + argv += optind; + + if (argc == 0) { + in = stdin; + inname = "STDIN"; + if (outname == NULL) { + out = stdout; + outname = "STDOUT"; + } + } + else { + inname = argv[0]; + if ((in = fopen(inname, "r")) == NULL) { + fprintf(stderr, "Couldn't open %s for reading: %s\n", + inname, strerror(errno)); + exit(1); + } + if (outname == NULL) { + outname = malloc(strlen(inname) + 5); + strcpy(outname, inname); + for (i = strlen(outname); i >= 0; --i) + if (outname[i] == '.') break; + if (i >= 0) + strcpy(outname + i + 1, "dat"); + else + strcpy(outname + strlen(outname), ".dat"); + } + } + + if ((out == NULL) && ((out = fopen(outname, "w")) == NULL)) { + fprintf(stderr, "Couldn't open %s for writing: %s\n", + outname, strerror(errno)); + exit(1); + } + + fprintf(out, "# Time Torq MPH Watts Miles Cad HR Int\n"); + + pt_read_raw(in, compat, NULL, config_cb, time_cb, data_cb, error_cb); + + return 0; +} + diff --git a/smooth.pl b/smooth.pl new file mode 100755 index 000000000..4f4606641 --- /dev/null +++ b/smooth.pl @@ -0,0 +1,53 @@ +#!/usr/bin/perl -w +# +# $Id: smooth.pl,v 1.1 2006/05/16 14:24:50 srhea Exp $ +# +# Copyright (c) 2006 Sean C. Rhea (srhea@srhea.net) +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the Free +# Software Foundation; either version 2 of the License, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +# more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., 51 +# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# + +use strict; + +if ($#ARGV < 0) { + print "usage: smooth.pl \n"; + exit 1; +} + +my $len = $ARGV[0] / 60.0; +my $count = 0; +my $total = 0; +my $start_time = 0; + +while () { + if (m/^#/) { + } + else { + my @cols = split; + if (!($cols[1] eq "NaN")) { + ++$count; + $total += $cols[1]; + } + if ($cols[0] >= $start_time + $len) { + if ($count > 0) { + printf "$start_time %f\n", $total / $count; + } + $start_time = $cols[0]; + $total = 0; + $count = 0; + } + } +} + diff --git a/test.sh b/test.sh new file mode 100755 index 000000000..88f54c85f --- /dev/null +++ b/test.sh @@ -0,0 +1,30 @@ +#!/bin/sh +# +# $Id: test.sh,v 1.2 2006/05/14 14:17:21 srhea Exp $ +# +# Copyright (c) 2006 Russ Cox (rsc@swtch.com) and Sean Rhea (srhea@srhea.net) +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the Free +# Software Foundation; either version 2 of the License, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +# more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., 51 +# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# + +grep 'Rider' $1.xml | sed -e 's/<[^>]*>/ /g' > win +if ! ./ptunpk -c < $1.raw | grep -v '^#' > mac +then + echo "Failed to unpack $1.raw"; + exit 1 +fi +./compare_rows.pl win mac $2 +rm win mac +