Pages: 1 ... 3 4 [5] 6   Go Down
Author Topic: Messenger library  (Read 22240 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 1
Posts: 200
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi tof,

I can see a lot of potential for this library.
Thanks for your efforts.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

in the examples you may consider changing:
#include <Messenger.h>
to
#include "Messenger.h"

to enable people to simply place the .h file in the sketch's directory
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 45
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

is there a proper way to handle command errors or a proper way to reset or clear?
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 45
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I think I fixed the problem. it took me forever to trace down the actual root, and it turns out pretty simple.

in the example basic_communication, I change line 21:
  while ( message.available() ) {
to this:
  if(messenger.available()){

this seems to fix my problems. no more lock ups caused by an endless loop. the incoming serial data is sent to the messenger class one character at a time anyway, so it can never have 2 separate commands in buffer at the same time. so no need to use a "while" loop.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 1
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

many many many ......millions of thianks.
this library have help me to solve a big trouble.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 23
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Dear all,

I have added a readDouble function inside the Messenger library, for my own needs. For this, I have added the following line
double readDouble();
in Messenger.h, right after the int readInt();
Then I added the following function in Messenger.cpp
double Messenger::readDouble() {

    if (next()) {
          dumped = 1;
          return atof(current);
     }
  return 0;
}

The same thing could be done for floats.
Best regards,

Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 45
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I have a question. can I include the library in the zip I'm posting for my project? I'd like to package the .h and .cpp files with my code. I'd like to do this to make it easier for people to use my project, and in case there are any changes to the library that might break my code, so I can fix it before releasing a new package. is this ok to do?
Logged

Raleigh, NC
Offline Offline
Newbie
*
Karma: 0
Posts: 20
Big Iron
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I would also like to thank the author for this library - I have been able to implement a much more sophisticated command handling protocol to my project with this library.  I was using a switch case before and it was murder.

Thanks!
Logged

0
Offline Offline
Full Member
***
Karma: 1
Posts: 211
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Great stuff... to make it lil better for my needs I created a fork on github:

http://github.com/nofxx/Messenger

Dunno if the author is still around but you create yours there I'll dump mine and fork.  Thank you.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 2
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi everyone.

Can anyone point me at a url, or other source, showing Messenger being used in a Max patch?  I am new to Max and can't figure out what kind of message it is expecting at its input.  Thanks!

ST
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 1
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I added this line to the Messenger.cpp file so that I could use the serial port monitor to enter commands:

      case 13: // CR
     case ';':  // to enable serial port monitor use
         buffer[bufferIndex]=0;

It also allows you to enter multiple commands separated by a ';' on the same line.

You must end each command and each line with a ';' when using the Arduino serial port monitor.

It is NOT necessary to append a ';' if you are sending a CR (ie using a standard terminal emulator or from a Processing sketch).

Adding this line implies that your Messenger commands can't have ';' in them...
« Last Edit: October 28, 2010, 09:44:22 am by agdemars » Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 3
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,
    I'm having trouble to compile your code with my Makefile, it's working fine with the Arduino IDE but not with my command line Makefile, I'm unable to find out why and would like little help.

Here's the error message I got

Code:
/usr/bin/avr-gcc -Os -lm -lgcc -Wl,--gc-sections -mmcu=atmega1280 -o applet/test.elf applet/test.o applet/core.a
/usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr51/libc.a(cmpsf2.o):../../../libm/fplib/cmpsf2.S:58: multiple definition of `__ltsf2'
/usr/lib/gcc/avr/4.3.5/avr51/libgcc.a(_lt_sf.o):(.text+0x0): first defined here
make: *** [applet/test.elf] Error 1


And here is my Makefile

Code:
# $Id$

TARGET = $(notdir $(CURDIR))
INSTALL_DIR = $(HOME)/Desktop/arduino-0018
PORT = /dev/ttyUSB0
UPLOAD_RATE = 57600
#UPLOAD_RATE = 19200

AVRDUDE_PROGRAMMER = stk500v1
#MCU = atmega328p
#MCU = atmega168
MCU = atmega1280

F_CPU = 16000000

############################################################################
# Below here nothing should be changed...

VERSION=18
ARDUINO = $(INSTALL_DIR)/hardware/arduino/cores/arduino
#AVR_TOOLS_PATH = $(INSTALL_DIR)/hardware/tools/avr/bin
AVR_TOOLS_PATH = /usr/bin
AVRDUDE_PATH = $(INSTALL_DIR)/hardware/tools
C_MODULES =  \
$(ARDUINO)/wiring_pulse.c \
$(ARDUINO)/wiring_analog.c \
$(ARDUINO)/pins_arduino.c \
$(ARDUINO)/wiring.c \
$(ARDUINO)/wiring_digital.c \
$(ARDUINO)/WInterrupts.c \
$(ARDUINO)/wiring_shift.c \
$(INSTALL_DIR)/libraries/Wire/utility/twi.c \
$(INSTALL_DIR)/libraries/etherShield/ip_arp_udp_tcp.c \
$(INSTALL_DIR)/libraries/etherShield/enc28j60.c
# end of C_MODULES

CXX_MODULES = \
$(ARDUINO)/main.cpp \
$(ARDUINO)/WMath.cpp \
$(ARDUINO)/Print.cpp \
$(ARDUINO)/HardwareSerial.cpp \
$(INSTALL_DIR)/libraries/OneWire/OneWire.cpp \
$(INSTALL_DIR)/libraries/Wire/Wire.cpp \
$(INSTALL_DIR)/libraries/EEPROM/EEPROM.cpp \
$(INSTALL_DIR)/libraries/LiquidCrystal/LiquidCrystal.cpp \
$(INSTALL_DIR)/libraries/Spi/Spi.cpp \
$(INSTALL_DIR)/libraries/Mirf/mirf.cpp \
$(INSTALL_DIR)/libraries/Time/Time.cpp \
$(INSTALL_DIR)/libraries/TimeAlarms/TimeAlarms.cpp \
$(INSTALL_DIR)/libraries/DS1307RTC/DS1307RTC.cpp \
$(INSTALL_DIR)/libraries/Tone/Tone.cpp \
$(INSTALL_DIR)/libraries/etherShield/etherShield.cpp \
$(INSTALL_DIR)/libraries/Messenger/Messenger.cpp \


# end of CXX_MODULES

CXX_APP = applet/$(TARGET).cpp
MODULES = $(C_MODULES) $(CXX_MODULES)
SRC = $(C_MODULES)
CXXSRC = $(CXX_MODULES) $(CXX_APP)
FORMAT = ihex


# Name of this Makefile (used for "make depend").
MAKEFILE = Makefile

# Debugging format.
# Native formats for AVR-GCC's -g are stabs [default], or dwarf-2.
# AVR (extended) COFF requires stabs, plus an avr-objcopy run.
#DEBUG = stabs
DEBUG =

OPT = s

# Place -D or -U options here
CDEFS = -DF_CPU=$(F_CPU)L -DARDUINO=$(VERSION)
CXXDEFS = -DF_CPU=$(F_CPU)L -DARDUINO=$(VERSION)

# Place -I options here
CINCS = -I$(ARDUINO) -I$(INSTALL_DIR)/libraries/Wire -I$(INSTALL_DIR)/libraries/Wire/utility -I$(INSTALL_DIR)/libraries/OneWire -I$(INSTALL_DIR)/libraries/DS1307 -I$(INSTALL_DIR)/libraries/EEPROM -I$(INSTALL_DIR)/libraries/LiquidCrystal -I$(INSTALL_DIR)/libraries/Spi -I$(INSTALL_DIR)/libraries/Mirf -I../ -I$(INSTALL_DIR)/libraries/Time -I$(INSTALL_DIR)/libraries/DS1307RTC -I$(INSTALL_DIR)/libraries/TimeAlarms -I$(INSTALL_DIR)/libraries/Tone -I$(INSTALL_DIR)/libraries/etherShield -I$(INSTALL_DIR)/libraries/Messenger

CXXINCS = -I$(ARDUINO)

# Compiler flag to set the C Standard level.
# c89   - "ANSI" C
# gnu89 - c89 plus GCC extensions
# c99   - ISO C99 standard (not yet fully implemented)
# gnu99 - c99 plus GCC extensions
#CSTANDARD = -std=gnu99
CDEBUG = -g$(DEBUG)
#CWARN = -Wall -Wstrict-prototypes
#CWARN = -Wall   # show all warnings
CWARN = -w      # suppress all warnings
####CTUNING = -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
CTUNING = -ffunction-sections -fdata-sections
CXXTUNING = -fno-exceptions -ffunction-sections -fdata-sections
#CEXTRA = -Wa,-adhlns=$(<:.c=.lst)

CFLAGS = $(CDEBUG) -O$(OPT) $(CWARN) $(CTUNING) $(CDEFS) $(CINCS) $(CSTANDARD) $(CEXTRA)
CXXFLAGS = $(CDEBUG) -O$(OPT) $(CWARN) $(CXXTUNING) $(CDEFS) $(CINCS)
#ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs
LDFLAGS = -O$(OPT) -lm -lgcc -Wl,--gc-sections


# Programming support using avrdude. Settings and variables.
AVRDUDE_PORT = $(PORT)
AVRDUDE_WRITE_FLASH = -U flash:w:applet/$(TARGET).hex

#AVRDUDE_FLAGS = -V -F -C $(INSTALL_DIR)/hardware/tools/avr/etc/avrdude.conf \

AVRDUDE_FLAGS = -V -F -C $(INSTALL_DIR)/hardware/tools/avrdude.conf \
-p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) \
-b $(UPLOAD_RATE)

# Program settings
CC = $(AVR_TOOLS_PATH)/avr-gcc
CXX = $(AVR_TOOLS_PATH)/avr-g++
LD = $(AVR_TOOLS_PATH)/avr-gcc
OBJCOPY = $(AVR_TOOLS_PATH)/avr-objcopy
OBJDUMP = $(AVR_TOOLS_PATH)/avr-objdump
AR  = $(AVR_TOOLS_PATH)/avr-ar
SIZE = $(AVR_TOOLS_PATH)/avr-size
NM = $(AVR_TOOLS_PATH)/avr-nm
AVRDUDE = $(AVRDUDE_PATH)/avrdude
REMOVE = rm -f
MV = mv -f

# Define all object files.
OBJ = $(SRC:.c=.o) $(CXXSRC:.cpp=.o) $(ASRC:.S=.o)
OBJ_MODULES = $(C_MODULES:.c=.o) $(CXX_MODULES:.cpp=.o)

# Define all listing files.
LST = $(ASRC:.S=.lst) $(CXXSRC:.cpp=.lst) $(SRC:.c=.lst)

# Combine all necessary flags and optional flags.
# Add target processor to flags.
ALL_CFLAGS = $(CFLAGS) -mmcu=$(MCU)
ALL_CXXFLAGS = $(CXXFLAGS) -mmcu=$(MCU)
ALL_ASFLAGS = -x assembler-with-cpp $(ASFLAGS) -mmcu=$(MCU)
ALL_LDFLAGS = $(LDFLAGS) -mmcu=$(MCU)

# Default target.
all: applet_files build sizeafter

build: elf hex

#applet_files: $(TARGET).pde
applet/$(TARGET).cpp: $(TARGET).pde
      # Here is the "preprocessing".
      # It creates a .cpp file based with the same name as the .pde file.
      # On top of the new .cpp file comes the WProgram.h header.
      # and prototypes for setup() and Loop()
      # Then the .cpp file will be compiled. Errors during compile will
      # refer to this new, automatically generated, file.
      # Not the original .pde file you actually edit...
      test -d applet || mkdir applet
      echo '#include "WProgram.h"' > applet/$(TARGET).cpp
      echo 'void setup();' >> applet/$(TARGET).cpp
      echo 'void loop();' >> applet/$(TARGET).cpp
      cat $(TARGET).pde >> applet/$(TARGET).cpp

elf: applet/$(TARGET).elf
hex: applet/$(TARGET).hex
eep: applet/$(TARGET).eep
lss: applet/$(TARGET).lss
sym: applet/$(TARGET).sym

# Program the device.  
upload: applet/$(TARGET).hex
      python ~/test.py $(PORT)
      $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH)


      # Display size of file.
HEXSIZE = $(SIZE) --target=$(FORMAT) applet/$(TARGET).hex
ELFSIZE = $(SIZE)  applet/$(TARGET).elf
sizebefore:
      @if [ -f applet/$(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(HEXSIZE); echo; fi

sizeafter:
      @if [ -f applet/$(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(HEXSIZE); echo; fi


# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
COFFCONVERT=$(OBJCOPY) --debugging \
--change-section-address .data-0x800000 \
--change-section-address .bss-0x800000 \
--change-section-address .noinit-0x800000 \
--change-section-address .eeprom-0x810000


coff: applet/$(TARGET).elf
      $(COFFCONVERT) -O coff-avr applet/$(TARGET).elf $(TARGET).cof


extcoff: $(TARGET).elf
      $(COFFCONVERT) -O coff-ext-avr applet/$(TARGET).elf $(TARGET).cof


.SUFFIXES: .elf .hex .eep .lss .sym

.elf.hex:
      $(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@

.elf.eep:
      $(OBJCOPY) -O $(FORMAT) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
      --no-change-warnings \
      --change-section-lma .eeprom=0 $< $@

# Create extended listing file from ELF output file.
.elf.lss:
      $(OBJDUMP) -h -S $< > $@

# Create a symbol table from ELF output file.
.elf.sym:
      $(NM) -n $< > $@

      # Link: create ELF output file from library.
#applet/$(TARGET).elf: $(TARGET).pde applet/core.a
applet/$(TARGET).elf: applet/$(TARGET).o applet/core.a
      $(LD) $(ALL_LDFLAGS) -o $@ applet/$(TARGET).o applet/core.a

applet/core.a: $(OBJ_MODULES)
      @for i in $(OBJ_MODULES); do echo $(AR) rcs applet/core.a $$i; $(AR) rcs applet/core.a $$i; done



# Compile: create object files from C++ source files.
.cpp.o:
      $(CXX) -c $(ALL_CXXFLAGS) $< -o $@

# Compile: create object files from C source files.
.c.o:
      $(CC) -c $(ALL_CFLAGS) $< -o $@


# Compile: create assembler files from C source files.
.c.s:
      $(CC) -S $(ALL_CFLAGS) $< -o $@


# Assemble: create object files from assembler source files.
.S.o:
      $(CC) -c $(ALL_ASFLAGS) $< -o $@


# Automatic dependencies
%.d: %.c
      $(CC) -lm -M $(ALL_CFLAGS) $< | sed "s;$(notdir $*).o:;$*.o $*.d:;" > $@

%.d: %.cpp
      $(CXX) -M $(ALL_CXXFLAGS) $< | sed "s;$(notdir $*).o:;$*.o $*.d:;" > $@


# Target: clean project.
clean:
      $(REMOVE) applet/$(TARGET).hex applet/$(TARGET).eep applet/$(TARGET).cof applet/$(TARGET).elf \
      applet/$(TARGET).map applet/$(TARGET).sym applet/$(TARGET).lss applet/core.a \
      $(OBJ) $(LST) $(SRC:.c=.s) $(SRC:.c=.d) $(CXXSRC:.cpp=.s) $(CXXSRC:.cpp=.d)

.PHONY:      all build elf hex eep lss sym program coff extcoff clean applet_files sizebefore sizeafter

#include $(SRC:.c=.d)
#include $(CXXSRC:.cpp=.d)


If anyone can help me it will be greatly appreciated because I'm always coding remotely in console and Arduino IDE is not an option for me.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 2
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset



hey, i have a simple question:

Im using processing to send to arduino with messenger.
4 integers (from 0 to 1023) should be transmitted in one block in order to drive two servos.
Therefore I need the most possible speed. But the first test showed, that the communication doesn't clearly get the integers right. Using the Arduinos SerialMonitor to print the received numbers out, I get something like this (from time to time):

1000
1001
1002
100310
10
0
1002
1003

but it should look like this:
1000
1001
1002
1003
1000
1001
1002
1003

so is the transmitting-speed to fast? Or cant i use Arduinos SerialMonitor while receiving from Processing?

Any other idea how to send 4 integers very fast to arduino without any mistakes.  

big thx!
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 6
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Has anyone had any success with this library and parsing larger data strings from the duino buffer?

I'm using it with the Libelium GPRS shield and it's working perfectly for short AT commands and responses, but when I try to request a data block via TCP (e.g. trying to download something like (note < 128 bytes):

CONNECT
HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Cache-Control: no-cache
Expires: Fri, 01 Jan 1990 00--EOF--Pattern--
OK
+KTCP_DATA: 1,99

It seems to make arbitrary message breaks.  I'm using a rare separator like 6 (ACK) because i want to download each line of response as a separate message, and deal with them as full strings.

I wonder if the problem is my data is getting sent back with LF's instead of CRs so the library doesn't know where to break it?

Is this a totally inappropriate use of the library?

Cheers for any thoughts
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 22
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,

i have an easy question. How to Install Messanger ?

Normaly i put the Folder from the Zip to libraries but when i do it with the Messanger there many subfolders an Process cant find the new Lib ?

Sorry for my bad english.

Stefan
Logged

Pages: 1 ... 3 4 [5] 6   Go Up
Jump to: