mirror of
https://github.com/felis/USB_Host_Shield_2.0.git
synced 2024-03-22 11:31:26 +01:00
Scale example added
This commit is contained in:
parent
6993e811c6
commit
254ff72e55
3 changed files with 279 additions and 0 deletions
56
examples/HID/scale/scale.ino
Normal file
56
examples/HID/scale/scale.ino
Normal file
|
@ -0,0 +1,56 @@
|
|||
/* Digital Scale Output. Written for Stamps.com Model 510 */
|
||||
/* 5lb Digital Scale; any HID scale with Usage page 0x8d should work */
|
||||
|
||||
#include <avr/pgmspace.h>
|
||||
|
||||
#include <avrpins.h>
|
||||
#include <max3421e.h>
|
||||
#include <usbhost.h>
|
||||
#include <usb_ch9.h>
|
||||
#include <Usb.h>
|
||||
#include <usbhub.h>
|
||||
#include <avr/pgmspace.h>
|
||||
#include <address.h>
|
||||
#include <hid.h>
|
||||
#include <hiduniversal.h>
|
||||
|
||||
#include "scale_rptparser.h"
|
||||
|
||||
#include <printhex.h>
|
||||
#include <message.h>
|
||||
#include <hexdump.h>
|
||||
#include <parsetools.h>
|
||||
|
||||
USB Usb;
|
||||
USBHub Hub(&Usb);
|
||||
HIDUniversal Hid(&Usb);
|
||||
Max_LCD LCD(&Usb);
|
||||
ScaleEvents ScaleEvents(&LCD);
|
||||
ScaleReportParser Scale(&ScaleEvents);
|
||||
|
||||
void setup()
|
||||
{
|
||||
Serial.begin( 115200 );
|
||||
Serial.println("Start");
|
||||
|
||||
if (Usb.Init() == -1)
|
||||
Serial.println("OSC did not start.");
|
||||
|
||||
// set up the LCD's number of rows and columns:
|
||||
LCD.begin(16, 2);
|
||||
LCD.clear();
|
||||
LCD.home();
|
||||
LCD.setCursor(0,0);
|
||||
LCD.write('R');
|
||||
|
||||
delay( 200 );
|
||||
|
||||
if (!Hid.SetReportParser(0, &Scale))
|
||||
ErrorMessage<uint8_t>(PSTR("SetReportParser"), 1 );
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
Usb.Task();
|
||||
}
|
||||
|
150
examples/HID/scale/scale_rptparser.cpp
Normal file
150
examples/HID/scale/scale_rptparser.cpp
Normal file
|
@ -0,0 +1,150 @@
|
|||
/* Parser for standard HID scale (usage page 0x8d) data input report (ID 3) */
|
||||
#include "scale_rptparser.h"
|
||||
|
||||
const char* UNITS[13] = {
|
||||
"units", // unknown unit
|
||||
"mg", // milligram
|
||||
"g", // gram
|
||||
"kg", // kilogram
|
||||
"cd", // carat
|
||||
"taels", // lian
|
||||
"gr", // grain
|
||||
"dwt", // pennyweight
|
||||
"tonnes", // metric tons
|
||||
"tons", // avoir ton
|
||||
"ozt", // troy ounce
|
||||
"oz", // ounce
|
||||
"lbs" // pound
|
||||
};
|
||||
|
||||
ScaleReportParser::ScaleReportParser(ScaleEvents *evt) :
|
||||
scaleEvents(evt)
|
||||
{}
|
||||
|
||||
void ScaleReportParser::Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
|
||||
{
|
||||
bool match = true;
|
||||
|
||||
// Checking if there are changes in report since the method was last called
|
||||
for (uint8_t i=0; i<RPT_SCALE_LEN; i++) {
|
||||
if( buf[i] != oldScale[i] ) {
|
||||
match = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
// Calling Game Pad event handler
|
||||
if (!match && scaleEvents) {
|
||||
scaleEvents->OnScaleChanged((const ScaleEventData*)buf);
|
||||
|
||||
for (uint8_t i=0; i<RPT_SCALE_LEN; i++) oldScale[i] = buf[i];
|
||||
}
|
||||
}
|
||||
|
||||
ScaleEvents::ScaleEvents( Max_LCD* pLCD ) :
|
||||
|
||||
pLcd( pLCD )
|
||||
|
||||
{}
|
||||
|
||||
void ScaleEvents::LcdPrint( const char* str )
|
||||
{
|
||||
|
||||
while( *str ) {
|
||||
|
||||
pLcd->write( *str++ );
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void ScaleEvents::OnScaleChanged(const ScaleEventData *evt)
|
||||
{
|
||||
|
||||
pLcd->clear();
|
||||
pLcd->home();
|
||||
pLcd->setCursor(0,0);
|
||||
|
||||
if( evt->reportID != 3 ) {
|
||||
|
||||
const char inv_report[]="Invalid report!";
|
||||
|
||||
Serial.println(inv_report);
|
||||
LcdPrint(inv_report);
|
||||
|
||||
return;
|
||||
|
||||
}//if( evt->reportID != 3...
|
||||
|
||||
switch( evt->status ) {
|
||||
|
||||
case REPORT_FAULT:
|
||||
Serial.println(F("Report fault"));
|
||||
break;
|
||||
|
||||
case ZEROED:
|
||||
Serial.println(F("Scale zero set"));
|
||||
break;
|
||||
|
||||
case WEIGHING: {
|
||||
|
||||
const char progress[] = "Weighing...";
|
||||
Serial.println(progress);
|
||||
LcdPrint(progress);
|
||||
break;
|
||||
}
|
||||
|
||||
case WEIGHT_VALID: {
|
||||
|
||||
char buf[10];
|
||||
double weight = evt->weight * pow( 10, evt->exp );
|
||||
|
||||
|
||||
|
||||
Serial.print(F("Weight: "));
|
||||
Serial.print( weight );
|
||||
Serial.print(F(" "));
|
||||
Serial.println( UNITS[ evt->unit ]);
|
||||
|
||||
LcdPrint("Weight: ");
|
||||
dtostrf( weight, 4, 2, buf );
|
||||
LcdPrint( buf );
|
||||
LcdPrint( UNITS[ evt->unit ]);
|
||||
|
||||
break;
|
||||
|
||||
}//case WEIGHT_VALID...
|
||||
|
||||
case WEIGHT_NEGATIVE: {
|
||||
|
||||
const char negweight[] = "Negative weight";
|
||||
Serial.println(negweight);
|
||||
LcdPrint(negweight);
|
||||
break;
|
||||
}
|
||||
|
||||
case OVERWEIGHT: {
|
||||
|
||||
const char overweight[] = "Max.weight reached";
|
||||
Serial.println(overweight);
|
||||
LcdPrint( overweight );
|
||||
break;
|
||||
}
|
||||
|
||||
case CALIBRATE_ME:
|
||||
|
||||
Serial.println(F("Scale calibration required"));
|
||||
break;
|
||||
|
||||
case ZERO_ME:
|
||||
|
||||
Serial.println(F("Scale zeroing required"));
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
Serial.print(F("Undefined status code: "));
|
||||
Serial.println( evt->status );
|
||||
break;
|
||||
|
||||
}//switch( evt->status...
|
||||
|
||||
}
|
73
examples/HID/scale/scale_rptparser.h
Normal file
73
examples/HID/scale/scale_rptparser.h
Normal file
|
@ -0,0 +1,73 @@
|
|||
#if !defined(__SCALERPTPARSER_H__)
|
||||
#define __SCALERPTPARSER_H__
|
||||
|
||||
#include <inttypes.h>
|
||||
#include <avr/pgmspace.h>
|
||||
#include "avrpins.h"
|
||||
#include "max3421e.h"
|
||||
#include "usbhost.h"
|
||||
#include "usb_ch9.h"
|
||||
#include "Usb.h"
|
||||
#include "Max_LCD.h"
|
||||
|
||||
#if defined(ARDUINO) && ARDUINO >=100
|
||||
#include "Arduino.h"
|
||||
#else
|
||||
#include <WProgram.h>
|
||||
#endif
|
||||
|
||||
#include "printhex.h"
|
||||
#include "hexdump.h"
|
||||
#include "message.h"
|
||||
#include "confdescparser.h"
|
||||
#include "hid.h"
|
||||
|
||||
/* Scale status constants */
|
||||
#define REPORT_FAULT 0x01
|
||||
#define ZEROED 0x02
|
||||
#define WEIGHING 0x03
|
||||
#define WEIGHT_VALID 0x04
|
||||
#define WEIGHT_NEGATIVE 0x05
|
||||
#define OVERWEIGHT 0x06
|
||||
#define CALIBRATE_ME 0x07
|
||||
#define ZERO_ME 0x08
|
||||
|
||||
/* input data report */
|
||||
struct ScaleEventData
|
||||
{
|
||||
uint8_t reportID; //must be 3
|
||||
uint8_t status;
|
||||
uint8_t unit;
|
||||
int8_t exp; //scale factor for the weight
|
||||
uint16_t weight; //
|
||||
};
|
||||
|
||||
class ScaleEvents
|
||||
{
|
||||
|
||||
Max_LCD* pLcd;
|
||||
|
||||
void LcdPrint( const char* str );
|
||||
|
||||
public:
|
||||
|
||||
ScaleEvents( Max_LCD* pLCD );
|
||||
|
||||
virtual void OnScaleChanged(const ScaleEventData *evt);
|
||||
};
|
||||
|
||||
#define RPT_SCALE_LEN sizeof(ScaleEventData)/sizeof(uint8_t)
|
||||
|
||||
class ScaleReportParser : public HIDReportParser
|
||||
{
|
||||
ScaleEvents *scaleEvents;
|
||||
|
||||
uint8_t oldScale[RPT_SCALE_LEN];
|
||||
|
||||
public:
|
||||
ScaleReportParser(ScaleEvents *evt);
|
||||
|
||||
virtual void Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
|
||||
};
|
||||
|
||||
#endif // __SCALERPTPARSER_H__
|
Loading…
Reference in a new issue