Como ficaria o Código abaixo em Harbour???

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Como ficaria o Código abaixo em Harbour???

Mensagem por fladimir »

Pessoal no xHarbour tem o Init_Port e demais funções q caso não esteja enganado são da lib HBCOMM, mas no Harbour não encontrei correlatas...

então:

como ficaria o codigo abaixo em Harbour?

Código: Selecionar todos

Function LerBalanca(nPeso,lBalanc)
Public cPesoLido := 0

If lBalanc==.f.
   Return .f.
Endif
	 
// Colooquei para carregar valores nas variaveis

cBalPorta      := "COM1" //cScan_Porta //'COM5 '
nBalVelocidade := 9600   //nScan_Veloc //9600
nBalBits       := 8      //nScan_Bists //8
nBalParidade   := 0      //nScan_Parid //0
nBalStopBits  	:= 1      //nScan_BStop // 1

If nPeso > 0
   Return .t.
Endif
If Empty(cBalPorta)
   Return .t.
Endif

cPort       := cBalPorta
nBaudrate   := nBalVelocidade
nDatabits   := nBalBits
nParity     := nBalParidade
nStopbits   := nBalStopBits
nBuffersize := 1000

nHandle:= Init_Port( cPort, nBaudrate, nDatabits, nParity, nStopbits, nBuffersize )
   
If nHandle <= 0
   alert("Erro ao iniciar a porta de comunicacao !")
   Return .f.
Endif

If IsWorking( nHandle )== .F.
   Alert("Favor configurar a porta serial !")
   Return .f.
Endif
OutBufClr( nHandle )


//-- Enviar comando para iniciar a transmissao de dados para balanca MP
cBytesToWrite := Chr(5)
nCount        := 1
OutChr( nHandle, cBytesToWrite, nCount )

//-- Aguarda um tempinho
Millisec(100)
cBuff := Space(10)
nChar := InBufSize( nHandle )
nLidos:= InChr( nHandle,nChar,@cBuff )

If nLidos > 0
   *cPesoLido  := Val(Substr(cBuff,2,5)) /1000
   cPesoLido  := Val(Substr(cBuff,2,7))        // Coloquei 7 devido a MF-C, pois na pluris com 6 funcionou
   cPesoLido  := cPesoLido // * (0.001) 
   mQuant     := cPesoLido
   UnInt_Port( nHandle )
   Return .t.
Endif
UnInt_Port( nHandle )
Return .f.
Pergunto devido as funções:

Init_Port()
IsWorking()
UnInt_Port()
nChar := InBufSize( nHandle )
nLidos:= InChr( nHandle,nChar,@cBuff )
OutChr( nHandle, cBytesToWrite, nCount )



Vlw.... Sucesso!!!!

:)Pos
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Re: Como ficaria o Código abaixo em Harbour???

Mensagem por Itamar M. Lins Jr. »

Fica da mesma forma.
É só compilar a hbcomm no harbour.
Os fontes estão espalhados por ai na internet.
Mas a hbwin do harbour tem umas novas funções para comunicação serial.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Re: Como ficaria o Código abaixo em Harbour???

Mensagem por fladimir »

Obrigado Itamar, vou testar depois...

Sucesso!!!


:)Pos
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Como ficaria o Código abaixo em Harbour???

Mensagem por sygecom »

Olá Fladimir,
Se for usar a HBWIN da Contrib do Harbour ficaria mais ou menos assim:

Código: Selecionar todos

   Function Busca_Peso

   Local oWinPort := Win_Port():Init("COM1",9600, 0, 8, 0)
   
   Local cPeso2 := ""
   Local nResult
   Local vLoop := 0
   Local vEspera:= 0
   Local vPESO :=0
   Local vTotalbit := 100  // total de byts que desejo que retorne

   if !oWinPort:Open
      MsgInfo("Erro ao Buscar o Peso, Erro: "+ oWinPort:Error(),"Aviso do Sistema")
      vPESO=0
      Return(vPeso)
   endif
   oWinPort:Purge(.t., .t.) // limpa porta de entrada e saida

   Millisec(500)// espera
   oWinPort:Write(chr(05))

   DO WHILE .t.
      vLoop=vLoop+1
      vEspera=vEspera+1

      oWinPort:Read(@cPeso2, vTotalbit)
      Millisec(100)

      IF !ALLTRIM(cPeso2)$"?"
         IF Len(cPeso2) >= vTotalbit
            EXIT
         ENDIF
      ENDIF

      IF vEspera = 1000
         Millisec(100)
         vEspera = 0
      endif

      IF vLoop > 30000
         cPeso2 := "SEM_SINAL"
         EXIT
      Endif
   ENDDO
   oWinPort:Close()  // fecha a porta
   cPesoLido  := Val(Substr(cPeso2,2,7)) 
   Return(cPesoLido)
Obs: Fiz na corrida e não conferi, mas 80 % de chances que de certo. Boa sorte.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Re: Como ficaria o Código abaixo em Harbour???

Mensagem por fladimir »

Vlw Guri, grande abraço pela força... vou testar....


Sucesso!!!


:)Pos
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Re: Como ficaria o Código abaixo em Harbour???

Mensagem por fladimir »

Pessoal, mais um desafio, não abri novo tópico pois acredito q esteja concernente a este, abaixo segue codigo q tirei do xHarbour e modifiquei (desculpem as traducoes, não domino o ingles, foi mais pra dar uma clareada), para entendimento das Background Functions e Idle Functions, como ficaria isto no Harbour, tendo em vista q não tem algumas funções q são utilizadas abaixo, quais seriam as correlatas?

Para os colegas q utilizam o xHarbour, basta compilar marcando o uso de MT q roda certinho, da pra ter uma idéia lega do assunto através deste PRG

Código: Selecionar todos

***********************************************************
* bkgtest.prg
*
* $Id: bkgtest.prg,v 1.6 2008/01/27 23:14:43 fsgiudice Exp $
*
* This test demonstrates usage of BACKGROUND functions that are an extension of IDLE functions;
* this is a variant of idle functions that runs only on idle state (as inkey(0) does)
* Background functions run on every vm execution. PLEASE BE CAREFULLY using these functions.
* Inside background functions you have to think that them are executed on EVERY vm call.
* Look at idletest.prg too.
*
* (C) 2003 - Francesco Saverio Giudice <info@fsgiudice.com>
*
* Modificado por Fladimir para efeito de estudo em Dez/2009
*

#include "set.ch"
#include "inkey.ch"

PROCEDURE Main()
   LOCAL nId1, nId2, nId3, nId4, nId5, nId6, nId7, n 
   LOCAL lActive := .T.
   LOCAL nSpeed  := 500
   
*  Thread or BackGround Function
// HB_IdleAdd() = Adds a background task for being executed during idle states. 
// Syntax = HB_IdleAdd( <bAction> ) --> nTaskHandle
	
	// Adicionando fun‡äes q serÆo sempre executadas qdo o sistema estiver OCIOSO
	nId1 := HB_IdleAdd( {|| idleFunc( 10, "On Idle - From Block")} )  // Passado como Bloco
   nId2 := HB_IdleAdd( { @idleFunc(), 11, "On Idle - From Array"} )  // Passado como Array
   

*  Thread or BackGround Function
// HB_BackGroundAdd() = Adds a new background task. 
// Syntax = HB_BackGroundAdd( <bAction>, [<nMillisecs>], [<lActive>] ) --> nTaskHandle
	nId3 := HB_BackgroundAdd( { @CheckFunc() }   , 1000, .F.   )  //This task is defined but not active
   nId4 := HB_BackgroundAdd( { @TimerFunc() }   , 1000        )  //Define a Tarefa e o Tempo
   nId5 := HB_BackgroundAdd( { @Counter1Func()}               )  //Define a Tarefa 
   nId6 := HB_BackgroundAdd( { @Counter2Func()}, nSpeed       )  //Define a Tarefa e o Tempo
   nId7 := HB_BackgroundAdd( { "Counter3Func" }, 100          )  //Define a Tarefa e o Tempo
 
   HB_BackgroundAdd( { @Ticker() }, 100 ) // Define a tarefa e o Tempo


*------------------------ 
   SET COLOR TO w+/B
   CLEAR SCREEN
   SET CURSOR OFF
   @1,0 SAY Padc( "X H A R B O U R - Background and Idle Function Test.", MaxCol() )

   DispInfo( "Tarefas Background definidas, mas nÆo rodando." )
   
* Thread or BackGround Function
// SecondsSleep() = Suspends thread execution for a number of seconds. 
// Syntax = SecondsSleep( <nSeconds> ) --> NIL
	SecondsSleep( 3 )

   DispInfo( "Agora irei executar uma simples tarefa manualmente" )
   SecondsSleep( 3 )

   DispInfo( "Contador trabalhando" )
   FOR n := 1 TO 10000               

	 // HB_BackGroundRun() = Enforces execution of one or all background tasks. 
	 // Syntax = HB_BackGroundRun( [<nTaskHandle>] ) --> NIL
       HB_BackgroundRun( nId5 )  // Executa a Fun‡Æo

   NEXT
   
	@3,5 SAY "Nas Linhas 10 e 11, 2 diferentes fun‡äes ociosas aparecerÆo piscando."

   DispInfo( "Agora vc ver  fun‡äes 1 ociosas executando at‚ vc pressionar uma tecla" )
   inkey(0)

   DispInfo( "Agora for‡ando manualmente todas background functions executarem" )
   SecondsSleep( 3 )

   DispInfo( "Background functions rodando manualmente" )
   FOR n := 1 TO 100000
		 // Estava HB_BackGroundRunForced() mas nÆo achei nada a respeito
		 HB_BackgroundRun() // Rodando todas background tasks as q sejam SET BACKGROUND TASKS is ON
     							  // as OFF nÆo rodam
       IF n % 1000 == 0
          IF Inkey() == K_ESC
             EXIT
          ENDIF
       ENDIF
   NEXT
   DispInfo( "Agora vc ver  funcoes 2 ociosas trabalharem ateh vc pressionar alguma tecla" )
   inkey(0) 

   DispInfo( "Agora defini como ON as Tarefas de Background" )
   SecondsSleep( 3 )  // depois de 3 segundos

   SET BACKGROUND TASKS ON  // Ligando as Tarefas de Background q nÆo estejam definidas como OFF

   @5,5 SAY "Background Functions: Show Timer, Ticker, Counters and Check Time Elapsed."
   @6,5 SAY "Depois de 10 segundos este programa ser  for‡ado a sair."
   DispInfo( "Programa Rodando junto com BackGround Tasks Ativas" )

   // Now i make check time on
   // Agora irei ativar a Tarefa nId3, q at‚ o presente momento esteve desativada setando como .T.
   HB_BackgroundActive( nId3, .T. )
   
	@ 11, 42 say "             E a direita as Funcoes"
   @ 12, 42 say "              de BackGround tamb‚m "
	@ 13, 42 SAY "              de diferentes formas "


   @ 15, 02 say "     Veja o Programa Principal                      "
	@ 16, 02 SAY "        trabalhando abaixo                          "
	
   @ 18, 02 SAY "Contador do Programa Principal: "
   n := 0
   DO WHILE .T.
       @ 18, 32 SAY ++n
       
		 IF n % 1000 == 0
          IF Inkey() == K_ESC
             EXIT 
          ENDIF
       ENDIF
       IF n % 20000 == 0
          lActive := !lActive

//   //   HB_BackGroundActive( <nTaskHandle> [, <lNewActive>] ) --> lOldActive
          HB_BackgroundActive( nId7, lActive ) // Ativa ou Desativa nId7

          @ 19, 55 SAY "Contador 03 " + IIF( lActive, "ON ", "OFF" )
       ENDIF
       IF n % 60000 == 0
          IF nSpeed == 500
             nSpeed := 0
          ELSE
             nSpeed := 500
          ENDIF

			 // Muda o Tempo da nId6, ou seja, passa o parametro nSpeed (Tempo) para a Fun‡Æo q esta rodando em BackGround
          HB_BackgroundTime( nId6, nSpeed )
          @ 20, 55 SAY "Contador 02 Tempo = " + Str( nSpeed, 3 )
       ENDIF
       IF n == 130000                                // Se n = 130000
          HB_BackgroundDel( nId5 )                   // remove a Tarefa 5 do BackGround
          @ 16, 55 SAY "Contador 01: DELETED    "         // mostra a palavra Deletada
       ENDIF

   ENDDO

   // Estava comentado no original
	/*
	SET COLOR TO w/n
   CLEAR SCREEN
   @0,0 SAY "Removing " + ValToPrg( HB_IdleDel( nId1 ) ) 
   @1,0 SAY "Removing " + ValToPrg( HB_IdleDel( nId2 ) )
   @2,0 SAY "Done"
   @4,0
   SET CURSOR ON
	*/
RETURN

*Fun‡Æo para mostrar mensagem
PROCEDURE DispInfo( cMsg )
  LOCAL nOldRow := Row()
  LOCAL nOldCol := Col()
  IF cMsg == NIL
     cMsg := ""
  ENDIF
  @ 23, 0 SAY PadC( cMsg, MaxCol() )
  SetPos( nOldRow, nOldCol )
RETURN


* Primeira Tarefa
PROCEDURE IdleFunc( nRow, cStr )
  LOCAL nOldRow := Row()
  LOCAL nOldCol := Col()

   @nRow, 10 SAY cStr
   ThreadSleep( 100 )
   @nRow, 10 SAY Space(69)

  SetPos( nOldRow, nOldCol )
RETURN


* Fun‡Æo de controle do tempo decorrido do final do exemplo
PROCEDURE CheckFunc()
  STATIC nSeconds
  STATIC nElapsed
  LOCAL nOldRow := Row()
  LOCAL nOldCol := Col()

  IF nSeconds == NIL
     nSeconds := Seconds()
  ENDIF
  nElapsed := Int( Seconds() - nSeconds )
  @ 19, 10 SAY "Segundos Decorridos: " + Str( nElapsed )
  IF nElapsed > 40
     DispInfo( "Tempo esgotado! Saindo. Pressione alguma tecla para sair (note idle running meanwhile)" )
     Inkey(0)
     QUIT
  ENDIF

  SetPos( nOldRow, nOldCol )
RETURN


* Fun‡Æo q mostra a Hora
PROCEDURE TimerFunc()
  LOCAL nOldRow := Row()
  LOCAL nOldCol := Col()
  @ 15, 55 SAY "Time: " + Time()
  SetPos( nOldRow, nOldCol )
RETURN


* Fun‡Æo de Contagem 1
PROCEDURE Counter1Func()
  STATIC nCount
  LOCAL nOldRow := Row()
  LOCAL nOldCol := Col()

  IF nCount == NIL
     nCount := 0
  ENDIF
  @ 16, 55 SAY "Contador 01: " + Str( nCount )
  nCount++
  SetPos( nOldRow, nOldCol )
RETURN

* Fun‡Æo de Contagem 2
PROCEDURE Counter2Func()
  STATIC nCount
  
  LOCAL nOldRow := Row()
  LOCAL nOldCol := Col()

  IF nCount == NIL
     nCount := 0
  ENDIF
  @ 17, 55 SAY "Contador 02: " + Str( nCount )
  nCount++

  SetPos( nOldRow, nOldCol )
RETURN

* Fun‡Æo de Contagem 3
PROCEDURE Counter3Func()
  STATIC nCount
  LOCAL nOldRow := Row()
  LOCAL nOldCol := Col()

  IF nCount == NIL
     nCount := 0
  ENDIF
  @ 18, 55 SAY "Contador 03: " + Str( nCount )
  nCount++

  SetPos( nOldRow, nOldCol )
RETURN

* Fun‡Æo para exibir a mensagem para observar os diversos tipos de contadores sendo executados
PROCEDURE Ticker()
  STATIC nPos
  STATIC cText
  LOCAL cString
  LOCAL nOldRow := Row()
  LOCAL nOldCol := Col()

  IF cText == NIL
     cText := "Este ‚ o Texto da fun‡ao Ticker. ESC to exit. Veja as diferentes veloc. dos contadores "
     nPos   := 1
  ENDIF
  cString := Substr( cText, nPos ) + SubStr( cText, 1, nPos-1 )
  @ 22, 0 SAY PadR( cString , MaxCol() )
  nPos++
  IF nPos > Len( cText )
     nPos := 1
  ENDIF

  SetPos( nOldRow, nOldCol )
RETURN

Vlw... Sucesso!!!!

:)Pos
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Como ficaria o Código abaixo em Harbour???

Mensagem por sygecom »

Buenas,
Para usar essas rotinas nem é nescessario compilar com MT, por que elas na verdade nem são executadas em outras theread,usei elas por um tempo e lembro que elas trancam o processo do aplicativo mas apenas rodam sem mostrar nada e ficam sem monitorada a cada x segundos em backgroung.
Quando eu migrei para Harbour já não estava mais usando essas rotinas passei a usar o MT de verdade do Harbour e algumas pequenas coisas com o SET TIMER da Hwgui, dei uma procurada rápida no Harbour e não achei nada sobre isso, tente postar no grupo dos desenvolvedores do Harbour quem sabe isso já ta por ai com outro nome, se não o pessoal colocar isso mais pra frente.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Como ficaria o Código abaixo em Harbour???

Mensagem por sygecom »

Acabei de achar na LIB xHB.LIB as funções de BackGroung em: bkgtsks.c, então está já no Harbour, é só linkar a xHB.LIB.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Re: Como ficaria o Código abaixo em Harbour???

Mensagem por fladimir »

Obrigado.. vou testar..

Sucesso!!!


:)Pos
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Responder