Changeset 68 in flair-dev for trunk/include


Ignore:
Timestamp:
Mar 6, 2018, 12:14:17 PM (3 years ago)
Author:
Sanahuja Guillaume
Message:

maj for armv5te

Location:
trunk/include
Files:
10 added
34 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/FlairCore/FrameworkManager.h

    r45 r68  
    107107  *
    108108  * \param log_path path to store logs
    109   */
    110   void SetupLogger(std::string log_path);
     109  * \param stackSize stack size in bytes for logging thread
     110  */
     111  void SetupLogger(std::string log_path,uint32_t stackSize=1024*32);
    111112       
    112113        /*!
  • trunk/include/FlairCore/RangeFinderPlot.h

    r13 r68  
    2020namespace flair {
    2121namespace core {
    22 class cvmatrix;
     22class Matrix;
    2323}
    2424}
     
    6161                  std::string x_name, float xmin, float xmax,
    6262                  std::string y_name, float ymin, float ymax,
    63                   const core::cvmatrix *datas, float start_angle,
     63                  const core::Matrix *datas, float start_angle,
    6464                  float end_angle, uint32_t nb_samples);
    6565
     
    8787  void ExtraXmlEvent(void){};
    8888
    89   const core::cvmatrix *datas;
     89  const core::Matrix *datas;
    9090};
    9191
  • trunk/include/FlairCore/Thread.h

    r50 r68  
    4646  * \param name name
    4747  * \param priority priority, should be >20 (<20 is reserved for internal use)
     48  * \param stackSize stack size in bytes
    4849  */
    4950  Thread(const Object *parent, std::string name,
    50          uint8_t priority); // priority>20, for real time only
     51         uint8_t priority,uint32_t stackSize=1024*128);
    5152
    5253  /*!
  • trunk/include/FlairCore/io_data.h

    r32 r68  
    116116
    117117  /*!
    118   * \brief Set data time
    119   *
     118  * \brief Set data time, also caluculates the delta time based on last call
     119  *
     120  * TIME_INFINITE represents an unitialized time
     121  *
    120122  * \param time time
    121123  */
    122124  void SetDataTime(Time time);
     125 
     126  /*!
     127  * \brief Set data time and  delta time (thus delta time is not based on last call)
     128  *
     129  * TIME_INFINITE represents an unitialized time
     130  *
     131  * \param time time
     132  * \param deltaTime delta time
     133  */
     134  void SetDataTime(Time time,Time deltaTime);
    123135
    124136  /*!
    125137  * \brief Data time
    126138  *
     139  * TIME_INFINITE represents an unitialized time.
     140  *
    127141  * \return data time
    128142  */
    129143  Time DataTime(void) const;
     144 
     145  /*!
     146  * \brief Data delta time
     147  *
     148  * TIME_INFINITE represents an unitialized time.
     149  *
     150  * \return data delta time
     151  */
     152  Time DataDeltaTime(void) const;
     153 
     154  /*!
     155  * \brief Get data time and  delta time
     156  *
     157  * TIME_INFINITE represents an unitialized time
     158  *
     159  * \param time time
     160  * \param deltaTime delta time
     161  */
     162  void GetDataTime(Time &time,Time &deltaTime) const;
    130163
    131164  /*!
  • trunk/include/FlairFilter/AhrsComplementaryFilter.h

    r62 r68  
    6363            void UpdateFrom(const core::io_data *data);
    6464
    65             core::Time previous_time;
    66 
    67             bool isInit;
    6865            core::Quaternion QHat;
    6966            core::Vector3Df BHat;
  • trunk/include/FlairFilter/ButterworthLowPass.h

    r50 r68  
    1818namespace flair {
    1919namespace core {
    20 class cvmatrix;
     20class Matrix;
    2121}
    2222namespace gui {
     
    9191  * \return filtered output
    9292  */
    93   core::cvmatrix *Matrix(void) const;
     93  core::Matrix *GetMatrix(void) const;
    9494
    9595  /*!
  • trunk/include/FlairFilter/ControlLaw.h

    r13 r68  
    2121}
    2222namespace core {
    23 class cvmatrix;
     23class Matrix;
    2424}
    2525}
     
    8888  * \brief Reset the internal state of the control law
    8989  *
    90   * Doesn't do anything by default
     90  * Does nothing by default
    9191  *
    9292  */
     
    100100  *
    101101  */
    102   core::cvmatrix *input;
     102  core::Matrix *input;
    103103
    104104  /*!
     
    109109  *
    110110  */
    111   core::cvmatrix *output;
     111  core::Matrix *output;
    112112
    113113private:
  • trunk/include/FlairFilter/EulerDerivative.h

    r50 r68  
    1818namespace flair {
    1919namespace core {
    20 class cvmatrix;
     20class Matrix;
    2121}
    2222namespace gui {
     
    5656  EulerDerivative(const core::IODevice *parent,
    5757                  const gui::LayoutPosition *position, std::string name,
    58                   const core::cvmatrix *init_value = NULL);
     58                  const core::Matrix *init_value = NULL);
    5959
    6060  /*!
     
    7979  * \return filtered output
    8080  */
    81   core::cvmatrix *Matrix(void) const;
     81  core::Matrix *GetMatrix(void) const;
    8282
    8383private:
  • trunk/include/FlairFilter/LowPassFilter.h

    r50 r68  
    1818namespace flair {
    1919namespace core {
    20 class cvmatrix;
     20class Matrix;
    2121}
    2222namespace gui {
     
    5656  LowPassFilter(const core::IODevice *parent,
    5757                const gui::LayoutPosition *position, std::string name,
    58                 const core::cvmatrix *init_value = NULL);
     58                const core::Matrix *init_value = NULL);
    5959
    6060  /*!
     
    7979  * \return filtered output
    8080  */
    81   core::cvmatrix *Matrix(void) const;
     81  core::Matrix *GetMatrix(void) const;
    8282
    8383private:
  • trunk/include/FlairFilter/PidThrust.h

    r62 r68  
    5555
    5656  /*!
     57  * \brief Reset the control law
     58  * equivalent to:
     59  * ResetI();
     60  * SetDefaultOffset();
     61  * SetValues(0,0);
     62  *
     63  */
     64  void Reset(void);
     65 
     66  /*!
    5767  * \brief Reset integral to 0
    5868  *
     
    7888  * \return current offset
    7989  */
    80   float GetOffset(void);
     90  float GetOffset(void) const;
     91 
     92  /*!
     93  * \brief Get intergral part
     94  *
     95  * \return current integral part
     96  */
     97  float GetIntegral(void) const;
    8198
    8299  /*!
  • trunk/include/FlairFilter/TrajectoryGenerator1D.h

    r62 r68  
    1818namespace flair {
    1919namespace core {
    20 class cvmatrix;
     20class Matrix;
    2121}
    2222namespace gui {
     
    152152  * \return matrix
    153153  */
    154   core::cvmatrix *Matrix(void) const;
     154  core::Matrix *GetMatrix(void) const;
    155155
    156156private:
  • trunk/include/FlairFilter/TrajectoryGenerator2DCircle.h

    r50 r68  
    1919namespace flair {
    2020namespace core {
    21 class cvmatrix;
     21class Matrix;
    2222}
    2323namespace gui {
     
    131131  * \return matrix
    132132  */
    133   core::cvmatrix *Matrix(void) const;
     133  core::Matrix *GetMatrix(void) const;
    134134
    135135  /*!
  • trunk/include/FlairMeta/Uav.h

    r55 r68  
    3131                class Camera;
    3232                class NmeaGps;
     33                class PressureSensor;
    3334        }
    3435}
     
    6465  sensor::Camera *GetHorizontalCamera(void) const;
    6566  sensor::NmeaGps *GetGps(void) const;
     67  sensor::PressureSensor *GetPressureSensor(void) const;
    6668        virtual std::string GetDefaultVrpnAddress(void) const{return "127.0.0.1:3883";}
    6769  virtual bool isReadyToFly(void) const { return true;}
     
    7779  void SetHorizontalCamera(const sensor::Camera *verticalCamera);
    7880  void SetGps(const sensor::NmeaGps *gps);
     81  void SetPressureSensor(const sensor::PressureSensor *pressureSensor);
    7982
    8083private:
     
    8891  sensor::BatteryMonitor *battery;
    8992  sensor::Camera *verticalCamera,*horizontalCamera;
     93  sensor::PressureSensor *pressureSensor;
    9094};
    9195
  • trunk/include/FlairSensorActuator/BlCtrlV2_x4_speed.h

    r50 r68  
    2424namespace flair {
    2525namespace core {
    26 class cvmatrix;
     26class Matrix;
    2727class I2cPort;
    2828}
     
    9797
    9898  // matrix
    99   core::cvmatrix *input;
    100   core::cvmatrix *output;
     99  core::Matrix *input;
     100  core::Matrix *output;
    101101
    102102  int tested_motor;
  • trunk/include/FlairSensorActuator/Bldc.h

    r50 r68  
    1919namespace flair {
    2020namespace core {
    21 class cvmatrix;
     21class Matrix;
    2222}
    2323namespace gui {
     
    9696  *
    9797  */
    98   core::cvmatrix *Output(void) const;
     98  core::Matrix *Output(void) const;
    9999
    100100  /*!
     
    161161
    162162protected:
    163   core::cvmatrix *output;
     163  core::Matrix *output;
    164164
    165165private:
  • trunk/include/FlairSensorActuator/EmulatedController.h

    r50 r68  
    2121namespace flair {
    2222    namespace core {
    23         class cvmatrix;
     23        class Matrix;
    2424    }
    2525    namespace gui {
     
    5252        bool ProcessMessage(core::Message *msg);
    5353        bool IsDataFrameReady();
    54         void AcquireAxisData(core::cvmatrix &axis); //responsible for getting the axis data from the hardware
    55         void AcquireButtonData(core::cvmatrix &button); //responsible for getting the button data from the hardware
     54        void AcquireAxisData(core::Matrix &axis); //responsible for getting the axis data from the hardware
     55        void AcquireButtonData(core::Matrix &button); //responsible for getting the button data from the hardware
    5656        bool ControllerInitialization();
    5757
    5858    private:
    5959        enum class DataType { axis,button };
    60         void ComputeControllerData(DataType dataType, core::cvmatrix &data);
    61         template<typename T> void fillVectorNoMutex(core::cvmatrix &vector,T data[],unsigned int size);
    62         void fillVectorNoMutex(core::cvmatrix &destination,core::cvmatrix &source,unsigned int size);
     60        void ComputeControllerData(DataType dataType, core::Matrix &data);
     61        template<typename T> void fillVectorNoMutex(core::Matrix &vector,T data[],unsigned int size);
     62        void fillVectorNoMutex(core::Matrix &destination,core::Matrix &source,unsigned int size);
    6363        struct StepData {
    6464            unsigned int durationMs; //milliseconds
    65             core::cvmatrix *axisData;
    66             core::cvmatrix *buttonData;
     65            core::Matrix *axisData;
     66            core::Matrix *buttonData;
    6767            std::string description;
    6868            void Print();
  • trunk/include/FlairSensorActuator/HokuyoUTM30Lx.h

    r50 r68  
    2323namespace flair {
    2424namespace core {
    25 class cvmatrix;
     25class Matrix;
    2626class SerialPort;
    2727class Mutex;
     
    5656  void getMesure(int startStep, int endStep, int clusterCount, int interval,
    5757                 int scanNumber = 0);
    58   core::cvmatrix *getDatas(void);
     58  core::Matrix *getDatas(void);
    5959
    6060  /*!
     
    7878
    7979  // matrix
    80   core::cvmatrix *output;
     80  core::Matrix *output;
    8181
    8282  std::queue<std::string> bufRet;
  • trunk/include/FlairSensorActuator/HostEthController.h

    r50 r68  
    2626namespace flair {
    2727namespace core {
    28 class cvmatrix;
     28class Matrix;
    2929class TcpSocket;
    3030class UdpSocket;
     
    8181  GetAxisData() = 0; // responsible for getting the axis data from the hardware
    8282  unsigned int axisNumber;
    83   core::cvmatrix *axis;
     83  core::Matrix *axis;
    8484  gui::DataPlot1D **axisPlot;
    8585  uint32_t bitsPerAxis;
     
    9090                                    // from the hardware
    9191  unsigned int buttonNumber;
    92   core::cvmatrix *button;
     92  core::Matrix *button;
    9393  uint8_t buttonOffset;
    9494  bool meaningfulDataAvailable;
  • trunk/include/FlairSensorActuator/LaserRangeFinder.h

    r50 r68  
    1919namespace core {
    2020class FrameworkManager;
    21 class cvmatrix;
     21class Matrix;
    2222}
    2323namespace gui {
     
    102102      * \return output matrix
    103103      */
    104   core::cvmatrix *output;
     104  core::Matrix *output;
    105105
    106106  /*!
  • trunk/include/FlairSensorActuator/RadioReceiver.h

    r50 r68  
    1919namespace flair {
    2020namespace core {
    21 class cvmatrix;
     21class Matrix;
    2222}
    2323namespace gui {
     
    8787  void UpdateFrom(const core::io_data *data){};
    8888
    89   core::cvmatrix *output;
     89  core::Matrix *output;
    9090  bool is_connected;
    9191  unsigned int nb_channels;
  • trunk/include/FlairSensorActuator/SimuBldc.h

    r50 r68  
    2020class SharedMem;
    2121class IODevice;
    22 class cvmatrix;
     22class Matrix;
    2323}
    2424namespace gui {
     
    4040  * \brief Constructor
    4141  *
    42   * Construct a SimuBldc. Control part.
     42  * Construct a SimuBldc
    4343  *
    4444  * \param parent parent
     
    5353
    5454  /*!
    55   * \brief Constructor
    56   *
    57   * Construct a SimuBldc. Simulation part.
    58   *
    59   * \param parent parent
    60   * \param name name
    61   * \param motors_count number of motors
    62   * \param modelId Model id
    63   * \param deviceId Bldc id of the Model
    64   */
    65   SimuBldc(const core::Object *parent, std::string name, uint8_t motors_count,
    66            uint32_t modelId,uint32_t deviceId);
    67 
    68   /*!
    6955  * \brief Destructor
    7056  *
    7157  */
    7258  ~SimuBldc();
    73 
    74   /*!
    75   * \brief Get motors speeds.
    76   *
    77   * This function should only be used for the simulation part.
    78   *
    79   * \param value array to store motors speeds
    80   */
    81   void GetSpeeds(float *value) const;
    8259
    8360  /*!
     
    11390  core::SharedMem *shmem;
    11491  gui::DoubleSpinBox *k;
     92  char *buf;
     93
    11594};
    11695} // end namespace actuator
  • trunk/include/FlairSensorActuator/SimuCamera.h

    r50 r68  
    3535  * \brief Constructor
    3636  *
    37   * Construct a SimuCamera. Control part.
     37  * Construct a SimuCamera.
    3838        * It will be child of the FrameworkManager.
    3939  *
     
    5050             uint8_t priority);
    5151
    52   /*!
    53   * \brief Constructor
    54   *
    55   * Construct a SimuCamera. Simulation part.\n
    56   * The Thread of this class should not be run.
    57   *
    58   * \param parent parent
    59   * \param name name
    60   * \param width width
    61   * \param height height
    62   * \param channels number of channels
    63   * \param modelId Model id
    64   * \param deviceId Camera id of the Model
    65   */
    66   SimuCamera(const core::IODevice *parent, std::string name, uint16_t width,
    67              uint16_t height, uint8_t channels, uint32_t modelId,uint32_t deviceId);
    6852
    6953  /*!
  • trunk/include/FlairSensorActuator/SimuGps.h

    r62 r68  
    3838  * \brief Constructor
    3939  *
    40   * Construct a simulation GPS. Control part.
     40  * Construct a simulation GPS
    4141  * It will be child of the FrameworkManager.
    4242        *
     
    4949  SimuGps(std::string name,
    5050          NmeaGps::NMEAFlags_t NMEAFlags, uint32_t modelId,uint32_t deviceId,uint8_t priority);
    51 
    52   /*!
    53   * \brief Constructor
    54   *
    55   * Construct a simulation GPS. Simulation part.\n
    56   * The Thread of this class should not be run.
    57   *
    58   * \param parent parent
    59   * \param name name
    60   * \param modelId Model id
    61   * \param deviceId Gps id of the Model
    62   */
    63   SimuGps(const core::IODevice *parent, std::string name, uint32_t modelId,uint32_t deviceId);
    6451
    6552  /*!
     
    7764  * \param data data from the parent to process
    7865  */
    79   void UpdateFrom(const core::io_data *data);
     66  void UpdateFrom(const core::io_data *data){};
    8067
    8168  /*!
  • trunk/include/FlairSensorActuator/SimuImu.h

    r56 r68  
    3838  * \brief Constructor
    3939  *
    40   * Construct a SimuImu. Control part.
     40  * Construct a SimuImu.
    4141        * It will be child of the FrameworkManager.
    4242  *
     
    4848  SimuImu(std::string name,
    4949          uint32_t modelId,uint32_t deviceId, uint8_t priority);
    50 
    51   /*!
    52   * \brief Constructor
    53   *
    54   * Construct a SimuImu. Simulation part.\n
    55   * The Thread of this class should not be run.
    56   *
    57   * \param parent parent
    58   * \param name name
    59   * \param modelId Model id
    60   * \param deviceId Imu id of the Model
    61   */
    62   SimuImu(const core::IODevice *parent, std::string name, uint32_t modelId,uint32_t deviceId);
    6350
    6451  /*!
     
    8471  * \param data data from the parent to process
    8572  */
    86   void UpdateFrom(const core::io_data *data);
     73  void UpdateFrom(const core::io_data *data){};
    8774
    8875  typedef struct {
  • trunk/include/FlairSensorActuator/SimuLaser.h

    r50 r68  
    3737  * \brief Constructor
    3838  *
    39   * Construct a SimuUs. Control part.
    40         * It will be child of the FrameworkManager.
     39  * Construct a SimuUs.
    4140  *
    4241  * \param name name
     
    4746  SimuLaser(std::string name,
    4847            uint32_t modelId,uint32_t deviceId, uint8_t priority);
    49 
    50   /*!
    51   * \brief Constructor
    52   *
    53   * Construct a SimuUs. Simulation part.\n
    54   * The Thread of this class should not be run.
    55   *
    56   * \param parent parent
    57   * \param name name
    58   * \param modelId Model id
    59   * \param deviceId LaserRangeFinder id of the Model
    60   */
    61   SimuLaser(const core::IODevice *parent, std::string name, uint32_t modelId,uint32_t deviceId);
    6248
    6349  /*!
  • trunk/include/FlairSensorActuator/SimuUs.h

    r50 r68  
    3737  * \brief Constructor
    3838  *
    39   * Construct a SimuUs. Control part.
     39  * Construct a SimuUs.
    4040        * It will be child of the FrameworkManager.
    4141  *
     
    4747  SimuUs(std::string name,
    4848         uint32_t modelId,uint32_t deviceId, uint8_t priority);
    49 
    50   /*!
    51   * \brief Constructor
    52   *
    53   * Construct a SimuUs. Simulation part.\n
    54   * The Thread of this class should not be run.
    55   *
    56   * \param parent parent
    57   * \param name name
    58   * \param modelId Model id
    59   * \param deviceId UsRangeFinder id of the Model
    60   */
    61   SimuUs(const core::IODevice *parent, std::string name, uint32_t modelId,uint32_t deviceId);
    6249
    6350  /*!
  • trunk/include/FlairSensorActuator/TargetController.h

    r50 r68  
    2727namespace core {
    2828class FrameworkManager;
    29 class cvmatrix;
     29class Matrix;
    3030class Socket;
    3131class io_data;
     
    8282  // axis stuff
    8383  unsigned int axisNumber;
    84   core::cvmatrix *axis = NULL;
    85   virtual void AcquireAxisData(core::cvmatrix &axis) = 0; // responsible for
     84  core::Matrix *axis = NULL;
     85  virtual void AcquireAxisData(core::Matrix &axis) = 0; // responsible for
    8686                                                          // getting the axis
    8787                                                          // data from the
     
    9090  // button stuff
    9191  unsigned int buttonNumber;
    92   core::cvmatrix *button = NULL;
    93   virtual void AcquireButtonData(core::cvmatrix &button) = 0; // responsible for
     92  core::Matrix *button = NULL;
     93  virtual void AcquireButtonData(core::Matrix &button) = 0; // responsible for
    9494                                                              // getting the
    9595                                                              // button data
  • trunk/include/FlairSensorActuator/TargetEthController.h

    r50 r68  
    2727namespace core {
    2828class FrameworkManager;
    29 class cvmatrix;
     29class Matrix;
    3030class TcpSocket;
    3131class UdpSocket;
     
    6262
    6363  bool IsDataFrameReady();
    64   void AcquireAxisData(core::cvmatrix &axis);     // responsible for getting the
     64  void AcquireAxisData(core::Matrix &axis);     // responsible for getting the
    6565                                                  // axis data from the hardware
    66   void AcquireButtonData(core::cvmatrix &button); // responsible for getting the
     66  void AcquireButtonData(core::Matrix &button); // responsible for getting the
    6767                                                  // button data from the
    6868                                                  // hardware
  • trunk/include/FlairSensorActuator/UsRangeFinder.h

    r50 r68  
    1717
    1818namespace flair {
    19 namespace core {
    20 class cvmatrix;
    21 }
    22 namespace gui {
    23 class Tab;
    24 class TabWidget;
    25 class GroupBox;
    26 class Layout;
    27 class DataPlot1D;
    28 }
     19  namespace core {
     20    class Matrix;
     21  }
     22  namespace gui {
     23    class Tab;
     24    class TabWidget;
     25    class GroupBox;
     26    class Layout;
     27    class DataPlot1D;
     28  }
    2929}
    3030
     
    105105  */
    106106  gui::Tab *GetPlotTab(void) const;
     107 
     108  /*!
     109  * \brief Tab widget
     110  *
     111  * \return tab widget
     112  */
     113  gui::TabWidget *GetTabWidget(void) const;
    107114
    108115  /*!
     
    119126  * \return output matrix
    120127  */
    121   core::cvmatrix *output;
     128  core::Matrix *output;
    122129
    123130  /*!
  • trunk/include/FlairSensorActuator/VrpnObject.h

    r50 r68  
    2121namespace flair {
    2222        namespace core {
    23                 class cvmatrix;
     23                class Matrix;
    2424                class Quaternion;
    2525        }
     
    126126  * \return Output matrix
    127127  */
    128   core::cvmatrix *Output(void) const;
     128  core::Matrix *Output(void) const;
    129129
    130130  /*!
     
    139139  * \return State matrix
    140140  */
    141   core::cvmatrix *State(void) const;
     141  core::Matrix *State(void) const;
    142142
    143143  /*!
  • trunk/include/FlairSimulator/X4.h

    r50 r68  
    2626namespace gui {
    2727class DoubleSpinBox;
     28class SpinBox;
    2829}
    2930namespace actuator {
     
    6364  gui::DoubleSpinBox *f_air_vert, *f_air_lat;
    6465  gui::DoubleSpinBox *j_roll, *j_pitch, *j_yaw;
     66  gui::SpinBox *motorTimeout;
    6567};
    6668} // end namespace simulator
  • trunk/include/FlairSimulator/X8.h

    r50 r68  
    2626namespace gui {
    2727class DoubleSpinBox;
     28class SpinBox;
    2829}
    2930namespace actuator {
     
    6566  gui::DoubleSpinBox *j_roll, *j_pitch, *j_yaw;
    6667  gui::DoubleSpinBox *j_r, *sigma, *S;
     68  gui::SpinBox *motorTimeout;
    6769};
    6870} // end namespace simulator
  • trunk/include/FlairVisionFilter/HoughLines.h

    r44 r68  
    1717    namespace core {
    1818        class cvimage;
    19         class cvmatrix;
     19        class Matrix;
    2020    }
    2121    namespace gui {
     
    5656            float GetOrientation(void) const;
    5757            float GetDistance(void) const;
    58             core::cvmatrix *Output(void) const;
     58            core::Matrix *Output(void) const;
    5959
    6060        private:
     
    6969            float distance,orientation;
    7070            CvMat* linesStorage;
    71             core::cvmatrix *output;
     71            core::Matrix *output;
    7272    };
    7373} // end namespace filter
  • trunk/include/FlairVisionFilter/OpticalFlowSpeed.h

    r50 r68  
    1717    namespace core
    1818    {
    19         class cvmatrix;
     19        class Matrix;
    2020    }
    2121}
     
    7171            * Second line is speed along y axis. \n
    7272            */
    73             core::cvmatrix *Output() const;
     73            core::Matrix *Output() const;
    7474
    7575        private:
     
    8383            void UpdateFrom(const core::io_data *data);
    8484
    85             core::cvmatrix *output;
     85            core::Matrix *output;
    8686    };
    8787} // end namespace filter
Note: See TracChangeset for help on using the changeset viewer.