// Programma c_u_hea (ArcTools)
// Latella Maria Veronica - Luglio 2005

#define USE_TI89              // Compilo per TI-89

#define OPTIMIZE_ROM_CALLS    // Uso chiamate-ROM Ottimizzate

#define MIN_AMS 100           // Compilo per AMS 1.00 o maggiore.

#define SAVE_SCREEN           // Salva/Ripristina stato LCD.

#include <tigcclib.h>         // Includo tutti gli Header-Files

// Tracciare una linea da (x1,y1) a (x2,y2).
// Occhio che lo (0,0) è nell'angolo in alto a sinistra.
// Asse X va a destra, Asse Y va in giù.
// Risoluzione dello schermo: 160x100 ovvero 8/5.
void DrawLineFast(short x1, short y1, short x2, short y2)
{
  short x = x1, y = y1;
  short dx = abs (x2 - x1), dy = abs (y2 - y1);
  short ystep = (y1 < y2) ? 1 : -1, pystep = 30 * ystep;
  short mov = dx ? 0 : -1;
  unsigned char *ptr = (char*)LCD_MEM + 30 * y + (x >> 3);
  short mask = 1 << (~x & 7);
  if (x1 < x2)
    while (x != x2 || y != y2)
      {
        *ptr |= mask;
        if (mov < 0) y += ystep, ptr += pystep, mov += dx;
        else
          {
            mov -= dy;
            if (++x & 7) mask >>= 1;
            else ptr++, mask = 0x80;
          }
      }
  else
    while (x != x2 || y != y2)
      {
        *ptr |= mask;
        if (mov < 0) y += ystep, ptr += pystep, mov += dx;
        else
          {
            mov -= dy;
            if (x-- & 7) mask <<= 1;
            else ptr--, mask = 1;
          }
      }
}

void Errore()
{
ClrScr ();
clrscr();
DrawLineFast (38, 38, 122, 38); //Linea sopra
DrawLineFast (38, 60, 123, 60); //Linea sotto
DrawStr(53,42,"Errore!!!",A_NORMAL);
DrawStr(41,50,"Scelta Errata",A_NORMAL); //8 punti sotto...
DrawLineFast (38, 38, 38, 60); //Linea sx
DrawLineFast (122, 38, 122, 60); //Linea dx
}


// Main Function
void _main(void)
{
//Variabili di sistema e assegnazioni
//Risoluzione dello schermo: 160x100 ovvero 8/5.
int ips = 0; //Ordinata (ipsilon) per tracciare la rete iniziale.
int ics = 0; //Ascissa (ics) per tracciare la rete iniziale.
int ind_i = 0; //indice I della matrice 1
int risp = 1; //SI
int sce = 0; //scelta iniziale
float jump = 15.0; //numero di linee
float stepx, stepy; //spazi fra linee
int incremento; //incremento cicli linee
float matriceb[24][4]; //Matrice B
int pix = 0;

ClrScr (); //Pulizia dello schermo grafico
clrscr(); //Pulizia dello schermo di testo

//Assegnazione Valori della Matrice A:

matriceb [0][0] = 16.7;
matriceb [0][1] = 2120.0;
matriceb [0][2] = 3.49;
matriceb [0][3] = 73.0;
matriceb [1][0] = 19.9;
matriceb [1][1] = 2530.0;
matriceb [1][2] = 6.06;
matriceb [1][3] = 106.0;
matriceb [2][0] = 24.7;
matriceb [2][1] = 3140.0;
matriceb [2][2] = 10.3;
matriceb [2][3] = 155.0;
matriceb [3][0] = 30.4;
matriceb [3][1] = 3880.0;
matriceb [3][2] = 16.7;
matriceb [3][3] = 220.0;
matriceb [4][0] = 35.5;
matriceb [4][1] = 4530.0;
matriceb [4][2] = 25.1;
matriceb [4][3] = 294.0;
matriceb [5][0] = 42.3;
matriceb [5][1] = 5380.0;
matriceb [5][2] = 36.9;
matriceb [5][3] = 389.0;
matriceb [6][0] = 50.5;
matriceb [6][1] = 6430.0;
matriceb [6][2] = 54.1;
matriceb [6][3] = 515.0;
matriceb [7][0] = 60.3;
matriceb [7][1] = 7680.0;
matriceb [7][2] = 77.6;
matriceb [7][3] = 675.0;
matriceb [8][0] = 68.2;
matriceb [8][1] = 8680.0;
matriceb [8][2] = 104.5;
matriceb [8][3] = 836.0;
matriceb [9][0] = 76.4;
matriceb [9][1] = 9730.0;
matriceb [9][2] = 136.7;
matriceb [9][3] = 1010.0;
matriceb [10][0] = 88.3;
matriceb [10][1] = 11300.0;
matriceb [10][2] = 182.6;
matriceb [10][3] = 1260.0;
matriceb [11][0] = 97.6;
matriceb [11][1] = 12400.0;
matriceb [11][2] = 229.3;
matriceb [11][3] = 1480.0;
matriceb [12][0] = 105.0;
matriceb [12][1] = 13300.0;
matriceb [12][2] = 276.9;
matriceb [12][3] = 1680.0;
matriceb [13][0] = 112.0;
matriceb [13][1] = 14300.0;
matriceb [13][2] = 330.9;
matriceb [13][3] = 1890.0;
matriceb [14][0] = 125.0;
matriceb [14][1] = 15900.0;
matriceb [14][2] = 450.7;
matriceb [14][3] = 2310.0;
matriceb [15][0] = 140.0;
matriceb [15][1] = 17800.0;
matriceb [15][2] = 637.2;
matriceb [15][3] = 2900.0;
matriceb [16][0] = 155.0;
matriceb [16][1] = 19800.0;
matriceb [16][2] = 869.7;
matriceb [16][3] = 3550.0;
matriceb [17][0] = 166.0;
matriceb [17][1] = 21200.0;
matriceb [17][2] = 1119.0;
matriceb [17][3] = 4150.0;
matriceb [18][0] = 178.0;
matriceb [18][1] = 22600.0;
matriceb [18][2] = 1412.0;
matriceb [18][3] = 4790.0;
matriceb [19][0] = 190.0;
matriceb [19][1] = 24200.0;
matriceb [19][2] = 1752.0;
matriceb [19][3] = 5470.0;
matriceb [20][0] = 204.0;
matriceb [20][1] = 26000.0;
matriceb [20][2] = 2153.0;
matriceb [20][3] = 6240.0;
matriceb [21][0] = 224.0;
matriceb [21][1] = 28600.0;
matriceb [21][2] = 3034.0;
matriceb [21][3] = 7680.0;
matriceb [22][0] = 252.0;
matriceb [22][1] = 32100.0;
matriceb [22][2] = 4221.0;
matriceb [22][3] = 9480.0;
matriceb [23][0] = 272.0;
matriceb [23][1] = 34700.0;
matriceb [23][2] = 5538.0;
matriceb [23][3] = 11190.0;

//Maschera di Avvio
//Traccia una rete nell'angolo in alto a sinistra
//e la scritta "Arc Tools" nel centro dello schermo.
stepx = 160 / jump;
stepy = 100 / jump;
incremento = 0;
while (incremento != (jump + 1))
 {
 ics = stepx * incremento;
 ips = 100 - (stepy * incremento);
 DrawLineFast (ics, 0, 0, ips);
 incremento ++; 
 }
//Inserisco scritta Programma
//Inserisco scritta Programma
// nella zona con 125<x<160 0<y<100 o 30<y<95.
// c_ca_NN alta 7*8=56 pixels -> parte da y=22 con incrementi di 8.
// c_ca_NN alta 7*8=56 pixels -> parte da y=35 con incrementi di 8
// Larghezza 6 -> x=135 costante!
DrawLineFast (138, 21, 138, 83); //Linea sx
DrawLineFast (138, 21, 148, 21); //Linea sopra
DrawStr(140,24,"C",A_NORMAL);
//DrawStr(140,43,"*",A_NORMAL);
DrawStr(140,40,"U",A_NORMAL);
//DrawStr(140,67,"*",A_NORMAL);
DrawStr(140,56,"H",A_NORMAL);
DrawStr(140,64,"E",A_NORMAL);
DrawStr(140,72,"A",A_NORMAL);
DrawLineFast (138, 83, 148, 83); //Linea sotto
DrawLineFast (148, 21, 148, 83); //Linea dx

//Inserisco scritta Autore
DrawStr(53,40,"Cartesio",A_NORMAL);
DrawStr(35,60,"Ing&Arch TI-89",A_NORMAL);
  
//Attendo pressione di un tasto per riprendere l'esecuzione  
ngetchx ();
ClrScr ();
clrscr();
 
//--- Cuore del Programma ---
//Su una riga ci stanno solo 26 caratteri!!!
while (risp ==1)
{
sce = 0;
while (sce != 1 && sce != 2 && sce != 3 && sce != 4 && sce != 5 && sce != 6 && sce != 7 && sce != 8 && sce != 9 && sce != 10 && sce != 11 && sce != 12 && sce != 13 && sce != 14 && sce != 15 && sce != 16 && sce != 17&& sce != 18 && sce != 19 && sce != 20 && sce != 21 && sce != 22 && sce != 23 && sce != 24)
{
ClrScr ();
clrscr();
printf("       PROFILI HEA\n");
printf("       -----------\n");
// Acquisizione dei dati necessari alla elaborazione.
printf("Tipologia HEA:\n");
printf("1)100 2)120 3)140 4)160\n");
printf("5)180 6)200 7)220 8)240\n");
printf("9)260 10)280 11)300 12)320\n");
printf("13)340 14)360 15)400\n");
printf("16)450 17)500 18)550\n");
printf("19)600 20)650 21)700\n");
printf("22)800 23)900 24)1000\n");
printf("Scelta: ");
scanf("%d", &sce);
// Controllo correttezza dell'input:
if (sce != 1 && sce != 2 && sce != 3 && sce != 4 && sce != 5 && sce != 6 && sce != 7 && sce != 8 && sce != 9 && sce != 10 && sce != 11 && sce != 12 && sce != 13 && sce != 14 && sce != 15 && sce != 16 && sce != 17 && sce != 18 && sce != 19 && sce != 20 && sce != 21 && sce != 22 && sce != 23 && sce != 24)
{
Errore();
ngetchx ();
}
}

	ClrScr ();
	clrscr();
	ind_i = sce - 1;
	printf ("\n");
	printf ("-)Peso unitario:");
	printf ("%f daN/m\n",matriceb[ind_i][0]);
	printf ("-)Superficie sezione:\n");
	printf ("  %f mm%c\n",matriceb[ind_i][1],178);
	printf ("-)Momento d'inerzia I:\n");
	printf ("  %f*10%c6 mm%c4\n",matriceb[ind_i][2],94,94);
	printf ("-)Modulo di resistenza W:\n");
	printf ("  %f*10%c mm%c\n",matriceb[ind_i][3],179,179);

printf("\n");
printf ("Vuoi ripetere?(SI=1,NO=0)\n");
scanf("%d", &risp);
}// Chiude il while della risposta
} //chiude programma
