/*
* =====================================================================================
*
*       Filename:  physical.c
*
*    Description:	<<半导体物理>>公式计算工具(linux版)
*
*        Version:  1.0
*        Created:  02/04/2013 04:30:28 PM
*        Revision:  none
*        Compiler:  gcc
*
*        Author:	Luinlong
*        Organization:  CUMT
*
* === ==================================================================================
*/
#include<gtk/gtk.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
static	GtkWidget *entry1;
static 	GtkWidget *entry2;
static	GtkWidget *entry3;
static	GtkWidget *entry4;
static	GtkWidget *entry5;
static	GtkWidget *entry6;
static	GtkWidget *entry7;
static	gchar *Si = "硅(Si)";
static	gchar *Ge = "锗(Ge)";
static  gchar *GaAs = "砷化镓(GaAs)";
gint j;
gfloat u1,u2;
gint count=0;
gfloat ni;
gboolean first=TRUE;
gboolean have_dot=FALSE;
gboolean have_result=FALSE;
gfloat nn1=0;
gfloat nn2=0;
gfloat nn3=0;
gfloat nn4=0;
gfloat nn5=0;
gchar number1[100];
gchar number2[100];
gchar number3[100];
gchar number4[100];
gchar number5[100];
gchar number6[100];
gchar number7[100];

show_message(gchar *message)
{
    GtkWidget *dialog;
    GtkMessageType type;
    type = GTK_MESSAGE_ERROR;
    dialog=gtk_message_dialog_new(NULL,GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, type, GTK_BUTTONS_OK, message);
    gtk_dialog_run(GTK_DIALOG(dialog));
    gtk_widget_destroy(dialog);
}

/* 定义销毁窗口函数 */
void CloseApp(GtkWidget *widget,GdkEvent *event,gpointer data)
{
    gtk_main_quit();
}

void clear_all()
{
    gint i;
    gtk_entry_set_text(GTK_ENTRY(entry1),"");
    gtk_entry_set_text(GTK_ENTRY(entry2),"");
    gtk_entry_set_text(GTK_ENTRY(entry3),"");
    gtk_entry_set_text(GTK_ENTRY(entry4),"");
    gtk_entry_set_text(GTK_ENTRY(entry5),"");
    gtk_entry_set_text(GTK_ENTRY(entry6),"");
    gtk_entry_set_text(GTK_ENTRY(entry7),"");
    count=0;
    first=TRUE;
    have_result=FALSE;
    for(i=0; i<100; i++)
    {
        number1[i]='\0';
        number2[i]='\0';
        number3[i]='\0';
        number4[i]='\0';
        number5[i]='\0';
        number6[i]='\0';
        number7[i]='\0';
        number1[i]='\0';
        number2[i]='\0';
    }
}

void on_num_clicked(GtkWidget *button,gpointer data)
{
    const gchar *num1,*num2,*num3,*num4;
    gchar nu1[100];
    gchar nu2[100];
    gchar nu3[100];
    gchar *result1;
    gchar *result2;
    gchar *result3;
    gfloat n0,p0,Nd,Na,nii;
    gfloat u1,u2;
    gfloat q = 1.602*(1/pow(10,19));
    if(have_result) {
        clear_all();
    }
    if(count==20) return;
    count++;
    num1 = gtk_entry_get_text(GTK_ENTRY(entry1));//取数
    num2 = gtk_entry_get_text(GTK_ENTRY(entry2));
    num3 = gtk_entry_get_text(GTK_ENTRY(entry3));
    num4 = gtk_entry_get_text(GTK_ENTRY(entry4));
    g_stpcpy(number1,num1);//将字符串进行拷贝
    g_stpcpy(number2,num2);
    g_stpcpy(number3,num3);
    g_stpcpy(number4,num4);
    nn1=strtof(number1,NULL); //将字符串转换为浮点数
    nn2=strtof(number2,NULL);
    nn3=strtof(number3,NULL);
    nn4=strtof(number4,NULL);

    if(j!=0)
    {
        if(j==1)
        {
            ni=7.8*pow(10,9);
            u1=1450;
            u2=500;
        }
        if(j==2)
        {
            ni=1.7*pow(10,13);
            u1=3800;
            u2=1800;
        }
        if (j==3)
        {
            ni=2.3*pow(10,6);
            u1=8000;
            u2=400;
        }

        if(nn1>nn2>0)
        {
            Nd = nn1;
            Na = nn2;
            n0=((Nd-Na)+(sqrt((Nd-Na)*(Nd-Na)+4*ni*ni)))/2;
            p0=(ni*ni)/n0;
            result1 = g_ascii_dtostr(nu1,100,n0);
            result2 = g_ascii_dtostr(nu2,100,p0);
            result3 = g_ascii_dtostr(nu3,100,ni);
            gtk_entry_set_text(GTK_ENTRY(entry6),result1);
            gtk_entry_set_text(GTK_ENTRY(entry7),result2);
            gtk_entry_set_text(GTK_ENTRY(entry5),result3);
        }
        if (0<nn1<nn2)
        {
            Nd = nn1;
            Na = nn2;
            p0=((Na-Nd)+(sqrt((Na-Nd)*(Na-Nd)+4*ni*ni)))/2;
            n0=(ni*ni)/n0;
            result1 = g_ascii_dtostr(nu1,100,p0);
            result2 = g_ascii_dtostr(nu2,100,n0);
            result3 = g_ascii_dtostr(nu3,100,ni);
            gtk_entry_set_text(GTK_ENTRY(entry6),result1);
            gtk_entry_set_text(GTK_ENTRY(entry7),result2);
            gtk_entry_set_text(GTK_ENTRY(entry5),result3);
        }
        if (nn3>0)
        {
            nii=(1/(nn3*(u1+u2)*q));
            p0=nii;
            n0=nii;
            result1 = g_ascii_dtostr(nu1,100,p0);
            result2 = g_ascii_dtostr(nu2,100,n0);
            result3 = g_ascii_dtostr(nu3,100,nii);
            gtk_entry_set_text(GTK_ENTRY(entry6),result1);
            gtk_entry_set_text(GTK_ENTRY(entry7),result2);
            gtk_entry_set_text(GTK_ENTRY(entry5),result3);
        }
        if(nn4>0 && nn3>0)
        {
            nii=(1/(nn3*(u1+u2)*q));
            if(Na/nii>=100)
            {
                p0=Na;
                n0=(nii*nii)/p0;
            }
            else
            {
                n0=Na;
                p0=(nii*nii)/n0;
            }
        }
        have_result = TRUE;
    }
    else
    {
        show_message("请选择一种半导体材料！");
    }
}

void radio_clicked(GtkWidget *radio, gint data)
{
    switch((int)data)
    {
    case 1:
        j=1;
        break;
    case 2:
        j=2;
        break;
    case 3:
        j=3;
        break;
    }
}


/* 主函数 */
int main(int argc, char *argv[])
{
    GtkWidget *window;
    GtkWidget *frame;
    GtkWidget *frame1;
    GtkWidget *asframe;
    GtkWidget *image;
    GSList *group;
    GtkWidget *label;
    GtkWidget *label1;
    GtkWidget *label2;
    GtkWidget *label3;
    GtkWidget *label4;
    GtkWidget *label5;
    GtkWidget *label6;
    GtkWidget *label7;
    GtkWidget *panel;
    GtkWidget *panel1;
    GtkWidget *vbox;
    GtkWidget *vbox1;
    GtkWidget *vbox2;
    GtkWidget *entrybox;
    GtkWidget *box1;
    GtkWidget *box2;
    GtkWidget *box3;
    GtkWidget *box4;
    GtkWidget *box5;
    GtkWidget *box6;
    GtkWidget *box7;
    GtkWidget *box8;
    GtkWidget *box9;
    GtkWidget *button1;
    GtkWidget *button2;
    GtkWidget *radio1;
    GtkWidget *radio2;
    GtkWidget *radio3;
    GtkWidget *table;
    GtkWidget *sep;
    gtk_init(&argc, &argv);
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window),"\t\t\t\t\t\t<<半导体物理>>公式计算工具(中国矿业大学 卢金龙)\t\t\t");  /* 设置标题 */
    gtk_window_set_default_size(GTK_WINDOW(window),700,520);
    gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
    gtk_window_set_policy(GTK_WINDOW(window), FALSE, FALSE, TRUE);
    gtk_container_set_border_width(GTK_CONTAINER(window),10);
    g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(CloseApp),NULL);

    /* 创建并添加面板 */
    panel = gtk_hpaned_new();
    gtk_container_add(GTK_CONTAINER(window),panel);
    gtk_widget_show(panel);

    /*
     * ========================================
     *            第一块面板设置
     * ========================================
     *
     */
    vbox=gtk_vbox_new(FALSE,0);
    gtk_container_add(GTK_CONTAINER(panel),vbox);

    /* 定义并创建FRAME选项，并作为物质简介 */
    asframe = gtk_aspect_frame_new("各物质简介:",0.5,2,1,TRUE);
    gtk_box_pack_start(GTK_BOX(vbox),asframe,FALSE,FALSE,5);
    gtk_frame_set_shadow_type(GTK_FRAME(asframe),GTK_SHADOW_OUT);
    label = gtk_label_new("硅(Si):相对原子量28.08653,第三周期IVA族,密度2.4g/cm3,溶点1414℃ ,沸点2355℃ \n正四面体结构,不溶于硝酸和盐酸,溶于氢氟酸和碱液,在地壳中含量仅次于氧居于第\n二,约含27.6%,主要以二氧化硅和硅酸盐形式存在,结晶硅为暗黑蓝色,化学性质稳定。\n---------------------------------------------------------------------------------------------------------------------------------------\n锗(Ge):相对原子量72.64,密度5.35g/cm3,溶点938.25℃ ,沸点2833℃ ,一种稀有银白\n色固体金属,不溶于盐酸和稀苛性碱溶液,溶于王水和浓硝酸或硫酸,在空气中不被氧\n化,其细粉可在氯或溴中燃烧。\n---------------------------------------------------------------------------------------------------------------------------------------\n砷化钾(GaAs):黑灰色固体,溶点1238℃ ,在600℃ 以下,能在空气中稳定存在,电子迁\n移率高,介电常数小,能引入深能级杂质。      " );
    gtk_container_add(GTK_CONTAINER(asframe),label);
    /*添加图像表*/
    frame=gtk_frame_new(NULL);
    gtk_box_pack_start(GTK_BOX(vbox),frame,FALSE,FALSE,5);
    image = gtk_image_new_from_file("physical.png");
    gtk_frame_set_label_widget(GTK_FRAME(frame),image);

    frame = gtk_frame_new("**使用指南**");
    gtk_box_pack_start(GTK_BOX(vbox),frame,FALSE,FALSE,5);
    gtk_frame_set_shadow_type(GTK_FRAME(frame),GTK_SHADOW_OUT);
    gtk_frame_set_label_align(GTK_FRAME(frame),0.5,0);
    label=gtk_label_new("1.从硅,锗,砷化镓三种半导体中任选一种需要计算的材料(注意:默认材料非Si).\n2.将已知量按照数学方式输入\"输入框\"中,例如:123456789,无内容不输入任何值.\n3.确定输入正确参数后,单击\"确定\",便会输出计算结果,每次计算前,请单击\"清除\".\n\t\t\t*第一部分:知半导体施主受主浓度,计算空穴和电子浓度*\n\t\t\t*第二部分:知电阻率和掺杂浓度,求本征下空穴和电子浓度*");
    gtk_container_add(GTK_CONTAINER(frame),label);

    /*
     * ========================================
     *  		 第二块面板设置
     * ========================================
     */
    panel1=gtk_vpaned_new();
    gtk_paned_add2(GTK_PANED(panel),panel1);
    vbox1 = gtk_vbox_new(FALSE,0);
    gtk_container_add(GTK_CONTAINER(panel1),vbox1);
    frame1 = gtk_frame_new("请选择一种材料:");
    gtk_frame_set_shadow_type(GTK_FRAME(frame1),GTK_SHADOW_ETCHED_OUT);
    gtk_box_pack_start(GTK_BOX(vbox1),frame1,FALSE,FALSE,5);
    box9=gtk_hbox_new(FALSE,5);
    gtk_container_add(GTK_CONTAINER(frame1),box9);

    radio1=gtk_radio_button_new_with_label(NULL,Si);
    g_signal_connect(G_OBJECT(radio1),"released",
                     G_CALLBACK(radio_clicked),(gpointer)1);
    gtk_box_pack_start(GTK_BOX(box9),radio1,FALSE,FALSE,5);

    group=gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio1));
    radio2=gtk_radio_button_new_with_label(group,Ge);
    g_signal_connect(G_OBJECT(radio2),"released",
                     G_CALLBACK(radio_clicked),(gpointer)2);
    gtk_box_pack_start(GTK_BOX(box9),radio2,FALSE,FALSE,5);

    group=gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio2));
    radio3=gtk_radio_button_new_with_label(group,GaAs);
    g_signal_connect(G_OBJECT(radio3),"released",
                     G_CALLBACK(radio_clicked),(gpointer)3);
    gtk_box_pack_start(GTK_BOX(box9),radio3,FALSE,FALSE,5);


    label = gtk_label_new("已知施主受主浓度求多子少子浓度");
    gtk_box_pack_start(GTK_BOX(vbox1),label,FALSE,FALSE,5);

    box1 = gtk_hbox_new(FALSE,0);
    gtk_box_pack_start(GTK_BOX(vbox1),box1,FALSE,FALSE,10);
    box2 = gtk_hbox_new(FALSE,0);
    gtk_box_pack_start(GTK_BOX(vbox1),box2,FALSE,FALSE,10);

    sep=gtk_hseparator_new();
    gtk_box_pack_start(GTK_BOX(vbox1),sep,FALSE,FALSE,5);

    label = gtk_label_new("已知电阻率及掺杂浓度求多子少子");
    gtk_box_pack_start(GTK_BOX(vbox1),label,FALSE,FALSE,5);

    box3 = gtk_hbox_new(FALSE,0);
    gtk_box_pack_start(GTK_BOX(vbox1),box3,FALSE,FALSE,10);
    box4 = gtk_hbox_new(FALSE,0);
    gtk_box_pack_start(GTK_BOX(vbox1),box4,FALSE,FALSE,10);

    label1 = gtk_label_new("半导体施主浓度(Nd)：");
    entry1 = gtk_entry_new();
    gtk_box_pack_start(GTK_BOX(box1),label1,FALSE,FALSE,10);
    gtk_box_pack_start(GTK_BOX(box1),entry1,FALSE,FALSE,5);

    label2 = gtk_label_new("半导体受主浓度(Na)：");
    entry2 = gtk_entry_new();
    gtk_box_pack_start(GTK_BOX(box2),label2,FALSE,FALSE,10);
    gtk_box_pack_start(GTK_BOX(box2),entry2,FALSE,FALSE,5);

    sep=gtk_hseparator_new();
    gtk_box_pack_start(GTK_BOX(vbox1),sep,FALSE,FALSE,5);

    label3 = gtk_label_new("300k本征样品电阻率(欧姆.cm)：");
    entry3 = gtk_entry_new();
    gtk_box_pack_start(GTK_BOX(box3),label3,FALSE,FALSE,10);
    gtk_box_pack_start(GTK_BOX(box3),entry3,FALSE,FALSE,5);

    label4 = gtk_label_new("300k本征样品掺杂浓度(cm-3)：  ");
    entry4 = gtk_entry_new();
    gtk_box_pack_start(GTK_BOX(box4),label4,FALSE,FALSE,10);
    gtk_box_pack_start(GTK_BOX(box4),entry4,FALSE,FALSE,5);


    /*
    * ========================================
    *          第三块面板设置
    * ========================================
    *
    */

    label = gtk_label_new("计算结果:");
    gtk_box_pack_start(GTK_BOX(vbox1),label,FALSE,FALSE,5);

    box6 = gtk_hbox_new(FALSE,0);
    gtk_box_pack_start(GTK_BOX(vbox1),box6,FALSE,FALSE,10);
    label6 = gtk_label_new("该半导体多子浓度:");
    gtk_box_pack_start(GTK_BOX(box6),label6,FALSE,FALSE,10);
    entry6 = gtk_entry_new();
    gtk_widget_set_direction(entry6,GTK_TEXT_DIR_RTL);
    gtk_box_pack_start(GTK_BOX(box6),entry6,FALSE,FALSE,10);

    box7 = gtk_hbox_new(FALSE,0);
    gtk_box_pack_start(GTK_BOX(vbox1),box7,FALSE,FALSE,10);
    label7 = gtk_label_new("该半导体少子浓度:");
    gtk_box_pack_start(GTK_BOX(box7),label7,FALSE,FALSE,10);
    entry7 = gtk_entry_new();
    gtk_widget_set_direction(entry7,GTK_TEXT_DIR_RTL);
    gtk_box_pack_start(GTK_BOX(box7),entry7,FALSE,FALSE,10);

    box5 = gtk_hbox_new(FALSE,0);
    gtk_box_pack_start(GTK_BOX(vbox1),box5,FALSE,FALSE,10);
    label5 = gtk_label_new("该半导体的ni值为:");
    gtk_box_pack_start(GTK_BOX(box5),label5,FALSE,FALSE,10);
    entry5 = gtk_entry_new();
    gtk_widget_set_direction(entry5,GTK_TEXT_DIR_RTL);
    gtk_box_pack_start(GTK_BOX(box5),entry5,FALSE,FALSE,10);

    box8 = gtk_hbox_new(TRUE,0);
    gtk_box_pack_start(GTK_BOX(vbox1),box8,FALSE,FALSE,5);
    table=gtk_table_new(1,9,TRUE);
    gtk_container_add(GTK_CONTAINER(box8),table);
    button1 = gtk_button_new_with_label("清零");
    button2 = gtk_button_new_with_label("确定");
    gtk_table_attach_defaults(GTK_TABLE(table),button1,1,4,0,1);
    gtk_table_attach_defaults(GTK_TABLE(table),button2,5,8,0,1);
    g_signal_connect(G_OBJECT(button2),"clicked",
                     G_CALLBACK(on_num_clicked),NULL);
    g_signal_connect(G_OBJECT(button1),"clicked",
                     G_CALLBACK(clear_all),NULL);

    gtk_widget_show_all(window);
    gtk_main();
    return FALSE;
}
