#include <mach/mach.h>
#include <mach/thread_switch.h>
#include <sys/file.h>
#include <sys/stat.h>
#include <math.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char * argv[])
{
char * endstr;
boolean_t needInterlace = FALSE;
int hPixels = 1376, vLines = 774;
float vFrameRateRqd = 60.0;
int charSize = 1;
int vSyncRqd = 3;
float hSyncPct = 8.0/100.0; float minVSyncBP = 550e-6; int minPorchRnd = 1;
float m = 600; float c = 40; float k = 128;
float j = 20;
float cPrime = ((c - j) * k / 256) + j;
float mPrime = k / 256 * m;
hPixels = strtol(argv[1], 0, 0);
vLines = strtol(argv[2], 0, 0);
vFrameRateRqd = strtol(argv[3], &endstr, 0);
needInterlace = (endstr[0] == 'i') || (endstr[0] == 'I');
float vFieldRateRqd;
float interlace = needInterlace ? 0.5 : 0.0;
float interlaceFactor = needInterlace ? 2.0 : 1.0;
vFieldRateRqd = vFrameRateRqd * interlaceFactor;
int hPixelsRnd = roundf(hPixels / charSize) * charSize;
int vLinesRnd = roundf( vLines / interlaceFactor );
int topMargin = 0;
int bottomMargin = 0;
float hPeriodEst = ((1 / vFieldRateRqd) - (minVSyncBP))
/ (vLinesRnd + (2 * topMargin) + minPorchRnd + interlace);
int vSyncBP = roundf( minVSyncBP / hPeriodEst );
float totalVLines = vLinesRnd + topMargin + bottomMargin + vSyncBP + interlace + minPorchRnd;
float vFieldRateEst = 1 / hPeriodEst / totalVLines;
float hPeriod = hPeriodEst / (vFieldRateRqd / vFieldRateEst);
printf("hPeriod %.9f us, ", hPeriod*1e6);
printf("hFreq %.9f kHz\n", 1/hPeriod/1e3);
int leftMargin = 0;
int rightMargin = 0;
int totalActivePixels = hPixelsRnd + leftMargin + rightMargin;
float idealDutyCycle = cPrime - (mPrime * hPeriod * 1e6 / 1000.0);
int hBlankPixels = roundf((totalActivePixels * idealDutyCycle / (100.0 - idealDutyCycle) / (2 * charSize))) * 2 * charSize;
int totalPixels = totalActivePixels + hBlankPixels;
float pixelFreq = totalPixels / hPeriod;
printf("pixFreq %.9f Mhz\n", pixelFreq/1e6);
int totalLines = interlaceFactor * (vLinesRnd + topMargin + bottomMargin + vSyncBP + interlace + minPorchRnd);
int hSyncPixels = roundf( hSyncPct * totalPixels / charSize) * charSize;
int hFPPixels = (hBlankPixels / 2) - hSyncPixels;
float vOddBlankingLines = vSyncBP + minPorchRnd;
float vEvenBlankingLines = vSyncBP + 2*interlace + minPorchRnd;
float vOddFPLines = minPorchRnd + interlace;
printf("hTotal %d(%d), hFP %d(%d), hBlank %d(%d), hSync %d(%d)\n", totalPixels/8, totalPixels,
hFPPixels/8, hFPPixels, hBlankPixels/8, hBlankPixels, hSyncPixels/8, hSyncPixels);
printf("vTotal %d, vFP %.1f(E:%.1f), vBlank %.1f(E:%.1f), vSync %d\n",
totalLines, vOddFPLines, (float) minPorchRnd, vOddBlankingLines, vEvenBlankingLines, vSyncRqd);
return(0);
}