Version 13 (modified by 11 years ago) ( diff ) | ,
---|
StartRepeatMulti
Start repeating communications from main board to report weights, I/O status, COM3, COM4 and optionally input counters.
int StartRepeatMulti(uint32 interval, struct mnbd_multi_rep_counters_struct& counters);
int StartRepeatMulti(uint32 interval, struct mnbd_multi_rep_counters_struct* counters = NULL);
Parameters
- interval - update interval in milliseconds
- counters - structure to define any DIO counters to be reported
Return Value
- Returns the result - OK success
Remarks
The main board or option card must already be opened by calling OpenMnBd first. The call does a wait for acknowledgement. If the application is using main board communication events these events may be called during the wait for acknowledgement. COM3 (and COM4 on new style 2012 main board) receive data is also reported.
Examples
if(StartRepeatMulti(100) == OK) DisplayText(0, 0, "Wt and I/O 10 times per second");
int bd = 1; int inp = 8; SetDIOCounter(bd, inp, dioSetCount, 0, WAIT_ACK); SetDIOCounter(bd, inp, dioSetPrescaler, 1, WAIT_ACK); SetDIOCounter(bd, inp, dioSetCountUp, 0, WAIT_ACK); SetDIOCounter(bd, inp, dioSetCountLowToHigh, 0, WAIT_ACK); SetDIOCounter(bd, inp, dioEnableCounter, 0, WAIT_ACK); struct mnbd_multi_rep_counters_struct counters; memset(&counters, 0, sizeof(counters)); counters.cnt1_bd = bd; counters.cnt1_input = inp; if(StartRepeatMulti(100, counters) == OK) DisplayText(0, 0, "Wt, I/O, cnt 10 times per second");
Here is an example of a complete sample application:
repeatmulti.h:
#ifndef REPEATMULTI_H_ #define REPEATMULTI_H_ EVENT(MainScreenShow); BACKGROUND_EVENT(Comm); MNBD_EVENT(MultiRcv); EVENT(Exit); int MnBdSerialDataRcv(int nPort, int nLen, unsigned char* data); #endif /* REPEATMULTI_H_ */
repeatmulti.cpp:
#include "cardinal825.h" #include "repeatmulti.h" int main() { InitLCD(); SetCurColor(COLOR_ATTENTION); DisplayText(0, 0, "Repeat Multi Example"); ReadTouchCal(); OpenBeeper(); OpenTouch(); MnBdStartup(); MnBdSetEvent(MNBD_REQ_REP_MULTI, MnBdEventMultiRcv); // Set the comm event to our MnBdSerialDataRcv function to receive serial port data from COM3 and COM4 MnBdSetCommEvent(MnBdSerialDataRcv); SetBackgroundEvent(BackgroundEventComm); if(StartRepeatMulti(100) != OK) { DisplayText(0, FONT_HEIGHT, "Error starting repeat multi"); return 0; } FORM_INIT(Main, EventMainScreenShow, NULL, NULL, NULL, nFormFlgNone); FORM_ADD_BUTTON(Main, Exit, 0, FONT_HEIGHT * 12, " Exit ", 'X', EventExit, FORM_BUTTON_INVERT); FORM_SHOW(Main); FORM_RUN(Main); FORM_HIDE(Main); MnBdClearCommEvent(); StopRepeatMulti(); SetBackgroundEvent(NULL); MnBdShutdown(); return 0; } EVENT(MainScreenShow) { ClearLCD(); SetCurColor(COLOR_ATTENTION); DisplayText(0, 0, "Repeat Multi Example"); ResetPrevGrossWt(); return 0; } EVENT(Exit) { return 1; // return non-zero to exit form } MNBD_EVENT(MultiRcv) { int n; for(n = 1; n <= GetNumScales(); n++) { if(IsGrossWtChanged(n)) { DisplayText(0, (FONT_HEIGHT * n) + FONT_HEIGHT, GetChangedGrossWt(n)); } } return 0; } BACKGROUND_EVENT(Comm) { // Use MnBdRead directly to prevent overhead of MnBdProcess // MnBdRead will call event MultiRcv that we registered previously when scale and DIO status is received int n; // in case we have more I/O cards than scales change this for(n = 0; n <= GetNumScales(); n++) { // 0 = MNBD_DEV, 1 .. Scales and I/O cards MnBdRead(n); } return 0; } struct mnbd_serial_struct { char buffer[100]; int pos; } mnbd_serial[2] = { { "", 0 }, { "", 0 } }; // Called automatically during MnBdRead if serial data is read int MnBdSerialDataRcv(int nPort, int nLen, unsigned char* data) { int n; for(n = 0; n < nLen; n++) { if(data[n] == '\r') { mnbd_serial[nPort].buffer[mnbd_serial[nPort].pos] = '\0'; // Terminate the string printf("rcv com %d [%s]\r\n", nPort + 3, mnbd_serial[nPort].buffer); mnbd_serial[nPort].pos = 0; } else if(mnbd_serial[nPort].pos < 99) // prevent buffer overflow { mnbd_serial[nPort].buffer[mnbd_serial[nPort].pos++] = data[n]; } } return 0; }
See Also
Note:
See TracWiki
for help on using the wiki.