|
Got me. But if I was going to try to do that, I'd look at how the free software works from parallax.com, interesting stuff. Basic stamps and PLC's and such.
Best I can do.
Gyrogearloose
|
|
|
|
|
If you're asking how to send data over a serial port, you can open "COM1" as a file using CreateFile() and send characters using WriteFile() . If you're asking something else, you'll have to be a lot clearer.
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
Ok let me lay it out for everyone so they have a cleaer picture.
Free to use
This is the c file I am using.
//RMC Message Parser
// COMPILE: From the command line:
//
// nmake -f gprmc._m_
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <iostream.h>
#include <fstream.h>
#include "mgc.h"
#include "keycode.h"
char DataBuffer[256];
int Port;
double latitude;
double longitude;
double currentlatitude;
double currentlongitude;
/* For error detection */
int ShowMGC32Error(int Code)
{
static char ErrBuffer[128];
mgcErrorText(Code, (char *)ErrBuffer);
printf("%s\n", ErrBuffer);
return Code;
}
/*** main ***/
void main(int argc, char *argv[])
{
int Code;
/* process args */
if(argc!=2)
{
printf("Usage: GPRMC <port>\n");
return;
}
Code = mgcAttach(MGC_KEY_CODE); //checks for proper identification
if(Code<0)
{
printf("Error %d: Cannot attach MGC32.DLL, check key code\n", Code);
return;
}
Port = atoi(argv[1]) - 1; //converts string into an integer
Code = mgcOpen(Port); //opens com
if(Code<0)
{
ShowMGC32Error(Code);
exit(1);
}
printf("GPRMC Test Program\n");
printf("MGC Version %1d.%1d.%1d\n",
mgcGetInteger(MGC_GET_VERSION_DIGIT1),
mgcGetInteger(MGC_GET_VERSION_DIGIT2),
mgcGetInteger(MGC_GET_VERSION_DIGIT3));
// specify which sentence (RMC)
Code = mgcSetInteger(MGC_SET_SENTENCE_TYPE, MGC_SENTENCE_GPRMC);
if(Code<0)
{
ShowMGC32Error(Code);
exit(1);
}
printf("Enter destination latitude: \n");
cin>>latitude;
printf("Enter destination longitude:\n");
cin>>longitude;
printf("Alex Czeto GPS RMC Message Parser Test Version \n");
printf("Date Time V Speed Course Latitude Longitude \n");
printf("==== ==== = ===== ====== ======== ========= \n");
while(1)
{// was any key pressed ?
if(kbhit()) break;
// lock data buffer
mgcLockData(1);
// get date
Code = mgcGetData(GPRMC_DATE,(LPSTR)DataBuffer);
if(Code<0) ShowMGC32Error(Code);
if(Code==1)
{// reference count = 1 (1st time seen this data)
if(Code>0) printf("%5s ", DataBuffer);
// get timestamp
Code = mgcGetData(GPRMC_UTC_TIME,(LPSTR)DataBuffer);
if(Code<0) ShowMGC32Error(Code);
if(Code>0) printf("%5s ", DataBuffer);
// get validity
Code = mgcGetData(GPRMC_VALIDITY,(LPSTR)DataBuffer);
if(Code<0) ShowMGC32Error(Code);
if(Code>0) printf("%s ", DataBuffer);
// get speed
Code = mgcGetData(GPRMC_SPEED,(LPSTR)DataBuffer);
if(Code<0) ShowMGC32Error(Code);
if(Code>0) printf("%5s ", DataBuffer);
// get course
Code = mgcGetData(GPRMC_COURSE,(LPSTR)DataBuffer);
if(Code<0) ShowMGC32Error(Code);
if(Code>0) printf("%5s ", DataBuffer);
// get Latitude
Code = mgcGetData(GPRMC_LATITUDE,(LPSTR)DataBuffer);
currentlatitude=Code;
if(Code<0) ShowMGC32Error(Code);
if(Code>0) printf("%8s ", DataBuffer);
// get North/South
Code = mgcGetData(GPRMC_NORTH_SOUTH,(LPSTR)DataBuffer);
if(Code<0) ShowMGC32Error(Code);
if(Code>0) printf("%s ", DataBuffer);
// get Longitude
Code = mgcGetData(GPRMC_LONGITUDE,(LPSTR)DataBuffer);
if(Code<0) ShowMGC32Error(Code);
if(Code>0) printf("%8s ", DataBuffer);
// get East/West
Code = mgcGetData(GPRMC_EAST_WEST,(LPSTR)DataBuffer);
if(Code<0) ShowMGC32Error(Code);
if(Code>0) printf("%s\n", DataBuffer);
}
// unlock data buffer
mgcLockData(0);
Sleep(200);
}
mgcClose();
} /* end main */
and this is the potentiometer code that is running on the Motorola HC12 microcontroller
* Equate registers addresses
*-------------------------------------------------
copctl equ $0016 ;COP Control Register
mode equ $000b ;mode register
reset equ $fffe ;reset
sp0cr1 equ $00d0 ;spi control register 1
sp0cr2 equ $00d1 ;spi control register 2
sp0br equ $00d2 ;spi boud rate register
sp0sr equ $00d3 ;spi status register
sp0dr equ $00d5 ;spi data register
ports equ $00d6 ;port s data register
ddrs equ $00d7 ;data direction register for port s
purds equ $00db ;pull-up and reduced drive for port s
cs equ $0004 ;chip select (ps2)
*-------------------------------------------------
* Digital POT command and data bytes
*-------------------------------------------------
command equ $13 ;command byte for the digital pot
data equ $50 ;digital value to set the wiper position
*-------------------------------------------------
* Set register values for SPI
*-------------------------------------------------
org $8000 ;program the Flash EEProm
start ldaa #$19 ;special single chip mode
staa mode
ldaa #$00 ;turn off watchdog
staa copctl
ldaa #$5e
staa sp0cr1 ;set control register 1
clra
staa sp0cr2 ;set control register 2
staa sp0br ;set boud rate
staa purds ;set pull-up and reduced drive for ports
ldaa #$ff
staa ddrs ; set data direction register for ports
*-------------------------------------------------
* Program the POT
*-------------------------------------------------
bclr ports,cs ;select digital pot
ldaa #command ;load the command byte
staa sp0dr ;store command byte to the SPI data register
bsr transmit ;program the command byte
ldaa #data ;load the data byte
staa sp0dr
bsr transmit ;program the data byte
bset ports,cs ;deselect digital pot
swi ;software interrupt
*-------------------------------------------------
* Transmit data thru SPI
*-------------------------------------------------
transmit brset sp0sr,$80,done ;wait until the end of transmission
bra transmit
done ldaa sp0sr ;clear SPIF (SPI interrupt request)
ldaa sp0dr ;
rts ;return from subroutine
*-------------------------------------------------
* Set reset vector
*-------------------------------------------------
org reset ;set reset vector
dw start ;upon reset goto 'start'
*=================================================
Basically I need to send a 8bit code from the GPS program to the microcontroller to the data register value in memory. This digital value sets the wiper position on the potentiometer which the microcontroller is wired to.
When the GPS program determines a change in speed is neccesary, the signal will be sent.
|
|
|
|
|
|
Recently I've installed Windows XP on my PC, and now I'm trying to upgrade some of my progs to have the "XP looks". I searched MSDN for the solution, found it, used it, and everything was all right, except that the buttons with bitmaps instead of text didn't change the style. They are still displayed as an ordinary semi-3D rectangles, and frankly I don't know what to do.
If anyone knows a solution to my little problem, I'd be very greatful.
Paksas
|
|
|
|
|
You need to draw your bitmaps/icons to match the XP look and feel; otherwise, you've just got the old '3-D' look. The 'theme' API stuff doesn't take care of drawing your bitmaps with the anti-aliasing and the special lighting. This article[^] on MSDN talks a little bit about how to create icons. They mention this link[^] in the article.
Software Zen: delete this;
|
|
|
|
|
I also found this article[^] that explains the process they expect you to use when creating icons.
Software Zen: delete this;
|
|
|
|
|
If I have a button that creates a modal dialog (dlg.DoModal ()) should that create the dialog box on the fly using the dialog resource file or does it actually maintain it somewhere in memory and just show it again (if it's not the first call)? For example if I open the dialog, disable some controls, closed the dialog, then open it again should those controls still be disabled? Thanks.
- Aaron
|
|
|
|
|
monrobot13 wrote:
For example if I open the dialog, disable some controls, closed the dialog, then open it again should those controls still be disabled? Thanks.
No. It is re-created from scratch from the .rc file.
Neville Franks, Author of ED for Windows www.getsoft.com and coming soon: Surfulater www.surfulater.com
|
|
|
|
|
Hi,
I was wondering if it was possible to change only one member function in a template specifialization
and have the rest the same without having to duplicate the code in the specifialized class?
Thanks.
|
|
|
|
|
Yes--
Just define the specialization of the function in the header file after the template definition.
Like this:
<br />
template <typename foo> class bar {<br />
public :<br />
int func1() { ... }<br />
int func2() { ... }<br />
...<br />
}<br />
<br />
template<> bar<q>::func2()<br />
{<br />
...<br />
}<br />
|
|
|
|
|
hi me again, ive been writting code that fills a vector with random numbers from two sources, all even elements are filled from source1 and odd ones from source2...this now works fine after much debuggingmyhead.
ive been trying to to do next part of my function which is more complex, it basically uses a iterator with a const value of 0.002. which is 20millseconds.
this iterator goes to every single element in the array and goes through every element in 0.002 segments..i.e if element value is 3.6 then it goes through it in 1,800 segements. basically splitting up the element into segments,
and it does this to distingusih between numbers from sourceone and sourcetwo because these numbers are usesd elsewhere.. i will paste the code which fills the vector and ive COMMENTEDout the 'new' but it doesnt work imnot sure what else to do.
#include <iostream><br />
#include <vector><br />
#include <stdlib><br />
#include <time><br />
#include <numeric><br />
#include <algorithm><br />
#include "exponentialgenerator.h"<br />
<br />
using namespace std;<br />
<br />
ExponentialGenerator one = 1.41;<br />
ExponentialGenerator two = 1.71;<br />
<br />
double nextNumber = reinterpret_cast<double>(one.generate());<br />
<br />
double nextNumber2 = reinterpret_cast<double>(two.generate());<br />
<br />
int counter = 0;<br />
<br />
void fillVectorToSum(vector<double>& v, double sum)<br />
{<br />
<br />
int total = 0;<br />
do {<br />
if (counter++ % 2){<br />
v.push_back(nextNumber);<br />
total += nextNumber;<br />
nextNumber = one.generate();<br />
}<br />
else {<br />
v.push_back(nextNumber2);<br />
total += nextNumber2;<br />
nextNumber2 = two.generate();<br />
}<br />
<br />
} while(total+nextNumber+nextNumber2 <= sum);<br />
if(total < sum)<br />
v.push_back(sum-total);<br />
}<br />
<br />
<br />
int main()<br />
{<br />
<br />
srand((unsigned) time(NULL));<br />
vector<double> v;<br />
fillVectorToSum(v, 30);<br />
<br />
cout << "Number of elements: " << v.size() << "\nTotal: "<br />
<< accumulate(v.begin(), v.end(), 0) << endl;<br />
copy(v.begin(), v.end(), ostream_iterator<double> (cout," "));<br />
<br />
<br />
<br />
<br />
<br />
<br />
}
|
|
|
|
|
I would like to determine if a computer is a member of domain or not.
I tried GetPDC but it seem to be returning the workgroup's name.
Enumerating network is also useless, since it is returning other standalone machine's names.
Any ideas about how to do this?
Orcun Colak
|
|
|
|
|
Use NetWkstaGetInfo() .
"The pointy end goes in the other man." - Antonio Banderas (Zorro, 1998)
|
|
|
|
|
|
In my view class in the LButtonDown()I have
CPaintDC dc;
CRect c;
GetClientRect(&c);
dc.TextOut(c.Width()/2, c.Height()/2," abc");
I dont see the text when I click.
DO I need a different kind of DC? I was actually trying to do DrawIcon but when i didnt see the icon, I thought I'd see if textout worked....neither does..
thanks,
ns
|
|
|
|
|
Try CClientDC instead of CPaintDC.
MSN Messenger.
prakashnadar@msn.com
Tip of the day of visual C++ IDE.
"We use it before you do! Visual C++ was developed using Visual C++"
|
|
|
|
|
Thanks! The textout works. But this doesnt still:
dc.DrawIcon( f, w, hIcon3);
Does this need yet some other special DC? Why wasnt PaintDC suitable for TextOut? How do you choose which type of DC to use?
Thanks again,
ns
|
|
|
|
|
Imho drawing in mouse message handler is not a good practice. Does your picture should stay after you release button? Try placing other application above yours, and your picture will be lost.
Igor Green
http://www.grigsoft.com/ - files and folders comparison tools
|
|
|
|
|
ns wrote:
Why wasnt PaintDC suitable for TextOut
It wasn't that the CPaintDC wasn't suitable for a TextOut call it's that it wasn't suitable for where you were using it. CPaintDC should only be used in an OnPaint message handler. The reason behind this, as far as I know, is that it calls some functions (BeginPaint, EndPaint) that set the update region (area you can actually "paint" in) and in your button handler there probably hasn't been any part of your window that's been invalidated, therefore a CPaintDC wouldn't have any valid drawing area.
- Aaron
|
|
|
|
|
在这个论坛上必须发英文吗
I'm sorry!
I can't speak english
CDC* dc;
dc = GetDC();
dc->textout();
d
|
|
|
|
|
I use some structures in an app using pointers, basically everytime the program gets updated these addresses change slightly, I usually get told by someone what the address is.
Basically I want to be able to automatically find the address of the structure in the app, but i'm not sure how to do it.. I think i remember someone saying pattern searching or something.
Any help is appreciated.
|
|
|
|
|
I think I know what you are asking, but your comments make me think otherwise. Have you tried the address-of operator?
"The pointy end goes in the other man." - Antonio Banderas (Zorro, 1998)
|
|
|
|
|
What do you use the address for ? is it a memeory address or a file offset number ?
MSN Messenger.
prakashnadar@msn.com
Tip of the day of visual C++ IDE.
"We use it before you do! Visual C++ was developed using Visual C++"
|
|
|
|
|
Your question is not clear.
Gurmeet S. Kochar
If you believe in God, it's because of the Devil
|
|
|
|