! rev 28-12-2013 !! Appli PIC18F en C18 #define Versus "Ver.131226 C18 " // 16 cars maxi si LCD #define Source " 18F46K22_EDFinfo_Nokia_BT_DS1302_Archos_131228_Q20.c" #define Projet " 18F46K22_EDFinfo_BT_2013_Q20.mcp" #define Hardware " 18F46k22_EDFinfo_Hardware_Nokia.txt" !! ! !! RFO-BASIC! Launcher v0.5 0% ________________ 100% (441 lines) [################] File transfered over LAN in 1 second >Exit code: 1 >"rfo-basic launcher.exe" "E:\Archos43\rfo-basic\source\BTclick_EDFinfo_131228.bas" -------------------------------------------------------------------------------- !! ! 12-11-2013 ! passage en mode GRAFIQUE !! ! Probleme chargement fichier image ! ATTENTION, ceux ci doivent etre present dans l'Archos Rfo-basic/data ! 10-11-2013 ! appbuider avec IconeRN41.jpg ! rev PF 22-09-2013 ! teste avec Pic18f46K22 Edfinfo RN41 Master ! et basic 01.72 ! rev PF 03/05/2012 ! version RFO basic 01.50 ! test avec archos ! Liaison BlueTooth-click avec Archos ! BT envoi un indice toutes les 2 secondes et 3 mesures Analog ! archos affiche la reception et renvoi un Num de message recu !--------------------- ! Lancer terminal VBRAY ! test prealable en mode Commande doivent etre OK ! voir Bluetooth_click.log ! Selectionner COM2 19200,N,8,1 !connect !Hardware: !Module Bluetooth_Click Mikronicka relie a COM2 via interface RS232 DS275 !Alim 3,3V pour le module !seuls TX et RX sont connecte !Archos 43 it !Association avec Bluetooth_Click code =1234 ! dim ObjFixe[1] dim Obj[10] dim ObjStatus[10] dim Bm[10] dim ArrPlan[2] dim Thermo[2] dim rec_Array$[14] % ATTENTION , ne pas dimmensionner si usage de split debug.on A$=" " texte$=" " msgR$= " " msgE$= " " ! exemple de Trame recue !msgr$="00184;27/08, 21:04:43;Pump=OFF;Chau=ON_;TExt= 59.80;TInt= 21.08;Wth = 42231864;Amp = 2;Link EDF OK" msgr$="02414;29/08, 17:19:32;Pump=OFF;Chau=ON_;TExt= 59.80;TInt= 20.80;Wth = 42230560;Amp = 5;Link EDF OK" ! text pointer for temperatures,Watt,Amps and p0 for status msg ! p1,p2,p3,p4,p5 p0 debug.print "init variables" nb=0 k1=0 nb=0 NumTrame=0 KL=0 premier=0 J3=0 K3=0 L3=0 M3=0 Longueur=0 I4=0 J4=0 B4$=" " ! touched zones t1=0 t2=0 t3=0 t4=0 t5=0 Texte$=" Status " TempInt$=" 10.20°C" TempExt$=" -2.40°C" Tex=0.0 Tin=0.0 Dummy=0.0 Old_Tin=0.0 Old_Tex=0.0 Amp=0.0 Watt=0.0 Old_Amp=0.0 Old_Watt=0.0 Delta_Watt=0.0 WattHeure$="42000000" Watt= val(WattHeure$) Amps$="12" Kfilter=0.2 !Thermometer value displayd TH1 & TH2 ! delta Y theorique=250 ajustement graphique 245 ! delta degre C pas1=242/(40+10) pas2=242/(35-10) test=0 % 1= en test,pas de BT 0=Avec BT Progr$="BTclick_EDFinfo_131228.bas" print "Version basic : "; Version$() Device DV$ print "Device Info : "; DV$ print "En liaison BlueTooth avec" print "Source : 18F46K22_EDFinfo_Nokia_BT_DS1302_Archos_131228_Q20.c" print "Projet : 18F46K22_EDFinfo_BT_2013_Q20.mcp" print "Hardware : 18F46k22_EDFinfo_Hardware_Nokia.txt" TIME Year$, Month$, Day$, Hour$, Minute$, Second$ pause 3000 for i=1 to 8 ObjStatus[i]=0 % par defaut next i if Test=0 then popup "Start before 18F46K22 EDFinfo Interface ..",0,0,4 end if !Gr.open alpha, red, green, blue {, gr.open 255,0,0,0,0 % Alpha=255=opaque,R,G,B, x => 1=status barre haut pause 1000 gr.orientation 0 % force Landscape ! Recupere les parametres de l'ecran w=largeur et h=hauteur gr.screen w,h gr.render !gr.color alpha, red, green, blue, fill !http://www.proftnj.com/RGB3.htm !gr.color 255,255,255,255,1 % blanc !gr.color 255,255,0,0,1 % rouge !gr.color 255,255,255,255,1 % blanc !gr.color 255,0,255,0,1 % Vert !gr.color 255,0,0,255,1 % bleu !gr.color 255,0,0,0,1 % Noir !gr.color 255,255,255,153,1 %Jaune clair !gr.color 255,255,0,153,1 %Jaune vif !gr.color 255,102,0,255,1 % Violet debug.print "chargement des images" gr.bitmap.load ArrPlan[1],"Arriere_plan_BT_Edfinfo.jpg" gr.bitmap.draw ObjFixe[1],Arrplan[1],1,1 gr.render pause 1000 gr.bitmap.load bm[1],"Chauffage_ON.jpg" gr.bitmap.load bm[2],"Pompe_ON.jpg" gr.bitmap.load bm[3],"bp_marche_vert_50x57.jpg" gr.bitmap.load bm[4],"bp_marche_vert_50x57.jpg" gr.bitmap.load bm[5],"bluetooth_icon72x72.jpg" gr.bitmap.load bm[6],"Case_cochee_V.jpg" gr.bitmap.load bm[7],"Case_cochee_V.jpg" gr.bitmap.load bm[8],"Case_cochee_V.jpg" gr.bitmap.draw Obj[1],Bm[1],240,5 %Chauffage ON gr.bitmap.draw Obj[2],Bm[2],440,10 % Pompe ON gr.bitmap.draw Obj[3],Bm[3],675,25 % BP RC1 gr.bitmap.draw Obj[4],Bm[4],675,125 % BP RC2 gr.bitmap.draw Obj[5],Bm[5],670,220 % icone BT gr.bitmap.draw Obj[6],Bm[6],670,305 % case à cocher verte gr.bitmap.draw Obj[7],Bm[7],670,345 % case à cocher verte gr.bitmap.draw Obj[8],Bm[8],670,385 % case à cocher verte gr.set.stroke 0 !Gr.rect , left, top, right, bottom gr.color 255,0,0,255,1 % bleu Gr.rect Thermo[1],60,95,65,345 gr.color 255,255,0,153,1 Gr.rect Thermo[2],180,95,185,345 gr.text.size 12 gr.color 255,0,255,0,1 % vert gr.text.draw p1,30,30,TempExt$ gr.text.size 12 gr.color 255,255,0,153,1 %Jaune vif gr.text.draw p2,150,30,TempInt$ gr.set.stroke 1 gr.text.bold 1 gr.color 255,0,0,255,1 %bleu gr.text.draw p0,25,470,Texte$ gr.text.draw p5,535,410," Date et Heure RTC" gr.set.stroke 3 gr.text.size 48 gr.color 255,0,0,0,1 gr.text.draw p3,240,360,WattHeure$ gr.text.draw p4,340,410,Amps$ gr.text.size 24 gr.show Obj[1] gr.show Obj[2] gr.show Obj[3] gr.show Obj[4] gr.show Obj[5] gr.show Obj[6] gr.show Obj[7] gr.show Obj[8] gr.Show p0 gr.Show p1 gr.Show p2 gr.Show p3 gr.Show p4 gr.show p5 ! reperage Touch zones !gr.color 255,255,0,0,0 %rouge , vide !Gr.rect Rect1, 675,315,715,340 !Gr.rect Rect2, 675,355,715,380 !Gr.rect Rect3, 675,395,715,420 !gr.render pause 1000 gr.hide Obj[1] gr.hide Obj[2] gr.hide Obj[3] gr.hide Obj[4] gr.hide Obj[5] gr.hide Obj[6] gr.hide Obj[7] gr.hide Obj[8] gr.hide p5 debug.print 10 !debug.print "TH1" ! simule evolution sur la gamme de mesure thermometre for Tex=-10 to 40 step 1 n1=1 gosub MAJ_Thermo next Tex !debug.print "TH2" for Tin=10 to 35 step 1 n1=2 gosub MAJ_Thermo next Tin new_connection: if (test=1) then popup "Simulation liaison BT..",0,0,4 gr.Hide Obj[5] gr.render else Texte$="Ouverture liaison BT" gosub Refresh_Status debug.print "open BT" bt.open pause 1000 debug.print 15 bt.connect tts.init Debug.print 20 !Read status until a connection is made popup "Connecting..",0,0,4 alarme = clock() + 25000 s=0 while (s <>3) bt.status s pause 500 if (clock() > alarme) then tts.speak "Time out 4 connect" pause 2000 w_r.break endif repeat Debug.print "s=";s Debug.print 30 gr.show Obj[5] bt.device.name Device$ Debug.print 35 Texte$="connecte a "+ Device$ gosub Refresh_Status gr.render endif Main_Loop: Debug.print "debut Main_loop" nb=0 ! ------------------- MAIN LOOP ------ Do ! Read status to insure that we remain connected. ! If disconnected, program reverts to listen mode. ! In that case, ask user what to do. Debug.print 35 t1=0 t2=0 t3=0 t4=0 t5=0 if (Test=0) then bt.status s if (s <> 3) then debug.print "Connection perdue" Texte$="connection perdue ! " gosub Refresh_Status gr.hide Obj[5] gr.render goto new_connection endif debug.print "Lecture BT" gosub ReadBT ! Read messages until the message queue is empty ! boucle pour ne pas fractionner le message if (dr=1) then debug.print "MyBT : " ;msgR$ Texte$=left$(msgR$,100) gosub Refresh_Status debug.print 40 k1=k1+1 debug.print "k1=";k1 endif ! Send a alive flag nb=nb+1 debug.print "nb=";nb if (nb >100) then msgE$= "RAZ" +chr$(13) Texte$="RAZ compteur" gosub Refresh_Status debug.print 50 bt.write msgE$ debug.print "Archos: "; msgE$ nb=0 endif else debug.print 52 Texte$=left$(msgR$,116) gosub Refresh_Status Pause 100 endif !========= Traitement trame recue debug.print 70 KL=len( msgR$) debug.print "Lg Tr=";KL recept$=msgR$ if (KL>140) then KL=0 % anomalie debug.print 71 longueur=0 if KL>70 then ! decomposition les elements du message BT ! Rec_Array$[] ne doit pas etre deja dimensionné !split rec_Array$[],msgR$,";" debug.print 72 !array.length longueur, rec_Array$[] gosub My_Split debug.print "nb elem rec_Array$ : ";longueur for i=1 to longueur debug.print i,rec_Array$[i] next i debug.print 73 !extraction N° trame a$=rec_Array$[1] debug.print " N° trame=";a$ j4=0 ! test si numerique .. pour eviter les faux debut de trame ! A$ en entree ! J4 en retour gosub TestNum if J4=0 then ! D_u.break goto strap1 endif debug.print format("NumTrame= #####",NumTrame) debug.print "Traite partie 1" gosub Traite_Part1 endif % KL>76 debug.print "Traite partie 2" if kL > 100 then gosub Traite_Part2 endif strap1: ! not used ,because us MySplit !if longueur >1 then ! UnDim Rec_Array$[] !endif debug.print "Traite actions sur BP et cases à cocher" gosub Traite_BP_Coches debug.print 83 ! -- envoi eventuelles commandes au PIC18F if (t1=1) then if (ObjStatus[3]=1) then msgE$= "RC1_1" +chr$(13) Texte$="Arme sortie RC1" else msgE$= "RC1_0" +chr$(13) Texte$="DesArme sortie RC1" endif gosub Refresh_Status debug.print Texte$ if (test=0) then bt.write msgE$ endif t1=0 endif debug.print 84 if (t2=1) then if (ObjStatus[4]=1) then msgE$= "RC2_1" +chr$(13) Texte$="Arme sortie RC2" else msgE$= "RC2_0" +chr$(13) Texte$="DesArme sortie RC2" endif gosub Refresh_Status debug.print Texte$ if (test=0) then bt.write msgE$ endif t2=0 endif debug.print 85 if ((t3=1) & (ObjStatus[6]=1)) then !sauvegarde datas sur fichiers ou database popup " Next update ... Sauvegarde sur fichier",0,0,4 gr.render t3=0 endif debug.print 86 if ((t4=1) & (ObjStatus[7]=1)) then !partie enregistrement grafique popup " Next update ... Grafiques..",0,0,4 gr.render t4=0 endif debug.print 87 if ((t5=1) & (ObjStatus[8]=1)) then !partie MAJ RTC popup "MAJ RTC.",0,0,4 gr.render !U;29;10;50;4;18;33#035#013 TIME Year$, Month$, Day$, Hour$, Minute$, Second$ Texte$= "U"+";"+Day$+";"+Month$+";"+right$(Year$,2)+";4;"+Hour$+";"+Minute$+"#" msgE$=Texte$+chr$(13) gr.Hide p5 !gr.modify p5,"x",535 !gr.modify p5,"y",410 gr.modify p5,"text",Texte$ gr.show p5 gr.render !debug.print Texte$ if (test=0) then bt.write msgE$; endif t5=0 endif debug.print 88 if (msgR$="Fin") then D_u.break endif debug.print "90 k1=";k1 if (premier=0) then debug.print msgR$ console.save "EdfinfoTrame.txt" Gr.save "EDF_screen_a.jpg" gr.render premier=1 endif debug.print 95 until (k1>1000) ! ------------ end of MAIN loop ------------------- debug.print 100 Texte$="Fin normale" gosub Refresh_Status pause 4000 fini: bt.close Debug.print "fin normale" Console.save Prog$+".txt" pause 4000 end !========================= ReadBT: ! Read messages until the message queue is empty ! boucle pour ne pas fractionner le message A1$="" MsgR$="" !gr.hide Obj[5] !gr.render dr=0 bt.status s if (s=3) then do bt.read.ready rr if (rr>0) then dr=1 bt.read.bytes A1$ MsgR$=MsgR$+A1$ endif until rr=0 debug.print "Read BT" gr.show Obj[5] else debug.print "decrochage BT" gr.hide Obj[5] endif gr.render return MAJ_Thermo : if (n1=1) then !pas1=242/(40+10) j=345-pas1*(Tex+10) gr.hide Thermo[1] gr.color 255,0,0,255,1 % bleu !gr.color 255,0,255,0,1 % Vert Gr.rect Thermo[1],60,j,65,345 gr.show Thermo[1] gr.render endif if (n1=2) then !pas2=242/(35-10) j=345-pas2*(Tin-10) gr.hide Thermo[2] gr.color 255,255,0,0,1 % rouge !gr.color 255,255,0,153,1 Gr.rect Thermo[2],180,j,185,345 gr.show Thermo[2] gr.render endif return Refresh_Status : gr.hide p0 gr.color 255,0,0,255,1 % blue gr.modify p0, "text",Texte$ gr.show p0 gr.render return Traite_Part1: ! 1ere partie du message BT if (KL>70) then ! extraction hordatage Horodat$=right$(rec_Array$[2],15) !gr.color 255,255,255,255,1 % blanc !gr.text.draw Ho,20,30,Horodat$ debug.print 85 !extraction Etat Pompe debug.print rec_Array$[3] if (left$(rec_Array$[3],4)="Pump") then if (right$(rec_Array$[3],3)="ON_") then gr.Show Obj[2] Objstatus[2]=1 gr.render else gr.hide Obj[2] Objstatus[2]=0 gr.render endif endif !extraction Etat Chauffage debug.print rec_Array$[4] if (left$(rec_Array$[4],4)="Chau") then if (right$(rec_Array$[4],3)="ON_") then gr.Show Obj[1] Objstatus[1]=1 gr.render else gr.hide Obj[1] Objstatus[1]=0 gr.render endif endif !extraction Temper Exter debug.print rec_Array$[5] if (left$(rec_Array$[5],4)="TExt") then TempExt$= right$(rec_Array$[5],6) Dummy= val(TempExt$) if (Dummy > 42.0) then Dummy=42.0 endif debug.print "Dummy=";Dummy Tex= Dummy * 0.2 + Old_Tex * 0.8 Old_Tex=Tex ! gr.color 255,0,0,255,1 % bleu TempExt$=format$(" ##.##",Tex)+"°C" debug.print "TempExt$=";TempExt$ gr.text.size 12 gr.color 255,0,255,0,1 % vert gr.modify p1, "text",TempExt$ n1=1 gosub MAJ_Thermo endif !extraction Temper Int debug.print rec_Array$[6] if (left$(rec_Array$[6],4)="TInt") then TempInt$= right$(rec_Array$[6],5) Dummy=val(TempInt$) debug.print "Dummy=";Dummy Tin= Dummy * 0.2 + Old_Tin * 0.8 Old_Tin=Tin TempInt$=format$(" ##.##",Tin)+"°C" debug.print "TempInt$=";TempInt$ gr.text.size 12 gr.color 255,255,0,153,1 %Jaune vif gr.modify p2, "text",TempInt$ n1=2 gosub MAJ_Thermo endif gr.render return Traite_Part2: ! ********* partie 2 EDF ********* !extraction Watt heure debug.print rec_Array$[7] if left$(rec_Array$[7],4)="Wth " then WattHeure$= right$(rec_Array$[7],8) Watt= val(WattHeure$) gr.modify p3, "text", format$("## ### ###",Watt) endif !extraction Amperes debug.print rec_Array$[8] if left$(rec_Array$[8],4)="Amp " then Amps$= right$(rec_Array$[8],2) Amp=val(Amps$) gr.modify p4, "text",format$("##",Amp) endif gr.render return Traite_BP_Coches: ! -- 2 BP lumineux-------- debug.print 74 gr.bounded.touch t1, 680,30,720,70 gr.render if (t1 =1) then debug.print "zone BP RC1 touchee" if ObjStatus[3]=0 then Gr.show Obj[3] ObjStatus[3]=1 else Gr.Hide Obj[3] ObjStatus[3]=0 endif Tone 400,250 gr.render end if debug.print 75 gr.bounded.touch t2, 680,130,720,170 gr.render if (t2 =1 ) then debug.print "zone BP RC2 touchee" if ObjStatus[4]=0 then gr.show Obj[4] ObjStatus[4]=1 else gr.Hide Obj[4] ObjStatus[4]=0 endif gr.render Tone 440,250 end if ! 2 cases à cocher debug.print 80 gr.bounded.touch t3,675,315,710,340 gr.render if (t3=1) then !debug.print "zone coche Store datas touchee" if ObjStatus[6]=0 then Gr.show Obj[6] ObjStatus[6]=1 else Gr.Hide Obj[6] ObjStatus[6]=0 endif gr.render Tone 500,250 end if debug.print 82 gr.bounded.touch t4,670,355,710,380 gr.render if (t4=1) then !debug.print "zone coche Grafique touchee" if ObjStatus[7]=0 then Gr.show Obj[7] ObjStatus[7]=1 else Gr.Hide Obj[7] ObjStatus[7]=0 endif gr.render Tone 540,250 end if gr.bounded.touch t5,670,395,710,420 gr.render if (t5=1) then debug.print "zone coche MAJ RTC touchee" if ObjStatus[8]=0 then Gr.show Obj[8] ObjStatus[8]=1 else gr.Hide p5 Gr.Hide Obj[8] ObjStatus[8]=0 endif gr.render Tone 550,250 end if return My_Split: ! La difference avec la fonction basic split qui necessite un tableau NON dimensionné ! avant usage .. donc ne pas ooublier le undim ! ! est qu'il a besoin de dimensionner une suele fois le tableau à son maxi debug.print "My_Split" J3=1 L3=1 longueur=0 do M3= Is_In(";",recept$,L3) K3=len(recept$) if (M3>0) then rec_Array$[J3]=mid$(recept$,L3,M3-1) longueur=longueur + 1 recept$=right$(recept$,K3-M3) J3=J3+1 endif until M3=0 return TestNum: J4=0 ! test si numerique for i4=1 to len(A$) b4$=mid$(A$,i4,1) ! Debug.print "i4=";i4,"B4$=";B4$, J4= Is_In(B4$,"0123456789",1) ! debug.print "JJ=";JJ if J4=0 then F_n.break endif next i4 if (J4=0) then debug.print "A$=";A$;" Not Num" else debug.print "A$=";A$;" OK" end if return OnError: debug.print GETERROR$() Debug.print "sortie sur Erreur" fin: Console.save "Err_"+Prog$+".txt" pause 2000 end