Pages: [1]   Go Down
Author Topic: Application Library: clsApp  (Read 1065 times)
0 Members and 1 Guest are viewing this topic.
United kingdom
Offline Offline
Full Member
***
Karma: 1
Posts: 195
just think how much free time you would have if everything worked first time!!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I'm writing an application library which will include references to other libraries that I've written wrapped up into one class.

The idea behind this class is to create a standard package which provides services to the author, for example, you would create an instance of the application class:
Code:
clsApp objApp( 1, 0, "my Application", "By Simon Platten, 29/01/2012" );

The first two parameters are the Major and Minor version number, followed by the application title, then an additional string which in the above is the author and build date.

The first line of the setup() is:
Code:
objApp.startupMsg(true);
The parameter is optional, true means show debug information, default is false.  If set to true then the application start-up message is written to the serial port, which would take the form:

myApplication
By Simon Platten, 29/01/2012
Version: 1.0

You can write additional messages to the debug port using the method 'objApp.message()'

So far I've wrapped up my timer class, so to create a timer object use the method, 'createTimer'.

To service any object such as timers, call 'objApp.process()' from within loop().  I will be adding a class to manage events that will call callback functions when an event occurs.  So far it doesn't do a lot.

Prototype, clsApp.h
Code:
/**
 * File:
 *  clsApp.h
 * 
 * Notes:
 *  This file contains the prototype for the class clsTimer.
 * 
 * Methods:
 *  clsApp          Class constructor
 *  createTimer     Creates a new timer
 *  getDescription  Access method to get the application description
 *  getTitle        Access method to get the application title
 *  getMajor        Access method to get the major version number
 *  getMinor        Access method to get the minor version number
 *  message         Writes a message to the debug port
 *  process         Performs any critical processes, should be included in loop
 *  startupMsg      Sends application start-up message to serial port
 *   
 * Members:
 *  m_blnDebug      Debug flag, true or false
 *  m_pstrTitle     The application title
 *  m_pstrDesc      The application description
 *  m_intMajor      The major version number
 *  m_intMinor      The minor version number   
 *           
 * History:
 *  29/01/2012  Created by Simon Platten
 */           
#ifndef APP_AIDS_H
  #define APP_AIDS_H
 
  #include <Arduino.h>
  #include "clsTimer.h"
 
  class clsApp {
  private:
// Debug flag, true or false 
    bool  m_blnDebug;
// The Major version number   
    int   m_intMajor;
// The Minor version number   
    int   m_intMinor;
// Application title 
    char* m_pstrTitle;
// Application description   
    char* m_pstrDesc;
   
  public:
    clsApp(int intMajor,
           int intMinor,
           char* pstrTitle = NULL,
           char* pstrDesc = NULL);
// Creates a new timer           
    clsTimer* createTimer(unsigned uintInitial,               
                          void (*pCallback)(clsTimer* pTimer),
                          void *pData = NULL,
                          unsigned uintRepeat = 0);           
// Access method to get the application description           
    char* getDescription();           
// Access method to get the major version number
    int   getMajor();
// Access method to get the minor version number
    int   getMinor();         
// Access method to get the application title
    char* getTitle();
// Writes a message to the debug port   
    void  message(char* pstrMessage);
// Performs any critical processes, should be included in loop()   
    void  process();
// Sends application start-up message to serial port   
    void  startupMsg(bool blnDebug = true);   
  };
#endif

Implementation, clsApp.cpp
Code:
/**
 * File:
 *  clsApp.cpp
 * 
 * Notes:
 *  This file contains the implementation of the class clsApp.
 *
 * History:
 *  29/01/2012  Created by Simon Platten
 */ 
#include "clsApp.h"
/**
 * Application constructor
 * 
 * Paramters:
 *  pstrTitle, pointer to the application title
 *  pstrDesc, pointer to the application description
 *  intMajor, Major version number
 *  intMinor, Minor version number 
 */         
clsApp::clsApp(int intMajor,
               int intMinor,
               char* pstrTitle,
               char* pstrDesc) {
  m_pstrTitle = pstrTitle;
  m_pstrDesc  = pstrDesc;
  m_intMajor  = intMajor;
  m_intMinor  = intMinor;
}
/**
 * Creates a new timer
 *
 * Parameters: 
 *  uintInitial,the initial expiration time in ms
 *  pCallback,  the routine to call when the timer expires
 *  pData,      pointer to data block accessible for this timer 
 *  uintRepeat, optional, repeat time in ms for subequent calls
 * 
 * Returns:
 *  Pointer to the new timer object   
 */
clsTimer* clsApp::createTimer(unsigned uintInitial,               
                              void (*pCallback)(clsTimer* pTimer),
                              void *pData,
                              unsigned uintRepeat) {
  return new clsTimer(uintInitial, pCallback, pData, uintRepeat);                             
}
/**
 * Access method to get the application description
 */
char* clsApp::getDescription() {
  return m_pstrDesc;
}
/**
 * Access method to get the major version number
 */
int clsApp::getMajor() {
  return m_intMajor;
}
/**
 * Access method to get the minor version number
 */
int clsApp::getMinor() {
  return m_intMinor;
}
/**
 * Access method to get the application title
 */
char* clsApp::getTitle() {
  return m_pstrTitle;
}
/**
 * Writes a message to the debug port
 */
void clsApp::message(char* pstrMessage) {
  if ( pstrMessage != NULL ) {
    Serial.println( pstrMessage );
  } 
}
/**
 * Performs any critical processes, should be included in loop
 */
void clsApp::process() {
// Service any timers
  clsTimer::serviceTimers(); 
}         
/**
 * Sends application start-up message to serial port
 */
void clsApp::startupMsg(bool blnDebug) {
// Set debug status
  m_blnDebug = blnDebug;                 
// Set-up serial port for debugging and information 
  Serial.begin(115200);
 
  if ( m_pstrTitle != NULL ) {
    Serial.println( m_pstrTitle );
  }
  if ( m_pstrDesc != NULL ) {
    Serial.println( m_pstrDesc );
  }
  Serial.print( "Version: ");
  Serial.print( m_intMajor );
  Serial.print( "." );
  Serial.println( m_intMinor );
}

Logged

Kind Regards,
Sy

Global Moderator
Netherlands
Offline Offline
Shannon Member
*****
Karma: 216
Posts: 13663
In theory there is no difference between theory and practice, however in practice there are many...
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


The idea is interesting, the implementation (.h) seems to be over-commented imho - in the header and near every member (thats double ! and don't forget that the code is almost self explaining. Removing part of the comments will increase the readability. tip: Keep the header as that sounds most like a rationale.

Still interesting idea...
Logged

Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

United kingdom
Offline Offline
Full Member
***
Karma: 1
Posts: 195
just think how much free time you would have if everything worked first time!!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ty will do.

I've written this kind of class several times before on various platforms, for java and php, there are always core services that I try to implement which I find useful.  It's sort of a jump start to application development.
Logged

Kind Regards,
Sy

Global Moderator
Netherlands
Offline Offline
Shannon Member
*****
Karma: 216
Posts: 13663
In theory there is no difference between theory and practice, however in practice there are many...
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


Code:
/**
 * Access method to get the major version number
 */
int clsApp::getMajor() {
  return m_intMajor;
}

Please also try to rename the functions to a selfdocumenting level. The sample above could be commentless if you just wrote:

Code:
int clsApp::getMajorVersionNumber()
{
  return m_intMajor;  // m_MajorVersionNumber;
}

Compilers are fast enough to parse those few extra chars, it generates the same footprint and your code will read like proze smiley-wink  even after 6 months.

Note: If you can't get a real good function name it is probably a function that does too many different things.


Logged

Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

United kingdom
Offline Offline
Full Member
***
Karma: 1
Posts: 195
just think how much free time you would have if everything worked first time!!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

It's fine writing functions with long names if you are using an IDE with auto complete...pain in the rear without.

I prefer to have comment headers with all functions, when developing using eclipse, the headers get used to deliver context sensitive help, with directives like @param to denote parameters.
Logged

Kind Regards,
Sy

Global Moderator
Netherlands
Offline Offline
Shannon Member
*****
Karma: 216
Posts: 13663
In theory there is no difference between theory and practice, however in practice there are many...
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


I understand, so you propose that the Arduino IDE needs some auto complete ...  would be nice!
Logged

Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

Pages: [1]   Go Up
Jump to: