Ezan vakitleri için C tablo oluşturmak

Başlatan X-Fi, 18 Nisan 2011, 20:12:34

X-Fi

Alperen programından aldığımız ezan vakitlerini C için tabloya dönüştürmek benim baya zamanımı aldı notepad++ ile bunu kolaylaştırdım makro haline getirdim bulunduğunuz yerin yillik imsakiyesini oluşturduktan sonra .txt yi C ye uygun tabloya dönüştürmek için bir makro hazırladığım.

Tabloda vakitler 2 byte olarak saklanıyor saat 1 byte, dk 1byte, her vakit int olarak saklanıyor.

Bir yıllık tablo 3720 byte tutmakta.

Tüm dosyalar linkde mevcut nasıl oluşturulacağına dair bir açıklamada içerisinde.

Ezan vakitleri ile ilgili proje geliştirecek olanlara sunuyorum.

http://www.fileserve.com/file/KyWShyg

örnek kod:

const unsigned int tablo_2011[12][31][5] = {


		/*    ŞEHİR		: İzmir / Türkiye

			PARALEL		: 38.40° KUZEY
			MERİDYEN	: 27.15° DOĞU
			SAAT FARKI	: +2.00
			TARİH		: Ocak 2011
			YAZ SAATİ	: Var

			KIBLE AÇISI	: 143.6°
			PUSULA SAPMASI	:   4.2°

                        İMSK ÖĞLE İKND AKŞM YATSI
			 --- ---- ---- ---- ----           */

             {
	     652,1322,1548,1809,1933,
             652,1322,1549,1810,1933,
             652,1323,1550,1811,1934,
             652,1323,1551,1812,1935,
             652,1324,1552,1812,1936,
             652,1324,1552,1813,1937,
             653,1324,1553,1814,1937,
             653,1325,1554,1815,1938,
             653,1325,1555,1816,1939,
             653,1326,1556,1817,1940,
             .
             .
             .
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

OG

#1
Koordinat tespitine yarayan VB kodu vardı elilmde, adam güzel yapmış, tüm dünya ülkelerinin ilçe ilçe koordinatlarını alabiliyorsunuz, exe haline ben getirdim,

Exe kurulum dosyası http://hotfile.com/dl/114976010/106abae/GeoMaker.exe.html

VB source codes  http://hotfile.com/dl/114950511/87a5d99/GeoMaker.rar.html

Türkiye datası  http://hotfile.com/dl/114976107/6171d97/TU_yedek.rar.html
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

X-Fi

hocam kurduktan sonra "MSINET.OCX" ve"TABCTL32.OCX" dosyalarını istedi aşşağıdaki linklerden indirip program klasörüne yapıştırıp çalıştırdım.

http://www.ocxdump.com/download-ocx-files_new.php/ocxfiles/M/MSINET.OCX/6.01.9782/download.html
http://www.ocxdump.com/download-ocx-files_new.php/ocxfiles/T/TABCTL32.OCX/6.01.9782/download.html

Alperen programı içinde bir exel tablosu var türkiye için ben onu kullanıyordum buda iyiymiş teşekkürler.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

iyildirim

X-Fi,

Başlangıçtan itibaren zaman farkları tutularak tablo çok daha küçük bir alana sığdırılabilir. Günlük maksimum zaman farkı ne kadardır bilmiyorum ama max 4 dakika ise 1KB ın altına bile inmek mümkün görünüyor.

OG

#4
Alıntı Yap"MSINET.OCX" ve"TABCTL32.OCX" dosyalarını istedi

OCX kullandığını farkedemedim, derleyip göndermiştim, düzelttim, linki de yeniledim.

Ayrıca TR datalarını da programa indirtip dosya olarak yükledim (yukarıda). Program kodları internetten çekerken biraz zaman alıyor. Hazır dosyayı indirmek daha kolay.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

X-Fi

Alıntı yapılan: iyildirim - 19 Nisan 2011, 01:37:01
X-Fi,

Başlangıçtan itibaren zaman farkları tutularak tablo çok daha küçük bir alana sığdırılabilir. Günlük maksimum zaman farkı ne kadardır bilmiyorum ama max 4 dakika ise 1KB ın altına bile inmek mümkün görünüyor.

hocam hepsi değişiyor zaman aralıklarını kontrol ettim hiçbirisi kesin değil durum böyle olunca en uygun sıkıştırma bu oluyor.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

iyildirim

En baştaki zamanları biliyorsak, her vakit için bir byte kullanarak bir gün önceye +-128 dakikaya kadar zaman eklenerek bugüne ulaşılabilir, bu durumda her vakit için 2 değil bir byte tutmuş oluruz. Hatta iki vakti bir byte da tutmak, bit işlemleri de yapmak mümkün.. Nasıl olsa hesap için yeterli süre var.



X-Fi

evet programda vakitleri günde 1 sefer hesaplıyorum hesap zamanı 1sn ye kadar uzayabilir ancak söylemek istediğiniz sadeleştirme yolunu çözemedim

dün bugün yarin izmir ödemiş için ezan vakitleri

GÜN   İMSAK  GÜNEŞ   İŞRAK İSTİVA   ÖĞLE  İKİNDİ   ASR-I İSFİRAR  AKŞAM  YATSI

  18.   04:53  06:22   07:09  12:20   13:15  16:56   17:56  19:16   19:55  21:18
  19.   04:51  06:21   07:08  12:20   13:14  16:56   17:57  19:17   19:55  21:19
  20.   04:49  06:19   07:07  12:20   13:14  16:56   17:57  19:18   19:56  21:20

bana bunları sadeleştirebilirmisiniz?
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

iyildirim

Başlangıç verisi yani ilk gün zaman olarak tam tutulacak.. Devam eden günler de bir gün önceye göre zaman farkı olarak.. Bu durumda her vakit için bir byte da  +- 128 dakika girilebilir.

GÜN   İMSAK  GÜNEŞ   İŞRAK İSTİVA   ÖĞLE  İKİNDİ   ASR-I İSFİRAR  AKŞAM  YATSI               zaman farkları

  18.   04:53  06:22   07:09  12:20   13:15  16:56   17:56  19:16   19:55  21:18                  04:53  06:22   07:09  12:20   13:15  16:56   17:56  19:16   19:55  21:18
  19.   04:51  06:21   07:08  12:20   13:14  16:56   17:57  19:17   19:55  21:19                   -2        -2         -1         0          -1       0           +1       +1         0        +1
  20.   04:49  06:19   07:07  12:20   13:14  16:56   17:57  19:18   19:56  21:20                   -2        -2         -1         0           0       0              0      +1        +1       +1

gibi...

Sanırım günlük 5 vakit hesaplıyorsun. Yoksa her vakite 2 byte hesabından 3700 byte dan fazla tutardı. Bu şekilde her vakite bir byte harcayarak 1.8K civarında RAM yeterli olur.
Eğer her vakite 4 bit harcanırsa 1bit işarete 3 bit de sayıya kalır ve günlük zaman farkı limiti  8 dakika yapar. Bu da ancak vakitlerde max günlük 8dakika zaman farkı oluyorsa uygulanabilir..

X-Fi

şimdi anladım yılda 1 gün tam yazılsa gerisi + ve -

ama bunu txt den kullanıma hazır tablo haline nasıl hesaplatıp dönüştürebilirim onu düşüyorum.

bulursam yazarım.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

iyildirim

Basit bir programla yapılabilir. Orijinal tablo okunup datediff gibi bir komut kullanılarak hesaplar yapılabilir. Tabii biraz da string işlemi olacak.



iyildirim

VB6 ile bir şeyler karaladım.  Stop, debug vs kalmış olabilir.  Br forma bir buton yerleştirip, formun koduna tüm kodun yapıştırılması yeterli.  İslenecek dosyayı app.path ister.
Option Explicit

Dim sVakitler(366, 10)  As String
Dim lVakitler(366, 10)  As String

Private Function findCharBetween_X(Position As Long, sTmp As String, sChr1 As String, sChr2 As String, IncludePrefStr As Boolean, IncludePostStr As Boolean, Optional Count As Long) As String

   Dim i          As Long
   Dim j          As Long
   Dim k          As Long
   Dim sTmp1      As String
   
   Dim IncPref    As Integer
   Dim IncPost    As Integer
   
   If IncludePrefStr Then IncPref = 0 Else IncPref = Len(sChr1)
   If IncludePostStr Then IncPost = Len(sChr2) Else IncPost = 0
      
   findCharBetween_X = ""
   
   If Position > 0 Then
      i = Position + 1
   Else
      i = 1
   End If
   
   k = 0
   If Count = 0 Then k = -1
   
   Do
      i = InStr(i, sTmp, sChr1, vbTextCompare)
      If i Then
         j = InStr(i + Len(sChr1), sTmp, sChr2, vbTextCompare)
         If j Then
            k = k + 1
            If k = Count Then
               Position = i
               findCharBetween_X = Mid(sTmp, i + IncPref, j - i + IncPost - IncPref)
               Exit Do
            End If
            i = i + 1
         Else
            Exit Do
         End If
      Else
         Exit Do
      End If
   Loop
End Function



Private Sub Command1_Click()

Dim Max        As Long
Dim Min        As Long


Dim Pos        As Long

Dim Gun        As Long
Dim Vakit      As Long


Dim FSize      As Long

Dim sFile      As String
Dim sTmp       As String
Dim lTmp       As String
Dim sLine      As String


Dim sVakit     As String

Open App.Path & "\ALP_TR.txt" For Binary As #1


FSize = LOF(1)
sFile = String(FSize, 0)

Get #1, 1, sFile

Close #1

sTmp = sFile

sVakit = ""

Do
   sLine = findCharBetween_X(0, sTmp, "---", Chr(12), True, False)
   If sLine = "" Then Exit Do
   sTmp = Replace(sTmp, sLine, "")
   
   sVakit = sVakit & sLine
   Debug.Print sLine
Loop

sTmp = Replace(sVakit, "-", "")
sTmp = Replace(sTmp, vbCrLf, vbCr)
sTmp = Replace(sTmp, vbLf, vbCr)
sTmp = Replace(sTmp, vbCr & vbCr, vbCr)
sTmp = Replace(sTmp, "  ", " ")
sTmp = Replace(sTmp, "  ", " ")
sTmp = Replace(sTmp, "  ", " ")
sTmp = Replace(sTmp, "  ", " ")


Debug.Print sTmp



sTmp = sTmp & vbCr & " "

Min = 999999
Max = 0

Pos = 0
For Gun = 1 To 366

   sLine = Trim(findCharBetween_X(Pos, sTmp, vbCr, vbCr, False, True)) & " "
   If Trim(sLine) = "" Then Exit For
   Debug.Print sLine
   For Vakit = 1 To 10
      sVakit = Replace(Trim(findCharBetween_X(0, sLine, " ", " ", False, True, Vakit)), vbCr, "")
      sVakitler(Gun, Vakit) = Trim(sVakit)
      
      If Len(sVakit) > 5 Then Stop
      
'      Debug.Print Gun, Vakit, sVakit,
      If Gun > 1 Then
         lVakitler(Gun, Vakit) = DateDiff("n", sVakitler(Gun - 1, Vakit), sVakitler(Gun, Vakit))
         If Max < lVakitler(Gun, Vakit) Then Max = lVakitler(Gun, Vakit)
         If Min > lVakitler(Gun, Vakit) Then Min = lVakitler(Gun, Vakit)
'         Debug.Print sVakitler(Gun - 1, Vakit), sVakitler(Gun, Vakit), lVakitler(Gun, Vakit), Min, Max,
      End If
'      Debug.Print
   
   Next
Next


Open App.Path & "\_OUTPUT_40bit.TXT" For Output As #1

sTmp = sVakitler(1, 1) & " " & sVakitler(1, 5) & " " & sVakitler(1, 6) & " " & sVakitler(1, 9) & " " & sVakitler(1, 10)

Print #1, sTmp
Debug.Print sTmp

For Gun = 2 To 366
   sTmp = lVakitler(Gun, 1) & " " & lVakitler(Gun, 5) & " " & lVakitler(Gun, 6) & " " & lVakitler(Gun, 9) & " " & lVakitler(Gun, 10)
   Print #1, sTmp
   Debug.Print sTmp
Next

Close #1


Open App.Path & "\_OUTPUT_16bit.TXT" For Output As #1

sTmp = sVakitler(1, 1) & " " & sVakitler(1, 5) & " " & sVakitler(1, 6) & " " & sVakitler(1, 9) & " " & sVakitler(1, 10)

Print #1, sTmp
Debug.Print sTmp

' Max zaman farkı +-2 dakika ---> 16 bit integerda üç bit bir zaman için  -3 +4 değer aralığında
For Gun = 2 To 366
   sTmp = lVakitler(Gun, 1) & " " & lVakitler(Gun, 5) & " " & lVakitler(Gun, 6) & " " & lVakitler(Gun, 9) & " " & lVakitler(Gun, 10)
   If Trim(lVakitler(Gun, 1)) = "" Then Exit For
   lTmp = (lVakitler(Gun, 1) + 3) * 2 ^ 0 + _
          (lVakitler(Gun, 5) + 3) * 2 ^ 3 + _
          (lVakitler(Gun, 6) + 3) * 2 ^ 6 + _
          (lVakitler(Gun, 9) + 3) * 2 ^ 9 + _
          (lVakitler(Gun, 10) + 3) * 2 ^ 12
   Debug.Print lTmp, sTmp
          
   
   Print #1, lTmp
   Debug.Print sTmp
Next

Close #1

Stop

End Sub


X-Fi

#12
hocam ezan vakitleri arası için 128dk yetmiyor  sabah namazı haziranda 3:48 iken ocakta 6:52 arada 3 saat fark var 180dk eder ben orada takıldım umarım sizde öyle yapmamışsınızdır. böyle olunca 1 byte'a sığmıyor tek vakit.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

iyildirim

X-Fi Hocam,
Zaman farkı olarak  21 aralık ile 21 haziran farkına bakmıyoruz.. Bir gün öncesinin farkına bakıyoruz.  Bu farkta -2 ile +2 arasında.. 3 bite bile sığabiliyor.  hesabı kolay olsun diye -3=0 , 0=3, +4=7 olacak şeklinde yapmaya çalıştım. Eşitlikteki ilk sayılar zaman farkı, ikinci sayılar buna karşılık üretilen değer..

Yani 31 aralık için 5*365 kere toplama yapılmalı..

vb6 kullanıyormusun bilmiyorum..
Eğer yüklü ise kodu bir dene.. her vakite göre 1 byte ve güne iki byte olacak şekilde iki tablo oluşturmaya çalıştım.   giriş dosyası olarak , ilk mesajdaki alp-tr.txt' i kullanıyor.

06:52 13:22 15:48 18:09 19:33
0 0 1 1 0
0 1 1 1 1
0 0 1 1 1
0 1 1 0 1
0 0 0 1 1
1 0 1 1 0
0 1 1 1 1
0 0 1 1 1
0 1 1 1 1
0 0 1 1 1
0 1 1 1 1
-1 0 1 1 1
0 0 0 1 0


gibi yada
06:52 13:22 15:48 18:09 19:33
14619
18723
18715
18211
18651


gibi dosya oluşturuyor.

X-Fi

#14
Hocam yeni makro geldi link aşağıda. Söylediğiniz gibi 3 bitlik şifreledim oldu yine notpad de makro ile tablo oluşturdum tabi notpad in işlem yapma kabiliyeti olmadığı için işlemi derleyiciye yaptırıyorum elde etmek istediğim sonucu satırlara formül olarak yazdım tablonun görüntüsü biraz karışık dursada hitech ve C derleyicileri formülü çözüp 2byte değeri rom a yerleştiriyor. VB bilmediğim için böyle yapıyorum. (inş. birgün öğreneceğim)

Ben ilk referans alınacak üst vakitleri her ayın 1. günü olarak kabul ettim. DS13xx serisi rtc lerde yıllık gün sayacı yok, onun için ay günü tabloları gerekecekti. Bide 29 şubat olayı var bu yüzden hesaplamayı aylık yaptım. 16F 18F kullanıcıları içinde sıkıntı olabilir diye düşündüm.

Günlük ezan vakitleri 2 byte da tutuluyor tabloda const unsigned int olarak tanıtıldı 12x35x2=840 Byte ile 1 yıllık vakitleri artık saklayabiliyorum.


const unsigned int tablo_2011[12][35] = {


		/*  ŞEHİR		: Ödemiş / Türkiye

			PARALEL		: 38.22° KUZEY
			MERİDYEN	: 27.97° DOĞU
			SAAT FARKI	: +2.00
			TARİH		: Ocak 2011
			YAZ SAATİ	: Var

			KIBLE AÇISI	: 145.3°
			PUSULA SAPMASI	:   4.3°

                   İMSK ÖĞLE İKND AKŞM YATSI
			 --- ---- ---- ---- ----     */

             {
	     648,1318,1546,1806,1930,
             ((648)-(648)&7)|(((1319)-(1318)&7)<<3)|(((1546)-(1546)&7)<<6)|(((1807)-(1806)&7)<<9)|(((1930)-(1930)&7)<<12),
             ((649)-(648)&7)|(((1319)-(1319)&7)<<3)|(((1547)-(1546)&7)<<6)|(((1808)-(1807)&7)<<9)|(((1931)-(1930)&7)<<12),
             ((649)-(649)&7)|(((1320)-(1319)&7)<<3)|(((1548)-(1547)&7)<<6)|(((1809)-(1808)&7)<<9)|(((1932)-(1931)&7)<<12),
             ((649)-(649)&7)|(((1320)-(1320)&7)<<3)|(((1549)-(1548)&7)<<6)|(((1810)-(1809)&7)<<9)|(((1933)-(1932)&7)<<12),
             ((649)-(649)&7)|(((1321)-(1320)&7)<<3)|(((1550)-(1549)&7)<<6)|(((1811)-(1810)&7)<<9)|(((1934)-(1933)&7)<<12),
             .
             .
             .
            }, // ay sonu
}; // tablo sonu


Tablonun Kullanımı:
/*******************************************************************************/
/*********************************  Kullanımı  *************************************/
/*******************************************************************************/
volatile unsigned int vakit_buffer[5];


void vakit_oku(unsigned int yil,unsigned char ay,unsigned char ay_gun)
{
	unsigned int vakitler;
	unsigned char v,i,kont;

		vakit_buffer[0]=tablo_2011[ay-1][0];
		vakit_buffer[1]=tablo_2011[ay-1][1];
		vakit_buffer[2]=tablo_2011[ay-1][2];
		vakit_buffer[3]=tablo_2011[ay-1][3];
		vakit_buffer[4]=tablo_2011[ay-1][4];

		for(i=1;i<ay_gun;i++){

			switch (yil){
			case 2011:vakitler=tablo_2011[ay-1][i+4];break;
			case 2012:vakitler=tablo_2012[ay-1][i+4];break;
			case 2013:vakitler=tablo_2013[ay-1][i+4];break;
			case 2014:vakitler=tablo_2014[ay-1][i+4];break;
			case 2015:vakitler=tablo_2015[ay-1][i+4];break;
			case 2016:vakitler=tablo_2016[ay-1][i+4];break;
			case 2017:vakitler=tablo_2017[ay-1][i+4];break;
			case 2018:vakitler=tablo_2018[ay-1][i+4];break;
			case 2019:vakitler=tablo_2019[ay-1][i+4];break;
			case 2020:vakitler=tablo_2020[ay-1][i+4];break;
			default:vakitler=0;break;
			}

			for(v=0;v<5;v++){	
		
			kont=(unsigned char)(vakitler>>(3*v))&0x0007;
			if(kont){
			if(kont==1)vakit_buffer[v]+=1;
			if(kont==2)vakit_buffer[v]+=2;
			if(kont==3)vakit_buffer[v]+=3;
			if(kont==4)vakit_buffer[v]+=4;
			if(kont==5)vakit_buffer[v]-=3;   
			if(kont==6)vakit_buffer[v]-=2;
			if(kont==7)vakit_buffer[v]-=1;
			if((vakit_buffer[v]%100)>=97)
					      vakit_buffer[v]-=40;
			if((vakit_buffer[v]%100)>=60){
					      vakit_buffer[v]-=60;
					      vakit_buffer[v]+=100;
                      }	
                }
          }
     }
}


/*********************************************************************************/

// 20/nisan/2011 vakitlerini okur

vakit_oku(2011,4,20);  

//sonuçlar vakit_buffer dizisinde decimal olarak saklanır:

vakit_buffer[0];  /* sabah */
vakit_buffer[1];  /*  ogle */
vakit_buffer[2];  /* ikindi*/
vakit_buffer[3];  /* Aksam */
vakit_buffer[4];  /* Yatsı */

//örnek;

sprintf(ekran,"Sabah: %02d:%02d",vakit_buffer[0]/100,vakit_buffer[0]%100);

lcd_yaz(ekran);

//veya

ks0108_text(10,10,ekran,1,1);


/*********************************************************************************/



Makro_V2 link:
http://www.fileserve.com/file/m7YmZja

http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)